mirror of
https://github.com/libretro/RetroArch
synced 2025-02-20 15:40:44 +00:00
Fix threaded audio race conditions.
This commit is contained in:
parent
bb0993b6eb
commit
a543b5da74
@ -63,6 +63,7 @@ static void opensl_callback(SLAndroidSimpleBufferQueueItf bq, void *ctx)
|
||||
sl_t *sl = (sl_t*)ctx;
|
||||
__sync_fetch_and_sub(&sl->buffered_blocks, 1);
|
||||
scond_signal(sl->cond);
|
||||
slock_unlock(sl->lock);
|
||||
}
|
||||
|
||||
#define GOTO_IF_FAIL(x) do { \
|
||||
@ -261,6 +262,12 @@ static size_t sl_buffer_size(void *data)
|
||||
return BUFFER_SIZE * sl->buf_count;
|
||||
}
|
||||
|
||||
static bool sl_use_float(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return false;
|
||||
}
|
||||
|
||||
const audio_driver_t audio_opensl = {
|
||||
sl_init,
|
||||
sl_write,
|
||||
@ -268,7 +275,7 @@ const audio_driver_t audio_opensl = {
|
||||
sl_start,
|
||||
sl_set_nonblock_state,
|
||||
sl_free,
|
||||
NULL,
|
||||
sl_use_float,
|
||||
"opensl",
|
||||
sl_write_avail,
|
||||
sl_buffer_size,
|
||||
|
@ -117,7 +117,7 @@ static void audio_thread_set_nonblock_state(void *data, bool state)
|
||||
static bool audio_thread_use_float(void *data)
|
||||
{
|
||||
audio_thread_t *thr = (audio_thread_t*)data;
|
||||
return thr->driver->use_float(thr->driver_data);
|
||||
return thr->driver->use_float && thr->driver->use_float(thr->driver_data);
|
||||
}
|
||||
|
||||
static ssize_t audio_thread_write(void *data, const void *buf, size_t size)
|
||||
|
6
driver.c
6
driver.c
@ -692,6 +692,9 @@ static void compute_monitor_fps_statistics(void)
|
||||
|
||||
void uninit_audio(void)
|
||||
{
|
||||
if (driver.audio_data && driver.audio)
|
||||
driver.audio->free(driver.audio_data);
|
||||
|
||||
free(g_extern.audio_data.conv_outsamples);
|
||||
g_extern.audio_data.conv_outsamples = NULL;
|
||||
g_extern.audio_data.data_ptr = 0;
|
||||
@ -705,9 +708,6 @@ void uninit_audio(void)
|
||||
return;
|
||||
}
|
||||
|
||||
if (driver.audio_data && driver.audio)
|
||||
driver.audio->free(driver.audio_data);
|
||||
|
||||
rarch_resampler_freep(&g_extern.audio_data.resampler, &g_extern.audio_data.resampler_data);
|
||||
|
||||
free(g_extern.audio_data.data);
|
||||
|
@ -2956,9 +2956,9 @@ int rarch_main_init(int argc, char *argv[])
|
||||
return 0;
|
||||
|
||||
error:
|
||||
uninit_drivers();
|
||||
pretro_unload_game();
|
||||
pretro_deinit();
|
||||
uninit_drivers();
|
||||
uninit_libretro_sym();
|
||||
|
||||
g_extern.main_is_init = false;
|
||||
@ -3116,9 +3116,9 @@ void rarch_main_deinit(void)
|
||||
if (!g_extern.libretro_dummy && !g_extern.libretro_no_rom)
|
||||
save_auto_state();
|
||||
|
||||
uninit_drivers();
|
||||
pretro_unload_game();
|
||||
pretro_deinit();
|
||||
uninit_drivers();
|
||||
uninit_libretro_sym();
|
||||
|
||||
if (g_extern.rom_file_temporary)
|
||||
|
Loading…
x
Reference in New Issue
Block a user