comparison render_audio.c @ 1870:e4671a39d155

Properly handle freeing a paused audio source. Fixes crash when repeatedly reloading a ROM or loading a sequence of different ROMs
author Michael Pavone <pavone@retrodev.com>
date Sat, 29 Jun 2019 00:17:22 -0700
parents 4c322abd9fa5
children cfd53c94fffb
comparison
equal deleted inserted replaced
1869:dc94354eab66 1870:e4671a39d155
7 #include "config.h" 7 #include "config.h"
8 #include "blastem.h" 8 #include "blastem.h"
9 9
10 static uint8_t output_channels; 10 static uint8_t output_channels;
11 static uint32_t buffer_samples, sample_rate; 11 static uint32_t buffer_samples, sample_rate;
12 static uint32_t missing_count;
13 12
14 static audio_source *audio_sources[8]; 13 static audio_source *audio_sources[8];
15 static audio_source *inactive_audio_sources[8]; 14 static audio_source *inactive_audio_sources[8];
16 static uint8_t num_audio_sources; 15 static uint8_t num_audio_sources;
17 static uint8_t num_inactive_audio_sources; 16 static uint8_t num_inactive_audio_sources;
236 render_source_resumed(src); 235 render_source_resumed(src);
237 } 236 }
238 237
239 void render_free_source(audio_source *src) 238 void render_free_source(audio_source *src)
240 { 239 {
241 render_pause_source(src); 240 uint8_t found = 0;
241 for (uint8_t i = 0; i < num_inactive_audio_sources; i++)
242 {
243 if (inactive_audio_sources[i] == src) {
244 inactive_audio_sources[i] = inactive_audio_sources[--num_inactive_audio_sources];
245 found = 1;
246 break;
247 }
248 }
249 if (!found) {
250 render_pause_source(src);
251 num_inactive_audio_sources--;
252 }
242 253
243 free(src->front); 254 free(src->front);
244 if (render_is_audio_sync()) { 255 if (render_is_audio_sync()) {
245 free(src->back); 256 free(src->back);
246 render_free_audio_opaque(src->opaque); 257 render_free_audio_opaque(src->opaque);
247 } 258 }
248 free(src); 259 free(src);
249 num_inactive_audio_sources--;
250 } 260 }
251 261
252 static int16_t lowpass_sample(audio_source *src, int16_t last, int16_t current) 262 static int16_t lowpass_sample(audio_source *src, int16_t last, int16_t current)
253 { 263 {
254 int32_t tmp = current * src->lowpass_alpha + last * (0x10000 - src->lowpass_alpha); 264 int32_t tmp = current * src->lowpass_alpha + last * (0x10000 - src->lowpass_alpha);