]> git.sesse.net Git - casparcg/blobdiff - modules/oal/consumer/oal_consumer.cpp
2.0. Updated namespaces.
[casparcg] / modules / oal / consumer / oal_consumer.cpp
index ff87f4db6076452d179c564da7b66ec66e6c33f6..35ef456d06f10f3eba6a2373e05c5733c8d31bfe 100644 (file)
  \r
 #include "oal_consumer.h"\r
 \r
+#include <common/exception/exceptions.h>\r
 #include <common/diagnostics/graph.h>\r
 #include <common/log/log.h>\r
 #include <common/utility/timer.h>\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
 \r
 #include <tbb/concurrent_queue.h>\r
 \r
-namespace caspar {\r
+namespace caspar { namespace oal {\r
 \r
 struct oal_consumer : public core::frame_consumer,  public sf::SoundStream\r
 {\r
        safe_ptr<diagnostics::graph>                                            graph_;\r
        boost::timer                                                                            perf_timer_;\r
 \r
-       tbb::concurrent_bounded_queue<std::vector<short>>       input_;\r
-       boost::circular_buffer<std::vector<short>>                      container_;\r
+       tbb::concurrent_bounded_queue<std::shared_ptr<std::vector<int16_t, tbb::cache_aligned_allocator<int16_t>>>>     input_;\r
+       boost::circular_buffer<std::vector<int16_t, tbb::cache_aligned_allocator<int16_t>>>                     container_;\r
        tbb::atomic<bool>                                                                       is_running_;\r
 \r
        core::video_format_desc                                                         format_desc_;\r
@@ -53,11 +55,14 @@ struct oal_consumer : public core::frame_consumer,  public sf::SoundStream
 public:\r
        oal_consumer() \r
                : graph_(diagnostics::create_graph(narrow(print())))\r
-               , container_(5)\r
+               , container_(16)\r
                , preroll_count_(0)\r
        {\r
+               if(core::consumer_buffer_depth() < 3)\r
+                       BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("audio-consumer does not support buffer-depth lower than 3."));\r
+\r
                graph_->add_guide("tick-time", 0.5);\r
-               graph_->set_color("tick-time", diagnostics::color(0.1f, 0.7f, 0.8f));\r
+               graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f));   \r
                is_running_ = true;\r
                input_.set_capacity(core::consumer_buffer_depth()-2);\r
        }\r
@@ -65,8 +70,8 @@ public:
        ~oal_consumer()\r
        {\r
                is_running_ = false;\r
-               input_.try_push(std::vector<short>());\r
-               input_.try_push(std::vector<short>());\r
+               input_.try_push(std::make_shared<std::vector<int16_t, tbb::cache_aligned_allocator<int16_t>>>());\r
+               input_.try_push(std::make_shared<std::vector<int16_t, tbb::cache_aligned_allocator<int16_t>>>());\r
                Stop();\r
                CASPAR_LOG(info) << print() << L" Shutting down.";      \r
        }\r
@@ -75,7 +80,6 @@ public:
        {\r
                format_desc_ = format_desc;             \r
                sf::SoundStream::Initialize(2, 48000);\r
-               Play();         \r
                CASPAR_LOG(info) << print() << " Sucessfully initialized.";\r
        }\r
        \r
@@ -83,21 +87,22 @@ public:
        {                       \r
                if(preroll_count_ < input_.capacity())\r
                {\r
-                       while(input_.try_push(std::vector<int16_t>(format_desc_.audio_samples_per_frame, 0)))\r
+                       while(input_.try_push(std::make_shared<std::vector<int16_t, tbb::cache_aligned_allocator<int16_t>>>(format_desc_.audio_samples_per_frame, 0)))\r
                                ++preroll_count_;\r
+                       Play();         \r
                }\r
 \r
-               input_.push(std::vector<int16_t>(frame->audio_data().begin(), frame->audio_data().end()));      \r
+               input_.push(std::make_shared<std::vector<int16_t, tbb::cache_aligned_allocator<int16_t>>>(core::audio_32_to_16_sse(frame->audio_data())));\r
 \r
                return true;\r
        }\r
        \r
        virtual bool OnGetData(sf::SoundStream::Chunk& data)\r
        {               \r
-               std::vector<short> audio_data;          \r
+               std::shared_ptr<std::vector<int16_t, tbb::cache_aligned_allocator<int16_t>>> audio_data;                \r
                input_.pop(audio_data);\r
                                \r
-               container_.push_back(std::move(audio_data));\r
+               container_.push_back(std::move(*audio_data));\r
                data.Samples = container_.back().data();\r
                data.NbSamples = container_.back().size();      \r
                \r
@@ -118,17 +123,17 @@ public:
        }\r
 };\r
 \r
-safe_ptr<core::frame_consumer> create_oal_consumer(const std::vector<std::wstring>& params)\r
+safe_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>& params)\r
 {\r
-       if(params.size() < 1 || params[0] != L"OAL")\r
+       if(params.size() < 1 || params[0] != L"AUDIO")\r
                return core::frame_consumer::empty();\r
 \r
        return make_safe<oal_consumer>();\r
 }\r
 \r
-safe_ptr<core::frame_consumer> create_oal_consumer()\r
+safe_ptr<core::frame_consumer> create_consumer()\r
 {\r
        return make_safe<oal_consumer>();\r
 }\r
 \r
-}\r
+}}\r