[Android] Fixes #2480, music does not pause when process backgrounded
authorGabriel Jacobo <gabomdq@gmail.com>
Wed, 17 Sep 2014 11:41:12 -0300
changeset 9145 aa99e029b12e
parent 9144 c197a316685a
child 9146 dbef1f283c3f
[Android] Fixes #2480, music does not pause when process backgrounded This modifies SDL_PauseAudio behavior to pause all audio devices instead of just the default one (required on Android, at least for testmultiaudio on my Nexus 4 which reported 2 audio devices). It also changes SDL_PauseAudioDevice to retain the device lock from pause until resume in order to save battery in mobile devices.
src/audio/SDL_audio.c
src/video/android/SDL_androidevents.c
test/testmultiaudio.c
--- a/src/audio/SDL_audio.c	Wed Sep 17 08:59:43 2014 -0300
+++ b/src/audio/SDL_audio.c	Wed Sep 17 11:41:12 2014 -0300
@@ -1348,17 +1348,26 @@
 SDL_PauseAudioDevice(SDL_AudioDeviceID devid, int pause_on)
 {
     SDL_AudioDevice *device = get_audio_device(devid);
-    if (device) {
-        current_audio.impl.LockDevice(device);
+    if (device && device->paused != pause_on) {
+        if (pause_on) {
+            current_audio.impl.LockDevice(device);
+        }
         device->paused = pause_on;
-        current_audio.impl.UnlockDevice(device);
+        if (!pause_on) {
+            current_audio.impl.UnlockDevice(device);
+        }
     }
 }
 
 void
 SDL_PauseAudio(int pause_on)
 {
-    SDL_PauseAudioDevice(1, pause_on);
+    int id;
+    for (id = 0; id < SDL_arraysize(open_devices); id++) {
+        if (open_devices[id] != NULL) {
+            SDL_PauseAudioDevice(id+1, pause_on);
+        }
+    }
 }
 
 
--- a/src/video/android/SDL_androidevents.c	Wed Sep 17 08:59:43 2014 -0300
+++ b/src/video/android/SDL_androidevents.c	Wed Sep 17 11:41:12 2014 -0300
@@ -74,13 +74,14 @@
     if (isPaused && !isPausing) {
         /* Make sure this is the last thing we do before pausing */
         android_egl_context_backup();
+        SDL_PauseAudio(1);
         if(SDL_SemWait(Android_ResumeSem) == 0) {
 #else
     if (isPaused) {
         if(SDL_SemTryWait(Android_ResumeSem) == 0) {
 #endif
             isPaused = 0;
-            
+            SDL_PauseAudio(0);
             /* Restore the GL Context from here, as this operation is thread dependent */
             if (!SDL_HasEvent(SDL_QUIT)) {
                 android_egl_context_restore();
@@ -103,6 +104,7 @@
 #else
         if(SDL_SemTryWait(Android_PauseSem) == 0) {
             android_egl_context_backup();
+            SDL_PauseAudio(1);
             isPaused = 1;
         }
 #endif
--- a/test/testmultiaudio.c	Wed Sep 17 08:59:43 2014 -0300
+++ b/test/testmultiaudio.c	Wed Sep 17 11:41:12 2014 -0300
@@ -50,6 +50,12 @@
     callback_data cbd[64];
     int keep_going = 1;
     int i;
+    
+#ifdef __ANDROID__  
+    SDL_Event event;
+  
+    SDL_CreateWindow("testmultiaudio", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 320, 240, 0);
+#endif
 
     if (devcount > 64) {
         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Too many devices (%d), clamping to 64...\n",
@@ -71,8 +77,12 @@
             SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Open device failed: %s\n", SDL_GetError());
         } else {
             SDL_PauseAudioDevice(cbd[0].dev, 0);
-            while (!cbd[0].done)
+            while (!cbd[0].done) {
+#ifdef __ANDROID__                
+                while (SDL_PollEvent(&event)){}
+#endif                
                 SDL_Delay(100);
+            }
             SDL_PauseAudioDevice(cbd[0].dev, 1);
             SDL_Log("done.\n");
             SDL_CloseAudioDevice(cbd[0].dev);
@@ -104,6 +114,9 @@
                 keep_going = 1;
             }
         }
+#ifdef __ANDROID__        
+        while (SDL_PollEvent(&event)){}
+#endif        
         SDL_Delay(100);
     }