From 5ba90cd8ea87cf97d64409b7b4c59033c2450c77 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 11 Nov 2013 22:31:46 +0100 Subject: pcm/PcmResampler: convert to abstract interface The PcmResampler interface is implemented by the two classes FallbackPcmResampler and LibsampleratePcmResampler. This prepares for adding more resampler libraries. --- src/pcm/GlueResampler.cxx | 99 +++++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 54 deletions(-) (limited to 'src/pcm/GlueResampler.cxx') diff --git a/src/pcm/GlueResampler.cxx b/src/pcm/GlueResampler.cxx index 8aee98f38..ef80e08a5 100644 --- a/src/pcm/GlueResampler.cxx +++ b/src/pcm/GlueResampler.cxx @@ -19,76 +19,67 @@ #include "config.h" #include "GlueResampler.hxx" -#include "PcmConvert.hxx" -#include "PcmFormat.hxx" -#include "util/ConstBuffer.hxx" -#include "util/Error.hxx" +#include "ConfiguredResampler.hxx" +#include "Resampler.hxx" + +#include + +GluePcmResampler::GluePcmResampler() + :resampler(pcm_resampler_create()) {} + +GluePcmResampler::~GluePcmResampler() +{ + delete resampler; +} bool -GluePcmResampler::Open(AudioFormat _src_format, unsigned _new_sample_rate, - gcc_unused Error &error) +GluePcmResampler::Open(AudioFormat src_format, unsigned new_sample_rate, + Error &error) { - src_format = _src_format; - new_sample_rate = _new_sample_rate; + assert(src_format.IsValid()); + assert(audio_valid_sample_rate(new_sample_rate)); + + AudioFormat requested_format = src_format; + AudioFormat dest_format = resampler->Open(requested_format, + new_sample_rate, + error); + if (!dest_format.IsValid()) + return false; + + assert(requested_format.channels == src_format.channels); + assert(dest_format.channels == src_format.channels); + assert(dest_format.sample_rate == new_sample_rate); + if (requested_format.format != src_format.format && + !format_converter.Open(src_format.format, requested_format.format, + error)) + return false; + + src_sample_format = src_format.format; + requested_sample_format = requested_format.format; + output_sample_format = dest_format.format; return true; } void GluePcmResampler::Close() { - resampler.Reset(); + if (requested_sample_format != src_sample_format) + format_converter.Close(); + + resampler->Close(); } ConstBuffer GluePcmResampler::Resample(ConstBuffer src, Error &error) { - const void *result; - size_t size; - - switch (src_format.format) { - case SampleFormat::S16: - result = resampler.Resample16(src_format.channels, - src_format.sample_rate, - (const int16_t *)src.data, - src.size, - new_sample_rate, &size, - error); - break; - - case SampleFormat::S24_P32: - result = resampler.Resample24(src_format.channels, - src_format.sample_rate, - (const int32_t *)src.data, - src.size, - new_sample_rate, &size, - error); - break; - - case SampleFormat::S32: - result = resampler.Resample24(src_format.channels, - src_format.sample_rate, - (const int32_t *)src.data, - src.size, - new_sample_rate, &size, - error); - break; - - case SampleFormat::FLOAT: - result = resampler.ResampleFloat(src_format.channels, - src_format.sample_rate, - (const float *)src.data, - src.size, - new_sample_rate, &size, - error); - break; + assert(!src.IsNull()); - default: - error.Format(pcm_convert_domain, - "Resampling %s is not implemented", - sample_format_to_string(src_format.format)); - return nullptr; + if (requested_sample_format != src_sample_format) { + src = format_converter.Convert(src, error); + if (src.IsNull()) + return nullptr; } - return { result, size }; + return resampler->Resample(src, error); } -- cgit v1.2.3