diff options
author | Michael Pavone <pavone@retrodev.com> | 2019-06-29 00:17:22 -0700 |
---|---|---|
committer | Michael Pavone <pavone@retrodev.com> | 2019-06-29 00:17:22 -0700 |
commit | ee2742873a4d309607aec6e86cc9f9a2977926e6 (patch) | |
tree | bb2f6ec14987e7ea84a2b03bc3cdb0d9fabd2a6f /render_audio.c | |
parent | 995df2192d208ef60a3c3e13655f30597b706636 (diff) |
Properly handle freeing a paused audio source. Fixes crash when repeatedly reloading a ROM or loading a sequence of different ROMs
Diffstat (limited to 'render_audio.c')
-rw-r--r-- | render_audio.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/render_audio.c b/render_audio.c index 39a9ccd..8560159 100644 --- a/render_audio.c +++ b/render_audio.c @@ -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_resume_source(audio_source *src) 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 @@ void render_free_source(audio_source *src) 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) |