Fix threaded audio race conditions.

This commit is contained in:
Themaister 2013-07-15 21:35:47 +02:00
parent bb0993b6eb
commit a543b5da74
4 changed files with 14 additions and 7 deletions

View File

@ -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,

View File

@ -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)

View File

@ -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);

View File

@ -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)