Better audio quality when fast forwarding.

This commit is contained in:
Themaister 2010-08-16 20:17:01 +02:00
parent bfb84984f8
commit 9cebdc51cc

22
ssnes.c
View File

@ -72,6 +72,10 @@ static void save_file(const char* path, int type);
// To avoid continous switching if we hold the button down, we require that the button must go from pressed, unpressed back to pressed to be able to toggle between then. // To avoid continous switching if we hold the button down, we require that the button must go from pressed, unpressed back to pressed to be able to toggle between then.
#define AUDIO_CHUNK_SIZE_BLOCKING 64
#define AUDIO_CHUNK_SIZE_NONBLOCKING 1024 // So we don't get complete line-noise when fast-forwarding audio.
static size_t audio_chunk_size = AUDIO_CHUNK_SIZE_BLOCKING;
void set_fast_forward_button(bool new_button_state) void set_fast_forward_button(bool new_button_state)
{ {
static bool old_button_state = false; static bool old_button_state = false;
@ -81,6 +85,10 @@ void set_fast_forward_button(bool new_button_state)
syncing_state = !syncing_state; syncing_state = !syncing_state;
driver.video->set_nonblock_state(driver.video_data, syncing_state); driver.video->set_nonblock_state(driver.video_data, syncing_state);
driver.audio->set_nonblock_state(driver.audio_data, syncing_state); driver.audio->set_nonblock_state(driver.audio_data, syncing_state);
if (syncing_state)
audio_chunk_size = AUDIO_CHUNK_SIZE_NONBLOCKING;
else
audio_chunk_size = AUDIO_CHUNK_SIZE_BLOCKING;
} }
old_button_state = new_button_state; old_button_state = new_button_state;
} }
@ -212,30 +220,28 @@ static void video_frame(const uint16_t *data, unsigned width, unsigned height)
} }
#define SRC_SAMPLES 64
static void audio_sample(uint16_t left, uint16_t right) static void audio_sample(uint16_t left, uint16_t right)
{ {
if ( !audio_active ) if ( !audio_active )
return; return;
static float data[SRC_SAMPLES]; static float data[AUDIO_CHUNK_SIZE_NONBLOCKING];
static int data_ptr = 0; static int data_ptr = 0;
data[data_ptr++] = (float)(*(int16_t*)&left)/0x7FFF; data[data_ptr++] = (float)(*(int16_t*)&left)/0x7FFF;
data[data_ptr++] = (float)(*(int16_t*)&right)/0x7FFF; data[data_ptr++] = (float)(*(int16_t*)&right)/0x7FFF;
if ( data_ptr == SRC_SAMPLES ) if ( data_ptr >= audio_chunk_size )
{ {
float outsamples[SRC_SAMPLES * 16]; float outsamples[audio_chunk_size * 16];
int16_t temp_outsamples[SRC_SAMPLES * 16]; int16_t temp_outsamples[audio_chunk_size * 16];
SRC_DATA src_data; SRC_DATA src_data;
src_data.data_in = data; src_data.data_in = data;
src_data.data_out = outsamples; src_data.data_out = outsamples;
src_data.input_frames = SRC_SAMPLES / 2; src_data.input_frames = audio_chunk_size / 2;
src_data.output_frames = SRC_SAMPLES * 8; src_data.output_frames = audio_chunk_size * 8;
src_data.end_of_input = 0; src_data.end_of_input = 0;
src_data.src_ratio = (double)out_rate / (double)in_rate; src_data.src_ratio = (double)out_rate / (double)in_rate;