From c08a7a74a592596863a09ce9fa86328c0fd79254 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 15 Sep 2017 17:27:32 -0700 Subject: [PATCH] Added a hint SDL_HINT_AUDIO_CATEGORY to control the audio category, determining whether the phone mute switch affects the audio --- WhatsNew.txt | 2 ++ include/SDL_hints.h | 13 +++++++++++++ src/audio/coreaudio/SDL_coreaudio.m | 19 ++++++++++++++----- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/WhatsNew.txt b/WhatsNew.txt index 06d590b5b5a9e..38e0496234fe2 100644 --- a/WhatsNew.txt +++ b/WhatsNew.txt @@ -57,6 +57,8 @@ Windows: Linux: * Added an experimental KMS/DRM video driver for embedded development +iOS: +* Added a hint SDL_HINT_AUDIO_CATEGORY to control the audio category, determining whether the phone mute switch affects the audio --------------------------------------------------------------------------- 2.0.5: diff --git a/include/SDL_hints.h b/include/SDL_hints.h index e14614b388cf0..007a4bee05c0d 100644 --- a/include/SDL_hints.h +++ b/include/SDL_hints.h @@ -854,6 +854,19 @@ extern "C" { */ #define SDL_HINT_AUDIO_RESAMPLING_MODE "SDL_AUDIO_RESAMPLING_MODE" +/** + * \brief A variable controlling the audio category on iOS and Mac OS X + * + * This variable can be set to the following values: + * + * "ambient" - Use the AVAudioSessionCategoryAmbient audio category, will be muted by the phone mute switch (default) + * "playback" - Use the AVAudioSessionCategoryPlayback category + * + * For more information, see Apple's documentation: + * https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html + */ +#define SDL_HINT_AUDIO_CATEGORY "SDL_AUDIO_CATEGORY" + /** * \brief An enumeration of hint priorities */ diff --git a/src/audio/coreaudio/SDL_coreaudio.m b/src/audio/coreaudio/SDL_coreaudio.m index 2b02ed7a56a00..42e293c1395e7 100644 --- a/src/audio/coreaudio/SDL_coreaudio.m +++ b/src/audio/coreaudio/SDL_coreaudio.m @@ -25,6 +25,7 @@ /* !!! FIXME: clean out some of the macro salsa in here. */ #include "SDL_audio.h" +#include "SDL_hints.h" #include "../SDL_audio_c.h" #include "../SDL_sysaudio.h" #include "SDL_coreaudio.h" @@ -325,7 +326,8 @@ static BOOL update_audio_session(_THIS, SDL_bool open) @autoreleasepool { AVAudioSession *session = [AVAudioSession sharedInstance]; NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - NSString *category; + /* Set category to ambient by default so that other music continues playing. */ + NSString *category = AVAudioSessionCategoryAmbient; NSError *err = nil; if (open_playback_devices && open_capture_devices) { @@ -333,10 +335,17 @@ static BOOL update_audio_session(_THIS, SDL_bool open) } else if (open_capture_devices) { category = AVAudioSessionCategoryRecord; } else { - /* Set category to ambient so that other music continues playing. - You can change this at runtime in your own code if you need different - behavior. If this is common, we can add an SDL hint for this. */ - category = AVAudioSessionCategoryAmbient; + const char *hint = SDL_GetHint(SDL_HINT_AUDIO_CATEGORY); + if (hint) { + if (SDL_strcasecmp(hint, "AVAudioSessionCategoryAmbient") == 0) { + category = AVAudioSessionCategoryAmbient; + } else if (SDL_strcasecmp(hint, "AVAudioSessionCategorySoloAmbient") == 0) { + category = AVAudioSessionCategorySoloAmbient; + } else if (SDL_strcasecmp(hint, "AVAudioSessionCategoryPlayback") == 0 || + SDL_strcasecmp(hint, "playback") == 0) { + category = AVAudioSessionCategoryPlayback; + } + } } if (![session setCategory:category error:&err]) {