Fixed bug 5239 - Play audio on Android while backgrounded (Thanks Superfury) Add hint SDL_HINT_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO not to pause audio when the app goes to background. (It requires SDL_ANDROID_BLOCK_ON_PAUSE as "Non blocking")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
diff --git a/include/SDL_hints.h b/include/SDL_hints.h
index 44db3c5..70319ac 100644
--- a/include/SDL_hints.h
+++ b/include/SDL_hints.h
@@ -1028,6 +1028,18 @@ extern "C" {
*/
#define SDL_HINT_ANDROID_BLOCK_ON_PAUSE "SDL_ANDROID_BLOCK_ON_PAUSE"
+/**
+ * \brief A variable to control whether SDL will pause audio in background
+ * (Requires SDL_ANDROID_BLOCK_ON_PAUSE as "Non blocking")
+ *
+ * The variable can be set to the following values:
+ * "0" - Non paused.
+ * "1" - Paused. (default)
+ *
+ * The value should be set before SDL is initialized.
+ */
+#define SDL_HINT_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO "SDL_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO"
+
/**
* \brief A variable to control whether the return key on the soft keyboard
* should hide the soft keyboard on Android and iOS.
diff --git a/src/video/android/SDL_androidevents.c b/src/video/android/SDL_androidevents.c
index 51d2a57..dfd6212 100644
--- a/src/video/android/SDL_androidevents.c
+++ b/src/video/android/SDL_androidevents.c
@@ -175,8 +175,10 @@ Android_PumpEvents_NonBlocking(_THIS)
SDL_UnlockMutex(Android_ActivityMutex);
}
- ANDROIDAUDIO_PauseDevices();
- openslES_PauseDevices();
+ if (videodata->pauseAudio) {
+ ANDROIDAUDIO_PauseDevices();
+ openslES_PauseDevices();
+ }
backup_context = 0;
}
@@ -191,8 +193,10 @@ Android_PumpEvents_NonBlocking(_THIS)
SDL_SendAppEvent(SDL_APP_DIDENTERFOREGROUND);
SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESTORED, 0, 0);
- ANDROIDAUDIO_ResumeDevices();
- openslES_ResumeDevices();
+ if (videodata->pauseAudio) {
+ ANDROIDAUDIO_ResumeDevices();
+ openslES_ResumeDevices();
+ }
/* Restore the GL Context from here, as this operation is thread dependent */
if (!isContextExternal && !SDL_HasEvent(SDL_QUIT)) {
diff --git a/src/video/android/SDL_androidvideo.c b/src/video/android/SDL_androidvideo.c
index 0348c85..3cad3be 100644
--- a/src/video/android/SDL_androidvideo.c
+++ b/src/video/android/SDL_androidvideo.c
@@ -181,6 +181,7 @@ Android_VideoInit(_THIS)
videodata->isPaused = SDL_FALSE;
videodata->isPausing = SDL_FALSE;
+ videodata->pauseAudio = SDL_GetHintBoolean(SDL_HINT_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO, SDL_TRUE);
mode.format = Android_ScreenFormat;
mode.w = Android_DeviceWidth;
diff --git a/src/video/android/SDL_androidvideo.h b/src/video/android/SDL_androidvideo.h
index 4ab22e1..b94e879 100644
--- a/src/video/android/SDL_androidvideo.h
+++ b/src/video/android/SDL_androidvideo.h
@@ -38,6 +38,7 @@ typedef struct SDL_VideoData
SDL_Rect textRect;
int isPaused;
int isPausing;
+ int pauseAudio;
} SDL_VideoData;
extern int Android_SurfaceWidth;