فهرست منبع

[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 11 سال پیش
والد
کامیت
4544343b3e
3فایلهای تغییر یافته به همراه30 افزوده شده و 6 حذف شده
  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);
     }