Commit 955f3184f915321617c91e768f7ba960b4f84f22

Sylvain Becker 2020-09-25T10:14:42

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")

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;