summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2019-06-29 00:17:22 -0700
committerMichael Pavone <pavone@retrodev.com>2019-06-29 00:17:22 -0700
commitee2742873a4d309607aec6e86cc9f9a2977926e6 (patch)
treebb2f6ec14987e7ea84a2b03bc3cdb0d9fabd2a6f
parent995df2192d208ef60a3c3e13655f30597b706636 (diff)
Properly handle freeing a paused audio source. Fixes crash when repeatedly reloading a ROM or loading a sequence of different ROMs
-rw-r--r--render_audio.c16
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)