+#include "../../StdAfx.h"\r
+\r
+#include "audio_resampler.h"\r
+\r
+#include <common/exception/exceptions.h>\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (push)\r
+#pragma warning (disable : 4244)\r
+#endif\r
+extern "C" \r
+{\r
+ #include <libavcodec/avcodec.h>\r
+}\r
+#if defined(_MSC_VER)\r
+#pragma warning (pop)\r
+#endif\r
+\r
+\r
+namespace caspar {\r
+\r
+struct audio_resampler::implementation\r
+{ \r
+ std::shared_ptr<ReSampleContext> resampler_;\r
+ \r
+ std::vector<int8_t, tbb::cache_aligned_allocator<int8_t>> copy_buffer_;\r
+ std::vector<int8_t, tbb::cache_aligned_allocator<int8_t>> buffer2_;\r
+\r
+ const size_t output_channels_;\r
+ const AVSampleFormat output_sample_format_;\r
+\r
+ const size_t input_channels_;\r
+ const AVSampleFormat input_sample_format_;\r
+\r
+ implementation(size_t output_channels, size_t input_channels, size_t output_sample_rate, size_t input_sample_rate, AVSampleFormat output_sample_format, AVSampleFormat input_sample_format)\r
+ : output_channels_(output_channels)\r
+ , output_sample_format_(output_sample_format)\r
+ , input_channels_(input_channels)\r
+ , input_sample_format_(input_sample_format)\r
+ {\r
+ if(input_channels != output_channels || \r
+ input_sample_rate != output_sample_rate ||\r
+ input_sample_format != output_sample_format)\r
+ { \r
+ auto resampler = av_audio_resample_init(output_channels, input_channels,\r
+ output_sample_rate, input_sample_rate,\r
+ output_sample_format, input_sample_format,\r
+ 16, 10, 0, 0.8);\r
+\r
+ buffer2_.resize(AVCODEC_MAX_AUDIO_FRAME_SIZE*2);\r
+\r
+ CASPAR_LOG(warning) << L"Resampling." <<\r
+ L" sample_rate:" << input_channels <<\r
+ L" audio_channels:" << input_channels <<\r
+ L" sample_fmt:" << input_sample_format;\r
+\r
+ if(resampler)\r
+ resampler_.reset(resampler, audio_resample_close);\r
+ else\r
+ BOOST_THROW_EXCEPTION(caspar_exception());\r
+ } \r
+ }\r
+\r
+ std::vector<int8_t, tbb::cache_aligned_allocator<int8_t>> resample(std::vector<int8_t, tbb::cache_aligned_allocator<int8_t>>&& data)\r
+ {\r
+ if(resampler_)\r
+ {\r
+ buffer2_.resize(AVCODEC_MAX_AUDIO_FRAME_SIZE*2);\r
+ auto ret = audio_resample(resampler_.get(),\r
+ reinterpret_cast<short*>(buffer2_.data()), \r
+ reinterpret_cast<short*>(data.data()), \r
+ data.size() / (av_get_bytes_per_sample(input_sample_format_) * input_channels_)); \r
+ buffer2_.resize(ret * av_get_bytes_per_sample(output_sample_format_) * output_channels_);\r
+ std::swap(data, buffer2_);\r
+ }\r
+\r
+ return std::move(data);\r
+ }\r
+};\r
+\r
+\r
+audio_resampler::audio_resampler(size_t output_channels, size_t input_channels, size_t output_sample_rate, size_t input_sample_rate, AVSampleFormat output_sample_format, AVSampleFormat input_sample_format)\r
+ : impl_(new implementation(output_channels, input_channels, output_sample_rate, input_sample_rate, output_sample_format, input_sample_format)){}\r
+std::vector<int8_t, tbb::cache_aligned_allocator<int8_t>> audio_resampler::resample(std::vector<int8_t, tbb::cache_aligned_allocator<int8_t>>&& data){return impl_->resample(std::move(data));}\r
+\r
+}
\ No newline at end of file