From bb5e31df0d2c6c645bf3d5c2bf393bf993f188d8 Mon Sep 17 00:00:00 2001 From: Themaister Date: Sun, 20 Nov 2011 02:06:25 +0100 Subject: [PATCH] Still record audio even if audio is not enabled. --- driver.c | 40 +++++++++++++++++++++++----------------- ssnes.c | 17 +++++++---------- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/driver.c b/driver.c index 6f6752264f..6cf71584e0 100644 --- a/driver.c +++ b/driver.c @@ -261,6 +261,17 @@ static void adjust_audio_input_rate(void) #define AUDIO_MAX_RATIO 16 void init_audio(void) { + // Accomodate rewind since at some point we might have two full buffers. + size_t max_bufsamples = AUDIO_CHUNK_SIZE_NONBLOCKING * 2; + + // Used for recording even if audio isn't enabled. + assert((g_extern.audio_data.conv_outsamples = malloc(max_bufsamples * sizeof(int16_t) * AUDIO_MAX_RATIO))); + g_extern.audio_data.chunk_size = g_extern.audio_data.block_chunk_size; + + // Needs to be able to hold full content of a full max_bufsamples in addition to its own. + assert((g_extern.audio_data.rewind_buf = malloc(max_bufsamples * sizeof(int16_t)))); + g_extern.audio_data.rewind_size = max_bufsamples; + if (!g_settings.audio.enable) { g_extern.audio_active = false; @@ -273,7 +284,9 @@ void init_audio(void) g_extern.audio_data.block_chunk_size = AUDIO_CHUNK_SIZE_BLOCKING; g_extern.audio_data.nonblock_chunk_size = AUDIO_CHUNK_SIZE_NONBLOCKING; - driver.audio_data = driver.audio->init(strlen(g_settings.audio.device) ? g_settings.audio.device : NULL, g_settings.audio.out_rate, g_settings.audio.latency); + driver.audio_data = driver.audio->init(*g_settings.audio.device ? g_settings.audio.device : NULL, + g_settings.audio.out_rate, g_settings.audio.latency); + if (!driver.audio_data) g_extern.audio_active = false; @@ -285,27 +298,15 @@ void init_audio(void) driver.audio->set_nonblock_state(driver.audio_data, true); g_extern.audio_data.chunk_size = g_extern.audio_data.nonblock_chunk_size; } - else - g_extern.audio_data.chunk_size = g_extern.audio_data.block_chunk_size; g_extern.audio_data.source = hermite_new(); if (!g_extern.audio_data.source) g_extern.audio_active = false; - size_t max_bufsamples = g_extern.audio_data.block_chunk_size > g_extern.audio_data.nonblock_chunk_size ? - g_extern.audio_data.block_chunk_size : g_extern.audio_data.nonblock_chunk_size; - - max_bufsamples *= 2; // Accomodate rewind since at some point we might have two full buffers. - assert((g_extern.audio_data.data = malloc(max_bufsamples * sizeof(float)))); g_extern.audio_data.data_ptr = 0; assert(g_settings.audio.out_rate < g_settings.audio.in_rate * AUDIO_MAX_RATIO); assert((g_extern.audio_data.outsamples = malloc(max_bufsamples * sizeof(float) * AUDIO_MAX_RATIO))); - assert((g_extern.audio_data.conv_outsamples = malloc(max_bufsamples * sizeof(int16_t) * AUDIO_MAX_RATIO))); - - // Needs to be able to hold full content of a full max_bufsamples in addition to its own. - assert((g_extern.audio_data.rewind_buf = malloc(max_bufsamples * sizeof(int16_t)))); - g_extern.audio_data.rewind_size = max_bufsamples; g_extern.audio_data.src_ratio = (double)g_settings.audio.out_rate / g_settings.audio.in_rate; @@ -315,6 +316,11 @@ void init_audio(void) void uninit_audio(void) { + free(g_extern.audio_data.conv_outsamples); g_extern.audio_data.conv_outsamples = NULL; + g_extern.audio_data.data_ptr = 0; + free(g_extern.audio_data.rewind_buf); + g_extern.audio_data.rewind_buf = NULL; + if (!g_settings.audio.enable) { g_extern.audio_active = false; @@ -327,10 +333,10 @@ void uninit_audio(void) if (g_extern.audio_data.source) hermite_free(g_extern.audio_data.source); - free(g_extern.audio_data.data); g_extern.audio_data.data = NULL; - free(g_extern.audio_data.outsamples); g_extern.audio_data.outsamples = NULL; - free(g_extern.audio_data.conv_outsamples); g_extern.audio_data.conv_outsamples = NULL; - free(g_extern.audio_data.rewind_buf); g_extern.audio_data.rewind_buf = NULL; + free(g_extern.audio_data.data); + g_extern.audio_data.data = NULL; + free(g_extern.audio_data.outsamples); + g_extern.audio_data.outsamples = NULL; deinit_dsp_plugin(); } diff --git a/ssnes.c b/ssnes.c index 3182d96737..df89f03353 100644 --- a/ssnes.c +++ b/ssnes.c @@ -257,6 +257,8 @@ static bool audio_flush(const int16_t *data, unsigned samples) if (g_extern.is_paused) return true; + if (!g_extern.audio_active) + return false; const float *output_data = NULL; unsigned output_frames = 0; @@ -308,7 +310,8 @@ static bool audio_flush(const int16_t *data, unsigned samples) audio_convert_float_to_s16(g_extern.audio_data.conv_outsamples, output_data, output_frames * 2); - if (driver.audio->write(driver.audio_data, g_extern.audio_data.conv_outsamples, output_frames * sizeof(int16_t) * 2) < 0) + if (driver.audio->write(driver.audio_data, g_extern.audio_data.conv_outsamples, + output_frames * sizeof(int16_t) * 2) < 0) { fprintf(stderr, "SSNES [ERROR]: Audio backend failed to write. Will continue without sound.\n"); return false; @@ -320,18 +323,12 @@ static bool audio_flush(const int16_t *data, unsigned samples) static void audio_sample_rewind(uint16_t left, uint16_t right) { - if (!g_extern.audio_active) - return; - g_extern.audio_data.rewind_buf[--g_extern.audio_data.rewind_ptr] = right; g_extern.audio_data.rewind_buf[--g_extern.audio_data.rewind_ptr] = left; } static void audio_sample(uint16_t left, uint16_t right) { - if (!g_extern.audio_active) - return; - g_extern.audio_data.conv_outsamples[g_extern.audio_data.data_ptr++] = left; g_extern.audio_data.conv_outsamples[g_extern.audio_data.data_ptr++] = right; @@ -339,7 +336,7 @@ static void audio_sample(uint16_t left, uint16_t right) return; g_extern.audio_active = audio_flush(g_extern.audio_data.conv_outsamples, - g_extern.audio_data.data_ptr); + g_extern.audio_data.data_ptr) && g_extern.audio_active; g_extern.audio_data.data_ptr = 0; } @@ -1517,10 +1514,10 @@ static void check_input_rate(void) static inline void flush_rewind_audio(void) { - if (g_extern.frame_is_reverse && g_extern.audio_active) // We just rewound. Flush rewind audio buffer. + if (g_extern.frame_is_reverse) // We just rewound. Flush rewind audio buffer. { g_extern.audio_active = audio_flush(g_extern.audio_data.rewind_buf + g_extern.audio_data.rewind_ptr, - g_extern.audio_data.rewind_size - g_extern.audio_data.rewind_ptr); + g_extern.audio_data.rewind_size - g_extern.audio_data.rewind_ptr) && g_extern.audio_active; } }