summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bindings.c2
-rw-r--r--blastem.c6
-rw-r--r--genesis.c5
-rw-r--r--libblastem.c2
-rw-r--r--nuklear_ui/blastem_nuklear.c2
-rwxr-xr-xrender_sdl.c27
-rw-r--r--sms.c5
-rw-r--r--system.c6
-rw-r--r--system.h2
9 files changed, 38 insertions, 19 deletions
diff --git a/bindings.c b/bindings.c
index bec8e16..2921aa8 100644
--- a/bindings.c
+++ b/bindings.c
@@ -409,7 +409,7 @@ void handle_binding_up(keybinding * binding)
show_pause_menu();
} else {
#endif
- current_system->request_exit(current_system);
+ system_request_exit(current_system, 1);
if (current_system->type == SYSTEM_GENESIS) {
genesis_context *gen = (genesis_context *)current_system;
if (gen->extra) {
diff --git a/blastem.c b/blastem.c
index 3d3a30d..dff7f1c 100644
--- a/blastem.c
+++ b/blastem.c
@@ -327,7 +327,7 @@ static void on_drag_drop(const char *filename)
free(current_system->next_rom);
}
current_system->next_rom = strdup(filename);
- current_system->request_exit(current_system);
+ system_request_exit(current_system, 1);
if (menu_system && menu_system->type == SYSTEM_GENESIS) {
genesis_context *gen = (genesis_context *)menu_system;
if (gen->extra) {
@@ -368,7 +368,7 @@ void reload_media(void)
num_parts--;
}
current_system->next_rom = alloc_concat_m(num_parts, start);
- current_system->request_exit(current_system);
+ system_request_exit(current_system, 1);
}
void lockon_media(char *lock_on_path)
@@ -749,6 +749,7 @@ int main(int argc, char ** argv)
current_system->debugger_type = dtype;
current_system->enter_debugger = start_in_debugger && menu == debug_target;
current_system->start_context(current_system, statefile);
+ render_video_loop();
} else if (menu && game_system) {
current_system->arena = set_current_arena(game_system->arena);
current_system = game_system;
@@ -766,6 +767,7 @@ int main(int argc, char ** argv)
}
if (!current_system->next_rom) {
current_system->resume_context(current_system);
+ render_video_loop();
}
} else {
break;
diff --git a/genesis.c b/genesis.c
index 4ed0261..3c2dc17 100644
--- a/genesis.c
+++ b/genesis.c
@@ -1254,7 +1254,7 @@ static void handle_reset_requests(genesis_context *gen)
resume_68k(gen->m68k);
}
}
- if (render_should_release_on_exit()) {
+ if (gen->header.force_release || render_should_release_on_exit()) {
bindings_release_capture();
vdp_release_framebuffer(gen->vdp);
render_pause_source(gen->ym->audio);
@@ -1302,7 +1302,8 @@ static void start_genesis(system_header *system, char *statefile)
static void resume_genesis(system_header *system)
{
genesis_context *gen = (genesis_context *)system;
- if (render_should_release_on_exit()) {
+ if (gen->header.force_release || render_should_release_on_exit()) {
+ gen->header.force_release = 0;
render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC);
bindings_reacquire_capture();
vdp_reacquire_framebuffer(gen->vdp);
diff --git a/libblastem.c b/libblastem.c
index 7a066ac..835854c 100644
--- a/libblastem.c
+++ b/libblastem.c
@@ -381,7 +381,7 @@ void render_framebuffer_updated(uint8_t which, int width)
last_height = height;
}
retro_video_refresh(fb + overscan_left + LINEBUF_SIZE * overscan_top, width, height, LINEBUF_SIZE * sizeof(uint32_t));
- current_system->request_exit(current_system);
+ system_request_exit(current_system, 0);
}
uint8_t render_get_active_framebuffer(void)
diff --git a/nuklear_ui/blastem_nuklear.c b/nuklear_ui/blastem_nuklear.c
index 35c49ad..99464e8 100644
--- a/nuklear_ui/blastem_nuklear.c
+++ b/nuklear_ui/blastem_nuklear.c
@@ -2220,7 +2220,7 @@ void show_pause_menu(void)
context->style.window.fixed_background = nk_style_item_color(nk_rgba(0, 0, 0, 128));
current_view = view_pause;
context->input.selected_widget = 0;
- current_system->request_exit(current_system);
+ system_request_exit(current_system, 1);
} else if (current_system && !set_binding) {
clear_view_stack();
show_play_view();
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);
diff --git a/sms.c b/sms.c
index 208b079..a2e3d3b 100644
--- a/sms.c
+++ b/sms.c
@@ -428,7 +428,7 @@ static void run_sms(system_header *system)
target_cycle -= adjust;
}
}
- if (render_should_release_on_exit()) {
+ if (sms->header.force_release || render_should_release_on_exit()) {
bindings_release_capture();
vdp_release_framebuffer(sms->vdp);
render_pause_source(sms->psg->audio);
@@ -439,7 +439,8 @@ static void run_sms(system_header *system)
static void resume_sms(system_header *system)
{
sms_context *sms = (sms_context *)system;
- if (render_should_release_on_exit()) {
+ if (sms->header.force_release || render_should_release_on_exit()) {
+ sms->header.force_release = 0;
bindings_reacquire_capture();
vdp_reacquire_framebuffer(sms->vdp);
render_resume_source(sms->psg->audio);
diff --git a/system.c b/system.c
index 4e92b21..60c0040 100644
--- a/system.c
+++ b/system.c
@@ -89,3 +89,9 @@ system_header *alloc_config_player(system_type stype, event_reader *reader)
}
return NULL;
}
+
+void system_request_exit(system_header *system, uint8_t force_release)
+{
+ system->force_release = force_release;
+ system->request_exit(system);
+}
diff --git a/system.h b/system.h
index 1fbd61b..39bc5cc 100644
--- a/system.h
+++ b/system.h
@@ -73,6 +73,7 @@ struct system_header {
uint8_t delayed_load_slot;
uint8_t has_keyboard;
uint8_t vgm_logging;
+ uint8_t force_release;
debugger_type debugger_type;
system_type type;
};
@@ -91,5 +92,6 @@ struct system_media {
system_type detect_system_type(system_media *media);
system_header *alloc_config_system(system_type stype, system_media *media, uint32_t opts, uint8_t force_region);
system_header *alloc_config_player(system_type stype, event_reader *reader);
+void system_request_exit(system_header *system, uint8_t force_release);
#endif //SYSTEM_H_