From 4175514337bf3782755710162d3e30f3baf6e2d4 Mon Sep 17 00:00:00 2001 From: waker Date: Fri, 20 May 2011 22:00:25 +0200 Subject: added automatic samplerate option to resampler, as it was done in 0.4.4 --- plugins/dsp_libsrc/src.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'plugins/dsp_libsrc/src.c') diff --git a/plugins/dsp_libsrc/src.c b/plugins/dsp_libsrc/src.c index 2c909e3d..76262f37 100644 --- a/plugins/dsp_libsrc/src.c +++ b/plugins/dsp_libsrc/src.c @@ -39,6 +39,7 @@ typedef struct { int channels; int quality; float samplerate; + int autosamplerate; SRC_STATE *src; SRC_DATA srcdata; int remaining; // number of input samples in SRC buffer @@ -88,7 +89,13 @@ int ddb_src_process (ddb_dsp_context_t *_src, float *samples, int nframes, int maxframes, ddb_waveformat_t *fmt, float *r) { ddb_src_libsamplerate_t *src = (ddb_src_libsamplerate_t*)_src; - if (fmt->samplerate == src->samplerate) { + int samplerate = src->samplerate; + if (src->autosamplerate) { + DB_output_t *output = deadbeef->get_output (); + samplerate = output->fmt.samplerate; + } + + if (fmt->samplerate == samplerate) { return nframes; } @@ -104,9 +111,9 @@ ddb_src_process (ddb_dsp_context_t *_src, float *samples, int nframes, int maxfr src->need_reset = 0; } - float ratio = src->samplerate / fmt->samplerate; + float ratio = samplerate / fmt->samplerate; ddb_src_set_ratio (_src, ratio); - fmt->samplerate = src->samplerate; + fmt->samplerate = samplerate; int numoutframes = 0; int outsize = nframes*24; @@ -177,7 +184,7 @@ ddb_src_process (ddb_dsp_context_t *_src, float *samples, int nframes, int maxfr //} //fwrite (input, 1, numoutframes*sizeof(float)*(*nchannels), out); - fmt->samplerate = src->samplerate; + fmt->samplerate = samplerate; trace ("src: ratio=%f, in=%d, out=%d\n", ratio, nframes, numoutframes); return numoutframes; } @@ -194,6 +201,8 @@ ddb_src_get_param_name (int p) { return "Quality"; case SRC_PARAM_SAMPLERATE: return "Samplerate"; + case SRC_PARAM_AUTOSAMPLERATE: + return "Auto samplerate"; default: fprintf (stderr, "ddb_src_get_param_name: invalid param index (%d)\n", p); } @@ -215,6 +224,9 @@ ddb_src_set_param (ddb_dsp_context_t *ctx, int p, const char *val) { ((ddb_src_libsamplerate_t*)ctx)->quality = atoi (val); ((ddb_src_libsamplerate_t*)ctx)->quality_changed = 1; break; + case SRC_PARAM_AUTOSAMPLERATE: + ((ddb_src_libsamplerate_t*)ctx)->autosamplerate = atoi (val); + break; default: fprintf (stderr, "ddb_src_set_param: invalid param index (%d)\n", p); } @@ -229,12 +241,16 @@ ddb_src_get_param (ddb_dsp_context_t *ctx, int p, char *val, int sz) { case SRC_PARAM_QUALITY: snprintf (val, sz, "%d", ((ddb_src_libsamplerate_t*)ctx)->quality); break; + case SRC_PARAM_AUTOSAMPLERATE: + snprintf (val, sz, "%d", ((ddb_src_libsamplerate_t*)ctx)->autosamplerate); + break; default: fprintf (stderr, "ddb_src_get_param: invalid param index (%d)\n", p); } } static const char settings_dlg[] = + "property \"Automatic Samplerate (overrides Target Samplerate)\" checkbox 2 0;\n" "property \"Target Samplerate\" spinbtn[8192,192000,1] 0 48000;\n" "property \"Quality / Algorythm\" select[5] 1 2 SINC_BEST_QUALITY SINC_MEDIUM_QUALITY SINC_FASTEST ZERO_ORDER_HOLD LINEAR;\n" ; -- cgit v1.2.3