From 955f3184f915321617c91e768f7ba960b4f84f22 Mon Sep 17 00:00:00 2001 From: Sylvain Becker Date: Fri, 25 Sep 2020 10:14:42 +0200 Subject: [PATCH] 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") --- include/SDL_hints.h | 12 ++++++++++++ src/video/android/SDL_androidevents.c | 12 ++++++++---- src/video/android/SDL_androidvideo.c | 1 + src/video/android/SDL_androidvideo.h | 1 + 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/include/SDL_hints.h b/include/SDL_hints.h index 44db3c5e4..70319acb0 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 51d2a57a5..dfd62123d 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 0348c8519..3cad3beb6 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 4ab22e1b8..b94e879ea 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;