From 7dd8bdd6999be5bf21f6963a7b4ed312806244e4 Mon Sep 17 00:00:00 2001 From: ronag Date: Sun, 4 Sep 2011 00:09:12 +0000 Subject: [PATCH] git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1343 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- core/mixer/audio/audio_util.h | 21 ++++++++++++++------- modules/oal/consumer/oal_consumer.cpp | 14 +++++++------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/core/mixer/audio/audio_util.h b/core/mixer/audio/audio_util.h index 0cbebc3d1..d422bc086 100644 --- a/core/mixer/audio/audio_util.h +++ b/core/mixer/audio/audio_util.h @@ -6,16 +6,23 @@ #include +#include + namespace caspar { namespace core { -static std::vector audio_32_to_16(const boost::iterator_range& input) +static std::vector> audio_32_to_16_sse(const boost::iterator_range& input) { - std::vector audio16(input.size()); - auto audio32_ptr = reinterpret_cast(input.begin()); - auto audio16_ptr = reinterpret_cast(audio16.data()); - auto size = input.size()/2; - for(int n = 0; n < size; ++n) - audio16_ptr[n] = (audio32_ptr[n*2+1] & 0xffff0000) | (audio32_ptr[n*2+0] >> 16); + std::vector> audio16(input.size()); + auto audio32_ptr = reinterpret_cast(input.begin()); + auto audio16_ptr = reinterpret_cast<__m128i*>(audio16.data()); + auto size = input.size(); + for(int n = 0; n < size/8; ++n) + { + auto xmm0 = _mm_srai_epi32(_mm_load_si128(audio32_ptr++), 16); + auto xmm1 = _mm_srai_epi32(_mm_load_si128(audio32_ptr++), 16); + auto xmm3 = _mm_packs_epi32(xmm0, xmm1); + _mm_store_si128(audio16_ptr++, xmm3); + } return audio16; } diff --git a/modules/oal/consumer/oal_consumer.cpp b/modules/oal/consumer/oal_consumer.cpp index 7186dc74c..cd0130a5f 100644 --- a/modules/oal/consumer/oal_consumer.cpp +++ b/modules/oal/consumer/oal_consumer.cpp @@ -46,8 +46,8 @@ struct oal_consumer : public core::frame_consumer, public sf::SoundStream safe_ptr graph_; boost::timer perf_timer_; - tbb::concurrent_bounded_queue>> input_; - boost::circular_buffer> container_; + tbb::concurrent_bounded_queue>>> input_; + boost::circular_buffer>> container_; tbb::atomic is_running_; core::video_format_desc format_desc_; @@ -70,8 +70,8 @@ public: ~oal_consumer() { is_running_ = false; - input_.try_push(std::make_shared>()); - input_.try_push(std::make_shared>()); + input_.try_push(std::make_shared>>()); + input_.try_push(std::make_shared>>()); Stop(); CASPAR_LOG(info) << print() << L" Shutting down."; } @@ -87,19 +87,19 @@ public: { if(preroll_count_ < input_.capacity()) { - while(input_.try_push(std::make_shared>(format_desc_.audio_samples_per_frame, 0))) + while(input_.try_push(std::make_shared>>(format_desc_.audio_samples_per_frame, 0))) ++preroll_count_; Play(); } - input_.push(std::make_shared>(core::audio_32_to_16(frame->audio_data()))); + input_.push(std::make_shared>>(core::audio_32_to_16_sse(frame->audio_data()))); return true; } virtual bool OnGetData(sf::SoundStream::Chunk& data) { - std::shared_ptr> audio_data; + std::shared_ptr>> audio_data; input_.pop(audio_data); container_.push_back(std::move(*audio_data)); -- 2.39.2