diff options
Diffstat (limited to 'lib/rbcodec/dsp/resample.c')
| -rw-r--r-- | lib/rbcodec/dsp/resample.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/lib/rbcodec/dsp/resample.c b/lib/rbcodec/dsp/resample.c index 6e7e5b7..0a97bdf 100644 --- a/lib/rbcodec/dsp/resample.c +++ b/lib/rbcodec/dsp/resample.c @@ -25,6 +25,7 @@ #include "fracmul.h" #include "fixedpoint.h" #include "dsp_proc_entry.h" +#include "dsp_misc.h" #include <string.h> /** @@ -50,9 +51,10 @@ static struct resample_data int32_t history[2][3]; /* 08h: Last samples for interpolation (L+R) 0 = oldest, 2 = newest */ /* 20h */ - int32_t frequency; /* Virtual samplerate */ + unsigned int frequency; /* Virtual input samplerate */ + unsigned int frequency_out; /* Resampler output samplerate */ struct dsp_buffer resample_buf; /* Buffer descriptor for resampled data */ - int32_t *resample_out_p[2]; /* Actual output buffer pointers */ + int32_t *resample_out_p[2]; /* Actual output buffer pointers */ } resample_data[DSP_COUNT] IBSS_ATTR; /* Actual worker function. Implemented here or in target assembly code. */ @@ -73,14 +75,16 @@ static void resample_flush(struct dsp_proc_entry *this) } static bool resample_new_delta(struct resample_data *data, - struct sample_format *format) + struct sample_format *format, + unsigned int fout) { - int32_t frequency = format->frequency; /* virtual samplerate */ + unsigned int frequency = format->frequency; /* virtual samplerate */ data->frequency = frequency; - data->delta = fp_div(frequency, NATIVE_FREQUENCY, 16); + data->frequency_out = fout; + data->delta = fp_div(frequency, fout, 16); - if (frequency == NATIVE_FREQUENCY) + if (frequency == data->frequency_out) { /* NOTE: If fully glitch-free transistions from no resampling to resampling are desired, history should be maintained even when @@ -232,20 +236,23 @@ static intptr_t resample_new_format(struct dsp_proc_entry *this, DSP_PRINT_FORMAT(DSP_PROC_RESAMPLE, *format); - int32_t frequency = data->frequency; + unsigned int frequency = data->frequency; + unsigned int fout = dsp_get_output_frequency(dsp); bool active = dsp_proc_active(dsp, DSP_PROC_RESAMPLE); - if (format->frequency != frequency) + if ((unsigned int)format->frequency != frequency || + data->frequency_out != fout) { - DEBUGF(" DSP_PROC_RESAMPLE- new delta\n"); - active = resample_new_delta(data, format); + DEBUGF(" DSP_PROC_RESAMPLE- new settings: %u %u\n", + format->frequency, fout); + active = resample_new_delta(data, format, fout); dsp_proc_activate(dsp, DSP_PROC_RESAMPLE, active); } - /* Everything after us is NATIVE_FREQUENCY */ + /* Everything after us is fout */ dst->format = *format; - dst->format.frequency = NATIVE_FREQUENCY; - dst->format.codec_frequency = NATIVE_FREQUENCY; + dst->format.frequency = fout; + dst->format.codec_frequency = fout; if (active) return PROC_NEW_FORMAT_OK; @@ -287,8 +294,10 @@ static void INIT_ATTR resample_dsp_init(struct dsp_config *dsp, static void INIT_ATTR resample_proc_init(struct dsp_proc_entry *this, struct dsp_config *dsp) { + struct resample_data *data = &resample_data[dsp_get_id(dsp)]; + this->data = (intptr_t)data; dsp_proc_set_in_place(dsp, DSP_PROC_RESAMPLE, false); - this->data = (intptr_t)&resample_data[dsp_get_id(dsp)]; + data->frequency_out = DSP_OUT_DEFAULT_HZ; this->process = resample_process; } @@ -322,6 +331,10 @@ static intptr_t resample_configure(struct dsp_proc_entry *this, case DSP_PROC_NEW_FORMAT: retval = resample_new_format(this, dsp, (struct sample_format *)value); break; + + case DSP_SET_OUT_FREQUENCY: + dsp_proc_want_format_update(dsp, DSP_PROC_RESAMPLE); + break; } return retval; |