diff options
Diffstat (limited to 'render_sdl.c')
-rwxr-xr-x | render_sdl.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/render_sdl.c b/render_sdl.c index 54fa3a5..9f76cd2 100755 --- a/render_sdl.c +++ b/render_sdl.c @@ -171,11 +171,11 @@ void render_free_audio_opaque(void *opaque) void render_audio_created(audio_source *source) { - if (sync_src == SYNC_AUDIO && SDL_GetAudioStatus() == SDL_AUDIO_PAUSED) { + if (render_is_audio_sync()) { SDL_PauseAudio(0); } - if (current_system) { - current_system->request_exit(current_system); + if (current_system && sync_src == SYNC_AUDIO_THREAD) { + system_request_exit(current_system, 0); } } @@ -184,16 +184,22 @@ void render_source_paused(audio_source *src, uint8_t remaining_sources) if (sync_src == SYNC_AUDIO) { SDL_CondSignal(audio_ready); } - if (!remaining_sources) { - SDL_PauseAudio(0); + if (!remaining_sources && render_is_audio_sync()) { + SDL_PauseAudio(1); + if (sync_src == SYNC_AUDIO_THREAD) { + SDL_CondSignal(frame_ready); + } } } void render_source_resumed(audio_source *src) { - if (sync_src == SYNC_AUDIO) { + if (render_is_audio_sync()) { SDL_PauseAudio(0); } + if (current_system && sync_src == SYNC_AUDIO_THREAD) { + system_request_exit(current_system, 0); + } } void render_do_audio_ready(audio_source *src) @@ -206,7 +212,7 @@ void render_do_audio_ready(audio_source *src) src->buffer_pos = 0; if (all_sources_ready()) { //we've emulated far enough to fill the current buffer - current_system->request_exit(current_system); + system_request_exit(current_system, 0); } } else if (sync_src == SYNC_AUDIO) { SDL_LockMutex(audio_mutex); @@ -1700,15 +1706,13 @@ void render_video_loop(void) if (sync_src != SYNC_AUDIO_THREAD && sync_src != SYNC_EXTERNAL) { return; } - SDL_PauseAudio(0); SDL_LockMutex(frame_mutex); for(;;) { - while (!frame_queue_len) + while (!frame_queue_len && SDL_GetAudioStatus() == SDL_AUDIO_PLAYING) { SDL_CondWait(frame_ready, frame_mutex); } - for (int i = 0; i < frame_queue_len; i++) while (frame_queue_len) { frame f = frame_queue[frame_queue_read++]; @@ -1719,6 +1723,9 @@ void render_video_loop(void) release_buffer(f.buffer); SDL_LockMutex(frame_mutex); } + if (SDL_GetAudioStatus() != SDL_AUDIO_PLAYING) { + break; + } } SDL_UnlockMutex(frame_mutex); |