Browse Source

[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.
Gabriel Jacobo 10 years ago
parent
commit
4544343b3e
3 changed files with 30 additions and 6 deletions
  1. 13 4
      src/audio/SDL_audio.c
  2. 3 1
      src/video/android/SDL_androidevents.c
  3. 14 1
      test/testmultiaudio.c

+ 13 - 4
src/audio/SDL_audio.c

@@ -1348,17 +1348,26 @@ void
 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);
+        }
+    }
 }
 
 

+ 3 - 1
src/video/android/SDL_androidevents.c

@@ -74,13 +74,14 @@ Android_PumpEvents(_THIS)
     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 @@ Android_PumpEvents(_THIS)
 #else
         if(SDL_SemTryWait(Android_PauseSem) == 0) {
             android_egl_context_backup();
+            SDL_PauseAudio(1);
             isPaused = 1;
         }
 #endif

+ 14 - 1
test/testmultiaudio.c

@@ -50,6 +50,12 @@ test_multi_audio(int devcount)
     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 @@ test_multi_audio(int devcount)
             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 @@ test_multi_audio(int devcount)
                 keep_going = 1;
             }
         }
+#ifdef __ANDROID__        
+        while (SDL_PollEvent(&event)){}
+#endif        
         SDL_Delay(100);
     }