Mercurial > repos > blastem
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); |