Pārlūkot izejas kodu

Added a hint SDL_HINT_AUDIO_CATEGORY to control the audio category,
determining whether the phone mute switch affects the audio

Sam Lantinga 7 gadi atpakaļ
vecāks
revīzija
c08a7a74a5
3 mainītis faili ar 29 papildinājumiem un 5 dzēšanām
  1. 2 0
      WhatsNew.txt
  2. 13 0
      include/SDL_hints.h
  3. 14 5
      src/audio/coreaudio/SDL_coreaudio.m

+ 2 - 0
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:

+ 13 - 0
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
  */

+ 14 - 5
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]) {