diff --git a/src/video/android/SDL_androidevents.c b/src/video/android/SDL_androidevents.c index c95750c6e..8e8ecd61f 100644 --- a/src/video/android/SDL_androidevents.c +++ b/src/video/android/SDL_androidevents.c @@ -63,35 +63,37 @@ android_egl_context_backup(SDL_Window *window) SDL_GL_MakeCurrent(window, NULL); } + +/* + * Android_ResumeSem and Android_PauseSem are signaled from Java_org_libsdl_app_SDLActivity_nativePause and Java_org_libsdl_app_SDLActivity_nativeResume + * When the pause semaphore is signaled, if SDL_ANDROID_BLOCK_ON_PAUSE is defined the event loop will block until the resume signal is emitted. + * + * No polling necessary + */ + +#if SDL_ANDROID_BLOCK_ON_PAUSE + void Android_PumpEvents(_THIS) { static int isPaused = 0; -#if SDL_ANDROID_BLOCK_ON_PAUSE static int isPausing = 0; -#endif - /* No polling necessary */ - /* - * Android_ResumeSem and Android_PauseSem are signaled from Java_org_libsdl_app_SDLActivity_nativePause and Java_org_libsdl_app_SDLActivity_nativeResume - * When the pause semaphore is signaled, if SDL_ANDROID_BLOCK_ON_PAUSE is defined the event loop will block until the resume signal is emitted. - */ - -#if SDL_ANDROID_BLOCK_ON_PAUSE if (isPaused && !isPausing) { + /* Make sure this is the last thing we do before pausing */ SDL_LockMutex(Android_ActivityMutex); android_egl_context_backup(Android_Window); SDL_UnlockMutex(Android_ActivityMutex); ANDROIDAUDIO_PauseDevices(); + if (SDL_SemWait(Android_ResumeSem) == 0) { -#else - if (isPaused) { - if (SDL_SemTryWait(Android_ResumeSem) == 0) { -#endif + isPaused = 0; + ANDROIDAUDIO_ResumeDevices(); + /* Restore the GL Context from here, as this operation is thread dependent */ if (!SDL_HasEvent(SDL_QUIT)) { SDL_LockMutex(Android_ActivityMutex); @@ -99,11 +101,9 @@ Android_PumpEvents(_THIS) SDL_UnlockMutex(Android_ActivityMutex); } } - } - else { -#if SDL_ANDROID_BLOCK_ON_PAUSE + } else { if (isPausing || SDL_SemTryWait(Android_PauseSem) == 0) { - /* We've been signaled to pause, but before we block ourselves, + /* We've been signaled to pause, but before we block ourselves, we need to make sure that certain key events have reached the app */ if (SDL_HasEvent(SDL_WINDOWEVENT) || SDL_HasEvent(SDL_APP_WILLENTERBACKGROUND) || SDL_HasEvent(SDL_APP_DIDENTERBACKGROUND) ) { isPausing = 1; @@ -113,19 +113,46 @@ Android_PumpEvents(_THIS) isPaused = 1; } } + } +} + #else + +void +Android_PumpEvents(_THIS) +{ + static int isPaused = 0; + + if (isPaused) { + if (SDL_SemTryWait(Android_ResumeSem) == 0) { + + isPaused = 0; + + ANDROIDAUDIO_ResumeDevices(); + + /* Restore the GL Context from here, as this operation is thread dependent */ + if (!SDL_HasEvent(SDL_QUIT)) { + SDL_LockMutex(Android_ActivityMutex); + android_egl_context_restore(Android_Window); + SDL_UnlockMutex(Android_ActivityMutex); + } + } + } else { if (SDL_SemTryWait(Android_PauseSem) == 0) { + SDL_LockMutex(Android_ActivityMutex); android_egl_context_backup(Android_Window); SDL_UnlockMutex(Android_ActivityMutex); ANDROIDAUDIO_PauseDevices(); + isPaused = 1; } -#endif } } +#endif + #endif /* SDL_VIDEO_DRIVER_ANDROID */ /* vi: set ts=4 sw=4 expandtab: */