Browse Source

Fixed infinite recursion when the microphone is unavailable

Sam Lantinga 5 months ago
parent
commit
932bb968d7
1 changed files with 12 additions and 4 deletions
  1. 12 4
      src/audio/coreaudio/SDL_coreaudio.m

+ 12 - 4
src/audio/coreaudio/SDL_coreaudio.m

@@ -436,7 +436,12 @@ static bool UpdateAudioSession(SDL_AudioDevice *device, bool open, bool allow_pl
                 }
             }
         } else if (data.playback && data.recording) {
-            category = AVAudioSessionCategoryPlayAndRecord;
+            if (allow_playandrecord) {
+                category = AVAudioSessionCategoryPlayAndRecord;
+            } else {
+                // We already failed play and record with AVAudioSessionErrorCodeResourceNotAvailable
+                return false;
+            }
         } else if (data.recording) {
             category = AVAudioSessionCategoryRecord;
         }
@@ -494,12 +499,15 @@ static bool UpdateAudioSession(SDL_AudioDevice *device, bool open, bool allow_pl
             if (![session setActive:YES error:&err]) {
                 if ([err code] == AVAudioSessionErrorCodeResourceNotAvailable &&
                     category == AVAudioSessionCategoryPlayAndRecord) {
-                    return UpdateAudioSession(device, open, false);
+                    if (UpdateAudioSession(device, open, false)) {
+                        return true;
+                    } else {
+                        return SDL_SetError("Could not activate Audio Session: Resource not available");
+                    }
                 }
 
                 NSString *desc = err.description;
-                SDL_SetError("Could not activate Audio Session: %s", desc.UTF8String);
-                return false;
+                return SDL_SetError("Could not activate Audio Session: %s", desc.UTF8String);
             }
             session_active = true;
             ResumeAudioDevices();