Commit 479e441a authored by Stefan Westerfeld's avatar Stefan Westerfeld

Use zita resampler instead of libsamplerate for performance reasons.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 12d2aac6
...@@ -18,13 +18,11 @@ AC_DEFUN([AC_SNDFILE_REQUIREMENTS], ...@@ -18,13 +18,11 @@ AC_DEFUN([AC_SNDFILE_REQUIREMENTS],
]) ])
dnl dnl
dnl samplerate dnl zita resampler
dnl dnl
AC_DEFUN([AC_SAMPLERATE_REQUIREMENTS], AC_DEFUN([AC_ZITA_REQUIREMENTS],
[ [
PKG_CHECK_MODULES(SAMPLERATE, [samplerate]) AC_CHECK_LIB(zita-resampler, _Z28zita_resampler_major_versionv)
AC_SUBST(SAMPLERATE_CFLAGS)
AC_SUBST(SAMPLERATE_LIBS)
]) ])
dnl FFTW3 dnl FFTW3
...@@ -55,7 +53,7 @@ AC_DEFUN([AC_FFTW_CHECK], ...@@ -55,7 +53,7 @@ AC_DEFUN([AC_FFTW_CHECK],
]) ])
AC_SNDFILE_REQUIREMENTS AC_SNDFILE_REQUIREMENTS
AC_SAMPLERATE_REQUIREMENTS AC_ZITA_REQUIREMENTS
AC_FFTW_CHECK AC_FFTW_CHECK
AM_PATH_LIBGCRYPT AM_PATH_LIBGCRYPT
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
#include "convcode.hh" #include "convcode.hh"
#include "random.hh" #include "random.hh"
#include "samplerate.h" #include <zita-resampler/resampler.h>
#include <assert.h> #include <assert.h>
...@@ -507,22 +507,32 @@ resample (const WavData& wav_data, int rate) ...@@ -507,22 +507,32 @@ resample (const WavData& wav_data, int rate)
if (rate == wav_data.sample_rate()) if (rate == wav_data.sample_rate())
return wav_data; return wav_data;
double ratio = double (rate) / wav_data.sample_rate(); Resampler resampler;
const int n_channels = wav_data.n_channels();
const int hlen = 16;
const double ratio = double (rate) / wav_data.sample_rate();
const vector<float>& in = wav_data.samples(); const vector<float>& in = wav_data.samples();
vector<float> out (lrint (in.size() / wav_data.n_channels() * ratio) * wav_data.n_channels()); vector<float> out (lrint (in.size() / n_channels * ratio) * n_channels);
SRC_DATA data; resampler.setup (wav_data.sample_rate(), rate, n_channels, hlen);
data.data_in = &in[0]; resampler.out_count = out.size() / n_channels;
data.data_out = &out[0]; resampler.out_data = &out[0];
data.input_frames = in.size() / wav_data.n_channels();
data.output_frames = out.size() / wav_data.n_channels(); /* avoid timeshift: zita needs k/2 - 1 samples before the actual input */
data.src_ratio = ratio; resampler.inp_count = resampler.inpsize () / 2 - 1;
if (src_simple (&data, SRC_SINC_MEDIUM_QUALITY, wav_data.n_channels()) != 0) resampler.inp_data = nullptr;
{ resampler.process();
fprintf (stderr, "audiowmark: resampling error occurred\n");
exit (1); resampler.inp_count = in.size() / n_channels;
} resampler.inp_data = (float *) &in[0];
resampler.process();
/* zita needs k/2 samples after the actual input */
resampler.inp_count = resampler.inpsize() / 2;
resampler.inp_data = nullptr;
resampler.process();
return WavData (out, wav_data.n_channels(), rate, wav_data.bit_depth()); return WavData (out, wav_data.n_channels(), rate, wav_data.bit_depth());
} }
......
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