# HG changeset patch # User Michael Pavone # Date 1561792642 25200 # Node ID e4671a39d15530333fa70f00bb7aa925ddebcf36 # Parent dc94354eab668d517143d39087008ca8c766569b Properly handle freeing a paused audio source. Fixes crash when repeatedly reloading a ROM or loading a sequence of different ROMs diff -r dc94354eab66 -r e4671a39d155 render_audio.c --- a/render_audio.c Mon Jun 24 23:47:16 2019 -0700 +++ b/render_audio.c Sat Jun 29 00:17:22 2019 -0700 @@ -9,7 +9,6 @@ static uint8_t output_channels; static uint32_t buffer_samples, sample_rate; -static uint32_t missing_count; static audio_source *audio_sources[8]; static audio_source *inactive_audio_sources[8]; @@ -238,7 +237,19 @@ void render_free_source(audio_source *src) { - render_pause_source(src); + uint8_t found = 0; + for (uint8_t i = 0; i < num_inactive_audio_sources; i++) + { + if (inactive_audio_sources[i] == src) { + inactive_audio_sources[i] = inactive_audio_sources[--num_inactive_audio_sources]; + found = 1; + break; + } + } + if (!found) { + render_pause_source(src); + num_inactive_audio_sources--; + } free(src->front); if (render_is_audio_sync()) { @@ -246,7 +257,6 @@ render_free_audio_opaque(src->opaque); } free(src); - num_inactive_audio_sources--; } static int16_t lowpass_sample(audio_source *src, int16_t last, int16_t current)