]> git.sesse.net Git - casparcg/blobdiff - core/mixer/audio/audio_util.h
audio_mixer: Added some comments.
[casparcg] / core / mixer / audio / audio_util.h
index 4f45efa42d9a11fc38e7d5b72e1bdc0832e7c432..0ea9ec2d86844101d576ffd84e58168e4c436a18 100644 (file)
@@ -6,17 +6,37 @@
 \r
 #include <boost/range/iterator_range.hpp>\r
 \r
+#include <tbb/cache_aligned_allocator.h>\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
+// NOTE: Input data pointer should be larger than input.size() to allow sse to read beyond\r
+static std::vector<int16_t, tbb::cache_aligned_allocator<int16_t>> audio_32_to_16_sse(const boost::iterator_range<int32_t*>& input)\r
+{      \r
+       std::vector<int16_t, tbb::cache_aligned_allocator<int16_t>> audio16(input.size());\r
+       auto audio32_ptr = reinterpret_cast<const __m128i*>(input.begin());\r
+       auto audio16_ptr = reinterpret_cast<__m128i*>(audio16.data());\r
+       auto size                = input.size();\r
+       for(int n = 0; n < size/8; ++n)         \r
+       {\r
+               auto xmm0 = _mm_srai_epi32(_mm_load_si128(audio32_ptr++), 16);\r
+               auto xmm1 = _mm_srai_epi32(_mm_load_si128(audio32_ptr++), 16);\r
+               auto xmm3 = _mm_packs_epi32(xmm0, xmm1);\r
+               _mm_store_si128(audio16_ptr++, xmm3);\r
+       }\r
+       return audio16;\r
+}\r
+\r
+static std::vector<int8_t> audio_32_to_24(const boost::iterator_range<int32_t*>& input)\r
 {      \r
-       std::vector<int16_t> audio16(input.size());\r
+       std::vector<int8_t> audio24(input.size()*3+16);\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()/2;\r
+       auto audio24_ptr = reinterpret_cast<uint8_t*>(audio24.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);        \r
-       return audio16;\r
+               *reinterpret_cast<uint32_t*>(audio24_ptr + n*3) = *(audio32_ptr + n) >> 8;      \r
+       audio24.resize(input.size());\r
+       return audio24;\r
 }\r
 \r
 }}
\ No newline at end of file