Skip to content

Commit

Permalink
Added a hint SDL_HINT_AUDIO_CATEGORY to control the audio category,
Browse files Browse the repository at this point in the history
determining whether the phone mute switch affects the audio
  • Loading branch information
slouken committed Sep 16, 2017
1 parent 46ec130 commit c08a7a7
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 5 deletions.
2 changes: 2 additions & 0 deletions WhatsNew.txt
Expand Up @@ -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:
Expand Down
13 changes: 13 additions & 0 deletions include/SDL_hints.h
Expand Up @@ -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
*/
Expand Down
19 changes: 14 additions & 5 deletions src/audio/coreaudio/SDL_coreaudio.m
Expand Up @@ -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"
Expand Down Expand Up @@ -325,18 +326,26 @@ 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) {
category = AVAudioSessionCategoryPlayAndRecord;
} 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]) {
Expand Down

0 comments on commit c08a7a7

Please sign in to comment.