Android: fix wrong state after immediate sequence pause() / resume() / pause()

It may happen to have the sequence pause()/resume()/pause(), before polling
any events.

Before, it ends in 'resumed' state because as the check is greedy.
Now, always increase the Pause semaphore, and stop at each pause.
It ends in 'paused' state.

Related to bug 3250: set up a reconfiguration of SurfaceView holder.
Turn the screen off manually before the app starts
(repro rate is not 100%..)
This commit is contained in:
Sylvain Becker
2019-01-05 22:27:25 +01:00
parent d4c0f498db
commit 35722b6423
2 changed files with 15 additions and 5 deletions

View File

@@ -39,6 +39,13 @@ static void ANDROIDAUDIO_ResumeDevices(void) {}
static void ANDROIDAUDIO_PauseDevices(void) {}
#endif
/* Number of event types in the event queue */
static int
SDL_NumberOfEvent(Uint32 type)
{
return SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type);
}
static void
android_egl_context_restore(SDL_Window *window)
{
@@ -103,9 +110,10 @@ Android_PumpEvents(_THIS)
}
} else {
if (isPausing || SDL_SemTryWait(Android_PauseSem) == 0) {
/* We've been signaled to pause, but before we block ourselves,
we need to make sure that the very last event have reached the app */
if (SDL_HasEvent(SDL_APP_DIDENTERBACKGROUND)) {
/* We've been signaled to pause (potentially several times), but before we block ourselves,
* we need to make sure that the very last event (of the first pause sequence, if several)
* has reached the app */
if (SDL_NumberOfEvent(SDL_APP_DIDENTERBACKGROUND) > SDL_SemValue(Android_PauseSem)) {
isPausing = 1;
}
else {