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