@@ -238,60 +238,54 @@ - (void)observeValueForKeyPath:(NSString *)keyPath
238238RCT_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+ }
295289RCT_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
410441RCT_EXPORT_METHOD (getAudioSessionStatus:(RCTResponseSenderBlock)callback) {
0 commit comments