]> git.sesse.net Git - casparcg/blob - core/mixer/audio/audio_util.h
2.0. bluefish_consumer: 24 bit audio.
[casparcg] / core / mixer / audio / audio_util.h
1 #pragma once\r
2 \r
3 #include <vector>\r
4 \r
5 #include <stdint.h>\r
6 \r
7 #include <boost/range/iterator_range.hpp>\r
8 \r
9 namespace caspar { namespace core {\r
10 \r
11 static std::vector<int16_t> audio_32_to_16(const boost::iterator_range<int32_t*>& input)\r
12 {       \r
13         std::vector<int16_t> audio16(input.size());\r
14         auto audio32_ptr = reinterpret_cast<const uint32_t*>(input.begin());\r
15         auto audio16_ptr = reinterpret_cast<uint32_t*>(audio16.data());\r
16         auto size                = input.size()/2;\r
17         for(int n = 0; n < size; ++n)           \r
18                 audio16_ptr[n] = (audio32_ptr[n*2+1] & 0xffff0000) | (audio32_ptr[n*2+0] >> 16);        \r
19         return audio16;\r
20 }\r
21 \r
22 static std::vector<int8_t> audio_32_to_24(const boost::iterator_range<int32_t*>& input)\r
23 {       \r
24         std::vector<int8_t> audio24(input.size()*3+16);\r
25         auto audio32_ptr = reinterpret_cast<const uint32_t*>(input.begin());\r
26         auto audio24_ptr = reinterpret_cast<uint8_t*>(audio24.data());\r
27         auto size                = input.size();\r
28         for(int n = 0; n < size; ++n)           \r
29                 *reinterpret_cast<uint32_t*>(audio24_ptr + n*3) = *(audio32_ptr + n) >> 8;      \r
30         audio24.resize(input.size());\r
31         return audio24;\r
32 }\r
33 \r
34 }}