Commit 5bbcbfb7 authored by Max Kellermann's avatar Max Kellermann

pcm_resample: moved code to pcm_resample_set()

A future patch will implement a 24 bit resampler. To unify code, move code which can be shared to a separate function.
parent 1dcb946f
...@@ -62,30 +62,23 @@ out: ...@@ -62,30 +62,23 @@ out:
return convalgo; return convalgo;
} }
size_t static void
pcm_resample_16(uint8_t channels, pcm_resample_set(struct pcm_resample_state *state,
unsigned src_rate, uint8_t channels, unsigned src_rate, unsigned dest_rate)
const int16_t *src_buffer, size_t src_size,
unsigned dest_rate,
int16_t *dest_buffer, size_t dest_size,
struct pcm_resample_state *state)
{ {
static int convalgo = -1; static int convalgo = -1;
SRC_DATA *data = &state->data;
size_t data_in_size;
size_t data_out_size;
int error; int error;
SRC_DATA *data = &state->data;
assert((src_size % (sizeof(*src_buffer) * channels)) == 0);
assert((dest_size % (sizeof(*dest_buffer) * channels)) == 0);
if (convalgo < 0) if (convalgo < 0)
convalgo = pcm_resample_get_converter(); convalgo = pcm_resample_get_converter();
/* (re)set the state/ratio if the in or out format changed */ /* (re)set the state/ratio if the in or out format changed */
if (channels != state->prev.channels || if (channels == state->prev.channels &&
src_rate != state->prev.src_rate || src_rate == state->prev.src_rate &&
dest_rate != state->prev.dest_rate) { dest_rate == state->prev.dest_rate)
return;
state->error = false; state->error = false;
state->prev.channels = channels; state->prev.channels = channels;
state->prev.src_rate = src_rate; state->prev.src_rate = src_rate;
...@@ -99,14 +92,32 @@ pcm_resample_16(uint8_t channels, ...@@ -99,14 +92,32 @@ pcm_resample_16(uint8_t channels,
ERROR("cannot create new libsamplerate state: %s\n", ERROR("cannot create new libsamplerate state: %s\n",
src_strerror(error)); src_strerror(error));
state->error = true; state->error = true;
return 0; return;
} }
data->src_ratio = (double)dest_rate / (double)src_rate; data->src_ratio = (double)dest_rate / (double)src_rate;
DEBUG("setting samplerate conversion ratio to %.2lf\n", DEBUG("setting samplerate conversion ratio to %.2lf\n",
data->src_ratio); data->src_ratio);
src_set_ratio(state->state, data->src_ratio); src_set_ratio(state->state, data->src_ratio);
} }
size_t
pcm_resample_16(uint8_t channels,
unsigned src_rate,
const int16_t *src_buffer, size_t src_size,
unsigned dest_rate,
int16_t *dest_buffer, size_t dest_size,
struct pcm_resample_state *state)
{
SRC_DATA *data = &state->data;
size_t data_in_size;
size_t data_out_size;
int error;
assert((src_size % (sizeof(*src_buffer) * channels)) == 0);
assert((dest_size % (sizeof(*dest_buffer) * channels)) == 0);
pcm_resample_set(state, channels, src_rate, dest_rate);
/* there was an error previously, and nothing has changed */ /* there was an error previously, and nothing has changed */
if (state->error) if (state->error)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment