<Lib />\r
</ItemDefinitionGroup>\r
<ItemGroup>\r
+ <ClInclude Include="mixer\audio\audio_util.h" />\r
<ClInclude Include="mixer\gpu\fence.h" />\r
<ClInclude Include="mixer\gpu\shader.h" />\r
<ClInclude Include="mixer\image\blending_glsl.h" />\r
<ClInclude Include="producer\frame\frame_transform.h">\r
<Filter>source\producer\frame</Filter>\r
</ClInclude>\r
+ <ClInclude Include="mixer\audio\audio_util.h">\r
+ <Filter>source\mixer\audio</Filter>\r
+ </ClInclude>\r
</ItemGroup>\r
<ItemGroup>\r
<ClCompile Include="producer\transition\transition_producer.cpp">\r
--- /dev/null
+#pragma once\r
+\r
+#include <vector>\r
+\r
+#include <stdint.h>\r
+\r
+#include <boost/range/iterator_range.hpp>\r
+\r
+namespace caspar { namespace core {\r
+\r
+static std::vector<int16_t> audio_32_to_16(const boost::iterator_range<int32_t*>& input)\r
+{ \r
+ std::vector<int16_t> audio16(input.size());\r
+ auto audio32_ptr = reinterpret_cast<const uint32_t*>(input.begin());\r
+ auto audio16_ptr = reinterpret_cast<uint32_t*>(audio16.data());\r
+ auto size = input.size();\r
+ for(int n = 0; n < size; ++n) \r
+ audio16_ptr[n] = (audio32_ptr[n*2+1] & 0xffff0000) | ((audio32_ptr[n*2+0] >> 16) & 0x0000ffff); \r
+ return audio16;\r
+}\r
+\r
+}}
\ No newline at end of file
#include <common/utility/timer.h>\r
\r
#include <core/consumer/frame_consumer.h>\r
+#include <core/mixer/audio/audio_util.h>\r
\r
#include <tbb/concurrent_queue.h>\r
\r
\r
void schedule_next_video(const safe_ptr<core::read_frame>& frame)\r
{\r
- static std::vector<int32_t> silence(MAX_HANC_BUFFER_SIZE, 0);\r
+ static std::vector<int16_t> silence(MAX_HANC_BUFFER_SIZE, 0);\r
\r
executor_.begin_invoke([=]\r
{\r
\r
if(embedded_audio_)\r
{ \r
- auto frame_audio_data = frame->audio_data().empty() ? silence.data() : const_cast<int32_t*>(frame->audio_data().begin());\r
- \r
- std::vector<int16_t> frame_audio_data16(audio_samples);\r
- for(size_t n = 0; n < frame_audio_data16.size(); ++n) \r
- frame_audio_data16[n] = (frame_audio_data[n] >> 16) & 0xffff; \r
+ auto frame_audio = core::audio_32_to_16(frame->audio_data());\r
+ auto frame_audio_data = frame_audio.size() != audio_samples ? silence.data() : frame_audio.data(); \r
\r
- encode_hanc(reinterpret_cast<BLUE_UINT32*>(reserved_frames_.front()->hanc_data()), frame_audio_data16.data(), audio_samples, audio_nchannels);\r
+ encode_hanc(reinterpret_cast<BLUE_UINT32*>(reserved_frames_.front()->hanc_data()), frame_audio_data, audio_samples, audio_nchannels);\r
\r
blue_->system_buffer_write_async(const_cast<uint8_t*>(reserved_frames_.front()->image_data()), \r
reserved_frames_.front()->image_size(), \r
#include <common/utility/string.h>\r
\r
#include <core/consumer/frame_consumer.h>\r
+#include <core/mixer/audio/audio_util.h>\r
#include <core/video_format.h>\r
\r
#include <core/mixer/read_frame.h>\r
Play(); \r
}\r
\r
- std::vector<int16_t> audio16(frame->audio_data().size());\r
- for(size_t n = 0; n < audio16.size(); ++n) \r
- audio16[n] = (frame->audio_data()[n] >> 16) & 0xffff; \r
-\r
- input_.push(std::make_shared<std::vector<int16_t>>(std::move(audio16)));\r
+ input_.push(std::make_shared<std::vector<int16_t>>(core::audio_32_to_16(frame->audio_data())));\r
\r
return true;\r
}\r