: _in_rate (in)
, _out_rate (out)
, _channels (channels)
+ , _fast (false)
{
int error;
_src = src_new (SRC_SINC_BEST_QUALITY, _channels, &error);
Resampler::~Resampler ()
{
- src_delete (_src);
+ if (_src) {
+ src_delete (_src);
+ }
}
void
-Resampler::set_fast ()
+Resampler::set_fast (bool fast)
{
+ if (fast == _fast) {
+ return;
+ }
+
+ _fast = fast;
+
src_delete (_src);
+ _src = 0;
+
int error;
- _src = src_new (SRC_LINEAR, _channels, &error);
+ _src = src_new (_fast ? SRC_LINEAR : SRC_SINC_BEST_QUALITY, _channels, &error);
if (!_src) {
throw runtime_error (String::compose (N_("could not create sample-rate converter (%1)"), error));
}
}
-pair<shared_ptr<const AudioBuffers>, Frame>
-Resampler::run (shared_ptr<const AudioBuffers> in, Frame frame)
+shared_ptr<const AudioBuffers>
+Resampler::run (shared_ptr<const AudioBuffers> in)
{
- if (!_next_in || !_next_out || _next_in.get() != frame) {
- /* Either there was a discontinuity in the input or this is the first input;
- reset _next_out.
- */
- _next_out = lrintf (frame * _out_rate / _in_rate);
- }
-
- /* Expected next input frame */
- _next_in = frame + in->frames ();
-
int in_frames = in->frames ();
int in_offset = 0;
int out_offset = 0;
}
if (data.output_frames_gen == 0) {
+ delete[] data.data_in;
+ delete[] data.data_out;
break;
}
delete[] data.data_out;
}
- Frame out_frame = _next_out.get ();
-
- /* Expected next output frame */
- _next_out = _next_out.get() + resampled->frames();
-
- return make_pair (resampled, out_frame);
+ return resampled;
}
shared_ptr<const AudioBuffers>
delete[] buffer;
return out;
}
+
+void
+Resampler::reset ()
+{
+ src_reset (_src);
+}