diff --git a/src/media/audio/resampler.cpp b/src/media/audio/resampler.cpp index d61741a6780e14558caf76c327bf59909d2dd5f5..f7db0ea26171e870019a4887f63db32e7ff643ff 100644 --- a/src/media/audio/resampler.cpp +++ b/src/media/audio/resampler.cpp @@ -100,4 +100,33 @@ Resampler::resample(const AudioBuffer& dataIn, AudioBuffer& dataOut) output->nb_samples, output->channels); } +std::unique_ptr<AudioFrame> +Resampler::resample(std::unique_ptr<AudioFrame>&& in, const AudioFormat& format) +{ + if (in->pointer()->sample_rate == format.sample_rate && + in->pointer()->channels == format.nb_channels && + (AVSampleFormat)in->pointer()->format == format.sampleFormat) + { + return std::move(in); + } + auto output = std::make_unique<AudioFrame>(format); + resample(in->pointer(), output->pointer()); + return output; +} + +std::shared_ptr<AudioFrame> +Resampler::resample(std::shared_ptr<AudioFrame>&& in, const AudioFormat& format) +{ + if (in->pointer()->sample_rate == format.sample_rate && + in->pointer()->channels == format.nb_channels && + (AVSampleFormat)in->pointer()->format == format.sampleFormat) + { + return std::move(in); + } + auto output = std::make_shared<AudioFrame>(format); + resample(in->pointer(), output->pointer()); + return output; +} + + } // namespace ring diff --git a/src/media/audio/resampler.h b/src/media/audio/resampler.h index 9ab237899edfeef19358b10937b7350495807939..8395fbb9d38a063afe3feefe4ec44afcd63ebc5f 100644 --- a/src/media/audio/resampler.h +++ b/src/media/audio/resampler.h @@ -51,6 +51,9 @@ class Resampler { */ void resample(const AudioBuffer& dataIn, AudioBuffer& dataOut); + std::unique_ptr<AudioFrame> resample(std::unique_ptr<AudioFrame>&& in, const AudioFormat& out); + std::shared_ptr<AudioFrame> resample(std::shared_ptr<AudioFrame>&& in, const AudioFormat& out); + private: NON_COPYABLE(Resampler);