Fixed setting the "playandrecord" audio hint on Apple TV

The Apple TV doesn't have record capability by default, so activating the audio session with AVAudioSessionCategoryPlayAndRecord fails.
This commit is contained in:
Sam Lantinga 2020-04-02 12:27:29 -07:00
parent 378a5cfb61
commit f3e609679d
1 changed files with 11 additions and 4 deletions

View File

@ -331,7 +331,7 @@ static void interruption_end(_THIS)
@end @end
static BOOL update_audio_session(_THIS, SDL_bool open) static BOOL update_audio_session(_THIS, SDL_bool open, SDL_bool allow_playandrecord)
{ {
@autoreleasepool { @autoreleasepool {
AVAudioSession *session = [AVAudioSession sharedInstance]; AVAudioSession *session = [AVAudioSession sharedInstance];
@ -356,8 +356,10 @@ static BOOL update_audio_session(_THIS, SDL_bool open)
options &= ~AVAudioSessionCategoryOptionMixWithOthers; options &= ~AVAudioSessionCategoryOptionMixWithOthers;
} else if (SDL_strcasecmp(hint, "AVAudioSessionCategoryPlayAndRecord") == 0 || } else if (SDL_strcasecmp(hint, "AVAudioSessionCategoryPlayAndRecord") == 0 ||
SDL_strcasecmp(hint, "playandrecord") == 0) { SDL_strcasecmp(hint, "playandrecord") == 0) {
if (allow_playandrecord) {
category = AVAudioSessionCategoryPlayAndRecord; category = AVAudioSessionCategoryPlayAndRecord;
} }
}
} else if (open_playback_devices && open_capture_devices) { } else if (open_playback_devices && open_capture_devices) {
category = AVAudioSessionCategoryPlayAndRecord; category = AVAudioSessionCategoryPlayAndRecord;
} else if (open_capture_devices) { } else if (open_capture_devices) {
@ -390,6 +392,11 @@ static BOOL update_audio_session(_THIS, SDL_bool open)
if (open && (open_playback_devices + open_capture_devices) == 1) { if (open && (open_playback_devices + open_capture_devices) == 1) {
if (![session setActive:YES error:&err]) { if (![session setActive:YES error:&err]) {
if ([err code] == AVAudioSessionErrorCodeResourceNotAvailable &&
category == AVAudioSessionCategoryPlayAndRecord) {
return update_audio_session(this, open, SDL_FALSE);
}
NSString *desc = err.description; NSString *desc = err.description;
SDL_SetError("Could not activate Audio Session: %s", desc.UTF8String); SDL_SetError("Could not activate Audio Session: %s", desc.UTF8String);
return NO; return NO;
@ -620,7 +627,7 @@ COREAUDIO_CloseDevice(_THIS)
} }
#if !MACOSX_COREAUDIO #if !MACOSX_COREAUDIO
update_audio_session(this, SDL_FALSE); update_audio_session(this, SDL_FALSE, SDL_TRUE);
#endif #endif
/* if callback fires again, feed silence; don't call into the app. */ /* if callback fires again, feed silence; don't call into the app. */
@ -945,7 +952,7 @@ COREAUDIO_OpenDevice(_THIS, void *handle, const char *devname, int iscapture)
} }
#if !MACOSX_COREAUDIO #if !MACOSX_COREAUDIO
if (!update_audio_session(this, SDL_TRUE)) { if (!update_audio_session(this, SDL_TRUE, SDL_TRUE)) {
return -1; return -1;
} }