Skip to content

Commit f05db07

Browse files
feat: allow just setting mode
1 parent cdeb2e3 commit f05db07

File tree

1 file changed

+176
-145
lines changed

1 file changed

+176
-145
lines changed

ios/VolumeManager.m

Lines changed: 176 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -238,60 +238,54 @@ - (void)observeValueForKeyPath:(NSString *)keyPath
238238
RCT_EXPORT_METHOD(activateAudioSession:(BOOL)restorePreviousSessionOnDeactivation
239239
async:(BOOL)async) {
240240

241-
AVAudioSessionSetActiveOptions options = 0;
242-
if (restorePreviousSessionOnDeactivation) {
243-
options = AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation;
244-
}
241+
AVAudioSessionSetActiveOptions options = 0;
242+
if (restorePreviousSessionOnDeactivation) {
243+
options |= AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation;
244+
}
245245

246-
if (async) {
247-
dispatch_async(
248-
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
249-
AVAudioSession *session = [AVAudioSession sharedInstance];
250-
NSError *error = nil;
251-
[session setActive:YES
252-
withOptions:options
253-
error:&error];
254-
if (error) {
255-
NSLog(@"Error activating audio session: %@", error.localizedDescription);
256-
}
257-
});
258-
} else {
259-
AVAudioSession *session = [AVAudioSession sharedInstance];
260-
NSError *error = nil;
261-
[session setActive:YES
262-
withOptions:options
263-
error:&error];
264-
if (error) {
265-
NSLog(@"Error activating audio session: %@", error.localizedDescription);
246+
void (^activateBlock)(void) = ^{
247+
AVAudioSession *session = [AVAudioSession sharedInstance];
248+
NSError *error = nil;
249+
[session setActive:YES
250+
withOptions:options
251+
error:&error];
252+
if (error) {
253+
NSLog(@"Error activating audio session: %@", error.localizedDescription);
254+
}
255+
};
256+
257+
if (async) {
258+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), activateBlock);
259+
} else {
260+
activateBlock();
266261
}
267-
}
268262
}
269263

270-
RCT_EXPORT_METHOD(deactivateAudioSession:(BOOL)async) {
271-
if (async) {
272-
dispatch_async(
273-
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
274-
AVAudioSession *session = [AVAudioSession sharedInstance];
275-
NSError *error = nil;
276-
[session setActive:NO
277-
withOptions:0
278-
error:&error];
279-
if (error) {
280-
NSLog(@"Error deactivating audio session: %@", error.localizedDescription);
281-
}
282-
});
283-
} else {
284-
AVAudioSession *session = [AVAudioSession sharedInstance];
285-
NSError *error = nil;
286-
[session setActive:NO
287-
withOptions:0
288-
error:&error];
289-
if (error) {
290-
NSLog(@"Error deactivating audio session: %@", error.localizedDescription);
264+
RCT_EXPORT_METHOD(deactivateAudioSession:(BOOL)restorePreviousSessionOnDeactivation
265+
async:(BOOL)async) {
266+
267+
AVAudioSessionSetActiveOptions options = 0;
268+
if (restorePreviousSessionOnDeactivation) {
269+
options |= AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation;
291270
}
292-
}
293-
}
271+
272+
void (^deactivateBlock)(void) = ^{
273+
AVAudioSession *session = [AVAudioSession sharedInstance];
274+
NSError *error = nil;
275+
[session setActive:NO
276+
withOptions:options
277+
error:&error];
278+
if (error) {
279+
NSLog(@"Error activating audio session: %@", error.localizedDescription);
280+
}
281+
};
294282

283+
if (async) {
284+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), deactivateBlock);
285+
} else {
286+
deactivateBlock();
287+
}
288+
}
295289
RCT_EXPORT_METHOD(configureAudioSession:(NSString *)categoryName
296290
mode:(NSString *)modeName
297291
policy:(NSString *)policyName
@@ -300,111 +294,148 @@ - (void)observeValueForKeyPath:(NSString *)keyPath
300294
prefersInterruptionOnRouteDisconnect:(BOOL)prefersInterruptionOnRouteDisconnect
301295
allowHapticsAndSystemSoundsDuringRecording:(BOOL)allowHapticsAndSystemSoundsDuringRecording) {
302296

303-
AVAudioSession *session = [AVAudioSession sharedInstance];
304-
305-
NSString *category = nil;
306-
if ([categoryName isEqualToString:@"Ambient"]) {
307-
category = AVAudioSessionCategoryAmbient;
308-
} else if ([categoryName isEqualToString:@"SoloAmbient"]) {
309-
category = AVAudioSessionCategorySoloAmbient;
310-
} else if ([categoryName isEqualToString:@"Playback"]) {
311-
category = AVAudioSessionCategoryPlayback;
312-
} else if ([categoryName isEqualToString:@"Record"]) {
313-
category = AVAudioSessionCategoryRecord;
314-
} else if ([categoryName isEqualToString:@"PlayAndRecord"]) {
315-
category = AVAudioSessionCategoryPlayAndRecord;
316-
} else if ([categoryName isEqualToString:@"MultiRoute"]) {
317-
category = AVAudioSessionCategoryMultiRoute;
318-
}
297+
AVAudioSession *session = [AVAudioSession sharedInstance];
298+
299+
NSString *category = nil;
300+
if ([categoryName isEqualToString:@"Ambient"]) {
301+
category = AVAudioSessionCategoryAmbient;
302+
} else if ([categoryName isEqualToString:@"SoloAmbient"]) {
303+
category = AVAudioSessionCategorySoloAmbient;
304+
} else if ([categoryName isEqualToString:@"Playback"]) {
305+
category = AVAudioSessionCategoryPlayback;
306+
} else if ([categoryName isEqualToString:@"Record"]) {
307+
category = AVAudioSessionCategoryRecord;
308+
} else if ([categoryName isEqualToString:@"PlayAndRecord"]) {
309+
category = AVAudioSessionCategoryPlayAndRecord;
310+
} else if ([categoryName isEqualToString:@"MultiRoute"]) {
311+
category = AVAudioSessionCategoryMultiRoute;
312+
}
319313

320-
NSString *mode = nil;
321-
if ([modeName isEqualToString:@"Default"]) {
322-
mode = AVAudioSessionModeDefault;
323-
} else if ([modeName isEqualToString:@"VoiceChat"]) {
324-
mode = AVAudioSessionModeVoiceChat;
325-
} else if ([modeName isEqualToString:@"VideoChat"]) {
326-
mode = AVAudioSessionModeVideoChat;
327-
} else if ([modeName isEqualToString:@"GameChat"]) {
328-
mode = AVAudioSessionModeGameChat;
329-
} else if ([modeName isEqualToString:@"VideoRecording"]) {
330-
mode = AVAudioSessionModeVideoRecording;
331-
} else if ([modeName isEqualToString:@"Measurement"]) {
332-
mode = AVAudioSessionModeMeasurement;
333-
} else if ([modeName isEqualToString:@"MoviePlayback"]) {
334-
mode = AVAudioSessionModeMoviePlayback;
335-
} else if ([modeName isEqualToString:@"SpokenAudio"]) {
336-
mode = AVAudioSessionModeSpokenAudio;
337-
}
314+
NSString *mode = nil;
315+
BOOL hasMode = NO;
316+
if ([modeName isEqualToString:@"Default"]) {
317+
mode = AVAudioSessionModeDefault;
318+
hasMode = YES;
319+
} else if ([modeName isEqualToString:@"VoiceChat"]) {
320+
mode = AVAudioSessionModeVoiceChat;
321+
hasMode = YES;
322+
} else if ([modeName isEqualToString:@"VideoChat"]) {
323+
mode = AVAudioSessionModeVideoChat;
324+
hasMode = YES;
325+
} else if ([modeName isEqualToString:@"GameChat"]) {
326+
mode = AVAudioSessionModeGameChat;
327+
hasMode = YES;
328+
} else if ([modeName isEqualToString:@"VideoRecording"]) {
329+
mode = AVAudioSessionModeVideoRecording;
330+
hasMode = YES;
331+
} else if ([modeName isEqualToString:@"Measurement"]) {
332+
mode = AVAudioSessionModeMeasurement;
333+
hasMode = YES;
334+
} else if ([modeName isEqualToString:@"MoviePlayback"]) {
335+
mode = AVAudioSessionModeMoviePlayback;
336+
hasMode = YES;
337+
} else if ([modeName isEqualToString:@"SpokenAudio"]) {
338+
mode = AVAudioSessionModeSpokenAudio;
339+
hasMode = YES;
340+
}
338341

339-
// Handle policy (map NSString to AVAudioSessionRouteSharingPolicy)
340-
AVAudioSessionRouteSharingPolicy policy = AVAudioSessionRouteSharingPolicyDefault;
341-
if ([policyName isEqualToString:@"LongFormAudio"]) {
342-
policy = AVAudioSessionRouteSharingPolicyLongFormAudio;
343-
} else if ([policyName isEqualToString:@"LongFormVideo"]) {
344-
policy = AVAudioSessionRouteSharingPolicyLongFormVideo;
345-
} else if ([policyName isEqualToString:@"Independent"]) {
346-
policy = AVAudioSessionRouteSharingPolicyIndependent;
347-
}
348-
// Handle options array
349-
AVAudioSessionCategoryOptions options = 0;
350-
for (NSString *optionName in optionsArray) {
351-
if ([optionName isEqualToString:@"MixWithOthers"]) {
352-
options |= AVAudioSessionCategoryOptionMixWithOthers;
353-
} else if ([optionName isEqualToString:@"AllowBluetooth"]) {
354-
options |= AVAudioSessionCategoryOptionAllowBluetooth;
355-
} else if ([optionName isEqualToString:@"AllowBluetoothA2DP"]) {
356-
options |= AVAudioSessionCategoryOptionAllowBluetoothA2DP;
357-
} else if ([optionName isEqualToString:@"AllowAirPlay"]) {
358-
options |= AVAudioSessionCategoryOptionAllowAirPlay;
359-
} else if ([optionName isEqualToString:@"DuckOthers"]) {
360-
options |= AVAudioSessionCategoryOptionDuckOthers;
361-
} else if ([optionName isEqualToString:@"DefaultToSpeaker"]) {
362-
options |= AVAudioSessionCategoryOptionDefaultToSpeaker;
363-
} else if ([optionName isEqualToString:@"InterruptSpokenAudioAndMixWithOthers"]) {
364-
options |= AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers;
365-
}else if ([optionName isEqualToString:@"OverrideMutedMicrophoneInterruption"]) {
366-
options |= AVAudioSessionCategoryOptionOverrideMutedMicrophoneInterruption;
342+
AVAudioSessionRouteSharingPolicy policy = AVAudioSessionRouteSharingPolicyDefault;
343+
BOOL hasPolicy = NO;
344+
if ([policyName isEqualToString:@"LongFormAudio"]) {
345+
policy = AVAudioSessionRouteSharingPolicyLongFormAudio;
346+
hasPolicy = YES;
347+
} else if ([policyName isEqualToString:@"LongFormVideo"]) {
348+
policy = AVAudioSessionRouteSharingPolicyLongFormVideo;
349+
hasPolicy = YES;
350+
} else if ([policyName isEqualToString:@"Independent"]) {
351+
policy = AVAudioSessionRouteSharingPolicyIndependent;
352+
hasPolicy = YES;
367353
}
368-
}
369354

370-
if (category) {
355+
AVAudioSessionCategoryOptions options = 0;
356+
BOOL hasOptions = NO;
357+
for (NSString *optionName in optionsArray) {
358+
if ([optionName isEqualToString:@"MixWithOthers"]) {
359+
options |= AVAudioSessionCategoryOptionMixWithOthers;
360+
hasOptions = YES;
361+
} else if ([optionName isEqualToString:@"AllowBluetooth"]) {
362+
options |= AVAudioSessionCategoryOptionAllowBluetooth;
363+
hasOptions = YES;
364+
} else if ([optionName isEqualToString:@"AllowBluetoothA2DP"]) {
365+
options |= AVAudioSessionCategoryOptionAllowBluetoothA2DP;
366+
hasOptions = YES;
367+
} else if ([optionName isEqualToString:@"AllowAirPlay"]) {
368+
options |= AVAudioSessionCategoryOptionAllowAirPlay;
369+
hasOptions = YES;
370+
} else if ([optionName isEqualToString:@"DuckOthers"]) {
371+
options |= AVAudioSessionCategoryOptionDuckOthers;
372+
hasOptions = YES;
373+
} else if ([optionName isEqualToString:@"DefaultToSpeaker"]) {
374+
options |= AVAudioSessionCategoryOptionDefaultToSpeaker;
375+
hasOptions = YES;
376+
} else if ([optionName isEqualToString:@"InterruptSpokenAudioAndMixWithOthers"]) {
377+
options |= AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers;
378+
hasOptions = YES;
379+
} else if ([optionName isEqualToString:@"OverrideMutedMicrophoneInterruption"]) {
380+
options |= AVAudioSessionCategoryOptionOverrideMutedMicrophoneInterruption;
381+
hasOptions = YES;
382+
}
383+
}
371384

372-
NSError *error = nil;
373-
[session setCategory:category
374-
mode:mode ?: AVAudioSessionModeDefault
375-
routeSharingPolicy:policy
376-
options:options
377-
error:&error];
378-
379-
if (error) {
380-
NSLog(@"Failed to configure audio session: %@", error);
381-
return;
382-
}
385+
NSError *error = nil;
383386

387+
if (category) {
388+
389+
// Handle all combinations of mode, policy, and options
390+
if (hasMode && hasPolicy && hasOptions) {
391+
[session setCategory:category mode:mode routeSharingPolicy:policy options:options error:&error];
392+
} else if (hasMode && hasPolicy) {
393+
[session setCategory:category mode:mode routeSharingPolicy:policy options:0 error:&error];
394+
} else if (hasMode && hasOptions) {
395+
[session setCategory:category mode:mode routeSharingPolicy:AVAudioSessionRouteSharingPolicyDefault options:options error:&error];
396+
} else if (hasPolicy && hasOptions) {
397+
[session setCategory:category mode:AVAudioSessionModeDefault routeSharingPolicy:policy options:options error:&error];
398+
} else if (hasMode) {
399+
[session setCategory:category mode:mode routeSharingPolicy:AVAudioSessionRouteSharingPolicyDefault options:0 error:&error];
400+
} else if (hasPolicy) {
401+
[session setCategory:category mode:AVAudioSessionModeDefault routeSharingPolicy:policy options:0 error:&error];
402+
} else if (hasOptions) {
403+
[session setCategory:category mode:AVAudioSessionModeDefault options:options error:&error];
404+
} else {
405+
[session setCategory:category error:&error];
406+
}
407+
408+
if (error) {
409+
NSLog(@"Failed to configure audio session: %@", error);
410+
return;
411+
}
384412

385-
[session setPrefersNoInterruptionsFromSystemAlerts:prefersNoInterruptionFromSystemAlerts error:&error];
386-
if (error) {
387-
NSLog(@"Failed to set prefersNoInterruptionsFromSystemAlerts: %@", error);
388-
error = nil;
389-
}
390-
391-
392-
if (@available(iOS 17.0, *)) {
393-
[session setPrefersInterruptionOnRouteDisconnect:prefersInterruptionOnRouteDisconnect error:&error];
394-
if (error) {
395-
NSLog(@"Failed to set prefersInterruptionOnRouteDisconnect: %@", error);
396-
error = nil;
397-
}
398-
}
399-
400-
[session setAllowHapticsAndSystemSoundsDuringRecording:allowHapticsAndSystemSoundsDuringRecording error:&error];
401-
if (error) {
402-
NSLog(@"Failed to set allowHapticsAndSystemSoundsDuringRecording: %@", error);
413+
[session setPrefersNoInterruptionsFromSystemAlerts:prefersNoInterruptionFromSystemAlerts error:&error];
414+
if (error) {
415+
NSLog(@"Failed to set prefersNoInterruptionsFromSystemAlerts: %@", error);
416+
error = nil;
417+
}
418+
419+
if (@available(iOS 17.0, *)) {
420+
[session setPrefersInterruptionOnRouteDisconnect:prefersInterruptionOnRouteDisconnect error:&error];
421+
if (error) {
422+
NSLog(@"Failed to set prefersInterruptionOnRouteDisconnect: %@", error);
423+
error = nil;
424+
}
425+
}
426+
427+
[session setAllowHapticsAndSystemSoundsDuringRecording:allowHapticsAndSystemSoundsDuringRecording error:&error];
428+
if (error) {
429+
NSLog(@"Failed to set allowHapticsAndSystemSoundsDuringRecording: %@", error);
430+
}
431+
} else {
432+
if(hasMode) {
433+
[session setMode:mode error:&error];
434+
} else {
435+
NSLog(@"Did not provide any category or mode to set:");
436+
}
437+
403438
}
404-
405-
} else {
406-
NSLog(@"Did not provide any category to set:");
407-
}
408439
}
409440

410441
RCT_EXPORT_METHOD(getAudioSessionStatus:(RCTResponseSenderBlock)callback) {

0 commit comments

Comments
 (0)