mirror of
https://github.com/libretro/RetroArch
synced 2025-04-09 21:45:45 +00:00
Still record audio even if audio is not enabled.
This commit is contained in:
parent
e49d216884
commit
bb5e31df0d
40
driver.c
40
driver.c
@ -261,6 +261,17 @@ static void adjust_audio_input_rate(void)
|
|||||||
#define AUDIO_MAX_RATIO 16
|
#define AUDIO_MAX_RATIO 16
|
||||||
void init_audio(void)
|
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)
|
if (!g_settings.audio.enable)
|
||||||
{
|
{
|
||||||
g_extern.audio_active = false;
|
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.block_chunk_size = AUDIO_CHUNK_SIZE_BLOCKING;
|
||||||
g_extern.audio_data.nonblock_chunk_size = AUDIO_CHUNK_SIZE_NONBLOCKING;
|
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)
|
if (!driver.audio_data)
|
||||||
g_extern.audio_active = false;
|
g_extern.audio_active = false;
|
||||||
|
|
||||||
@ -285,27 +298,15 @@ void init_audio(void)
|
|||||||
driver.audio->set_nonblock_state(driver.audio_data, true);
|
driver.audio->set_nonblock_state(driver.audio_data, true);
|
||||||
g_extern.audio_data.chunk_size = g_extern.audio_data.nonblock_chunk_size;
|
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();
|
g_extern.audio_data.source = hermite_new();
|
||||||
if (!g_extern.audio_data.source)
|
if (!g_extern.audio_data.source)
|
||||||
g_extern.audio_active = false;
|
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))));
|
assert((g_extern.audio_data.data = malloc(max_bufsamples * sizeof(float))));
|
||||||
g_extern.audio_data.data_ptr = 0;
|
g_extern.audio_data.data_ptr = 0;
|
||||||
assert(g_settings.audio.out_rate < g_settings.audio.in_rate * AUDIO_MAX_RATIO);
|
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.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 =
|
g_extern.audio_data.src_ratio =
|
||||||
(double)g_settings.audio.out_rate / g_settings.audio.in_rate;
|
(double)g_settings.audio.out_rate / g_settings.audio.in_rate;
|
||||||
@ -315,6 +316,11 @@ void init_audio(void)
|
|||||||
|
|
||||||
void uninit_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)
|
if (!g_settings.audio.enable)
|
||||||
{
|
{
|
||||||
g_extern.audio_active = false;
|
g_extern.audio_active = false;
|
||||||
@ -327,10 +333,10 @@ void uninit_audio(void)
|
|||||||
if (g_extern.audio_data.source)
|
if (g_extern.audio_data.source)
|
||||||
hermite_free(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.data);
|
||||||
free(g_extern.audio_data.outsamples); g_extern.audio_data.outsamples = NULL;
|
g_extern.audio_data.data = NULL;
|
||||||
free(g_extern.audio_data.conv_outsamples); g_extern.audio_data.conv_outsamples = NULL;
|
free(g_extern.audio_data.outsamples);
|
||||||
free(g_extern.audio_data.rewind_buf); g_extern.audio_data.rewind_buf = NULL;
|
g_extern.audio_data.outsamples = NULL;
|
||||||
|
|
||||||
deinit_dsp_plugin();
|
deinit_dsp_plugin();
|
||||||
}
|
}
|
||||||
|
17
ssnes.c
17
ssnes.c
@ -257,6 +257,8 @@ static bool audio_flush(const int16_t *data, unsigned samples)
|
|||||||
|
|
||||||
if (g_extern.is_paused)
|
if (g_extern.is_paused)
|
||||||
return true;
|
return true;
|
||||||
|
if (!g_extern.audio_active)
|
||||||
|
return false;
|
||||||
|
|
||||||
const float *output_data = NULL;
|
const float *output_data = NULL;
|
||||||
unsigned output_frames = 0;
|
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,
|
audio_convert_float_to_s16(g_extern.audio_data.conv_outsamples,
|
||||||
output_data, output_frames * 2);
|
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");
|
fprintf(stderr, "SSNES [ERROR]: Audio backend failed to write. Will continue without sound.\n");
|
||||||
return false;
|
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)
|
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] = right;
|
||||||
g_extern.audio_data.rewind_buf[--g_extern.audio_data.rewind_ptr] = left;
|
g_extern.audio_data.rewind_buf[--g_extern.audio_data.rewind_ptr] = left;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void audio_sample(uint16_t left, uint16_t right)
|
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++] = left;
|
||||||
g_extern.audio_data.conv_outsamples[g_extern.audio_data.data_ptr++] = right;
|
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;
|
return;
|
||||||
|
|
||||||
g_extern.audio_active = audio_flush(g_extern.audio_data.conv_outsamples,
|
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;
|
g_extern.audio_data.data_ptr = 0;
|
||||||
}
|
}
|
||||||
@ -1517,10 +1514,10 @@ static void check_input_rate(void)
|
|||||||
|
|
||||||
static inline void flush_rewind_audio(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_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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user