]> git.sesse.net Git - casparcg/commitdiff
- Refactored so that consumers get the input channel_layout at initialization, instea...
authorHelge Norberg <helge.norberg@gmail.com>
Wed, 18 Jun 2014 11:27:04 +0000 (13:27 +0200)
committerHelge Norberg <helge.norberg@gmail.com>
Wed, 18 Jun 2014 11:27:04 +0000 (13:27 +0200)
- Extracted duplicated code to reusable function.

16 files changed:
core/consumer/frame_consumer.cpp
core/consumer/frame_consumer.h
core/consumer/output.cpp
core/consumer/output.h
core/mixer/audio/audio_util.h
core/producer/channel/channel_producer.cpp
core/video_channel.cpp
modules/bluefish/consumer/bluefish_consumer.cpp
modules/decklink/consumer/blocking_decklink_consumer.cpp
modules/decklink/consumer/decklink_consumer.cpp
modules/ffmpeg/consumer/ffmpeg_consumer.cpp
modules/ffmpeg/producer/filter/filter.h
modules/image/consumer/image_consumer.cpp
modules/newtek/consumer/newtek_ivga_consumer.cpp
modules/oal/consumer/oal_consumer.cpp
modules/ogl/consumer/ogl_consumer.cpp

index 012aaff909af58b52d6c3d6b84fbaec931229028..95ef47d65038ba10c416885f551969dc1b76b64e 100644 (file)
@@ -80,12 +80,15 @@ public:
        {\r
        }\r
        \r
-       virtual void initialize(const video_format_desc& format_desc, int channel_index) override\r
+       virtual void initialize(\r
+                       const video_format_desc& format_desc,\r
+                       const channel_layout& audio_channel_layout,\r
+                       int channel_index) override\r
        {\r
                audio_cadence_  = format_desc.audio_cadence;\r
                sync_buffer_    = boost::circular_buffer<size_t>(format_desc.audio_cadence.size());\r
                format_desc_    = format_desc;\r
-               consumer_->initialize(format_desc, channel_index);\r
+               consumer_->initialize(format_desc, audio_channel_layout, channel_index);\r
        }\r
 \r
        virtual int64_t presentation_frame_age_millis() const\r
@@ -150,7 +153,7 @@ const safe_ptr<frame_consumer>& frame_consumer::empty()
        struct empty_frame_consumer : public frame_consumer\r
        {\r
                virtual boost::unique_future<bool> send(const safe_ptr<read_frame>&) override { return caspar::wrap_as_future(false); }\r
-               virtual void initialize(const video_format_desc&, int) override{}\r
+               virtual void initialize(const video_format_desc&, const channel_layout&, int) override{}\r
                virtual int64_t presentation_frame_age_millis() const { return 0; }\r
                virtual std::wstring print() const override {return L"empty";}\r
                virtual bool has_synchronization_clock() const override {return false;}\r
index cdc058c474b710fdcc91db88c7fd1a9d572c8910..267d3dfa0e3b1cd956e13fca20ec3c9a40cc4d27 100644 (file)
@@ -36,13 +36,14 @@ namespace caspar { namespace core {
 class read_frame;\r
 class parameters;\r
 struct video_format_desc;\r
+struct channel_layout;\r
 \r
 struct frame_consumer : boost::noncopyable\r
 {\r
        virtual ~frame_consumer() {}\r
        \r
        virtual boost::unique_future<bool> send(const safe_ptr<read_frame>& frame) = 0;\r
-       virtual void initialize(const video_format_desc& format_desc, int channel_index) = 0;\r
+       virtual void initialize(const video_format_desc& format_desc, const channel_layout& audio_channel_layout, int channel_index) = 0;\r
        virtual int64_t presentation_frame_age_millis() const = 0;\r
        virtual std::wstring print() const = 0;\r
        virtual boost::property_tree::wptree info() const = 0;\r
index 678a4af734bb4bc3a03480f7be3e748387e63a9e..86c27cd219e8525247ddd244f3ee85d7d3ab2f5f 100644 (file)
@@ -53,6 +53,7 @@ struct output::implementation
        boost::timer                                                                    consume_timer_;\r
 \r
        video_format_desc                                                               format_desc_;\r
+       channel_layout                                                                  audio_channel_layout_;\r
 \r
        std::map<int, safe_ptr<frame_consumer>>                 consumers_;\r
        \r
@@ -64,11 +65,16 @@ struct output::implementation
        executor                                                                                executor_;\r
                \r
 public:\r
-       implementation(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc, int channel_index) \r
+       implementation(\r
+                       const safe_ptr<diagnostics::graph>& graph,\r
+                       const video_format_desc& format_desc,\r
+                       const channel_layout& audio_channel_layout,\r
+                       int channel_index) \r
                : channel_index_(channel_index)\r
                , graph_(graph)\r
                , monitor_subject_("/output")\r
                , format_desc_(format_desc)\r
+               , audio_channel_layout_(audio_channel_layout)\r
                , executor_(L"output")\r
        {\r
                graph_->set_color("consume-time", diagnostics::color(1.0f, 0.4f, 0.0f, 0.8));\r
@@ -79,7 +85,7 @@ public:
                remove(index);\r
 \r
                consumer = create_consumer_cadence_guard(consumer);\r
-               consumer->initialize(format_desc_, channel_index_);\r
+               consumer->initialize(format_desc_, audio_channel_layout_, channel_index_);\r
 \r
                executor_.invoke([&]\r
                {\r
@@ -131,7 +137,7 @@ public:
                        {                                               \r
                                try\r
                                {\r
-                                       it->second->initialize(format_desc, channel_index_);\r
+                                       it->second->initialize(format_desc, audio_channel_layout_, channel_index_);\r
                                        ++it;\r
                                }\r
                                catch(...)\r
@@ -260,7 +266,7 @@ public:
                                                CASPAR_LOG_CURRENT_EXCEPTION();\r
                                                try\r
                                                {\r
-                                                       consumer->initialize(format_desc_, channel_index_);\r
+                                                       consumer->initialize(format_desc_, audio_channel_layout_, channel_index_);\r
                                                        if(!consumer->send(frame).get())\r
                                                        {\r
                                                                CASPAR_LOG(info) << print() << L" " << consumer->print() << L" Removed.";\r
@@ -345,7 +351,7 @@ public:
        }\r
 };\r
 \r
-output::output(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc, int channel_index) : impl_(new implementation(graph, format_desc, channel_index)){}\r
+output::output(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc, const channel_layout& audio_channel_layout, int channel_index) : impl_(new implementation(graph, format_desc, audio_channel_layout, channel_index)){}\r
 void output::add(int index, const safe_ptr<frame_consumer>& consumer){impl_->add(index, consumer);}\r
 void output::add(const safe_ptr<frame_consumer>& consumer){impl_->add(consumer);}\r
 void output::remove(int index){impl_->remove(index);}\r
index 1b55fcd446ecd1a335dab8f14218dd5b61aa8637..b4489506a3ccb0816eddc2511496973f67639237 100644 (file)
@@ -38,7 +38,7 @@ class output : public target<std::pair<safe_ptr<read_frame>, std::shared_ptr<voi
                         , boost::noncopyable\r
 {\r
 public:\r
-       explicit output(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc, int channel_index);\r
+       explicit output(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc, const channel_layout& audio_channel_layout, int channel_index);\r
 \r
        // target\r
        \r
index c8dbe37b468dd55c6f3d399eb9dc239fe6a0c68b..b7e78a9ea5a8a28e413f4429c75fc99491038100 100644 (file)
@@ -553,6 +553,44 @@ bool rearrange_or_rearrange_and_mix(
        }\r
 }\r
 \r
+template<typename SrcView>\r
+std::vector<int32_t, tbb::cache_aligned_allocator<int32_t>> get_rearranged_and_mixed(\r
+               const SrcView& view,\r
+               const channel_layout& destination_layout,\r
+               int num_out_channels)\r
+{\r
+       const int sample_frame_count = view.num_samples();\r
+\r
+       if (needs_rearranging(view, destination_layout, num_out_channels))\r
+       {\r
+               std::vector<int32_t, tbb::cache_aligned_allocator<int32_t>> resulting_audio_data;\r
+               resulting_audio_data.resize(sample_frame_count * num_out_channels);\r
+\r
+               auto dest_view = make_multichannel_view<int32_t>(\r
+                               resulting_audio_data.begin(), \r
+                               resulting_audio_data.end(),\r
+                               destination_layout,\r
+                               num_out_channels);\r
+\r
+               rearrange_or_rearrange_and_mix(\r
+                               view, dest_view, default_mix_config_repository());\r
+\r
+               if (destination_layout.num_channels == 1 && num_out_channels >= 2)\r
+               {\r
+                       // mono: duplicate L to R\r
+                       boost::copy(                                                     \r
+                                       dest_view.channel(0),\r
+                                       dest_view.channel(1).begin());\r
+               }\r
+\r
+               return std::move(resulting_audio_data);\r
+       }\r
+       else\r
+       {\r
+               return std::vector<int32_t, tbb::cache_aligned_allocator<int32_t>>(view.raw_begin(), view.raw_end());\r
+       }\r
+}\r
+\r
 channel_layout create_custom_channel_layout(\r
                const std::wstring& custom_channel_order,\r
                const channel_layout_repository& repository);\r
index e141d62c9f35d7ad52ac3d658254ab1a834e1e22..3392cc741a1a8ba5c7a37324017caffec883aea9 100644 (file)
@@ -87,7 +87,10 @@ public:
                return caspar::wrap_as_future(is_running_.load());\r
        }\r
 \r
-       virtual void initialize(const core::video_format_desc& format_desc, int channel_index) override\r
+       virtual void initialize(\r
+                       const video_format_desc& format_desc,\r
+                       const channel_layout& audio_channel_layout,\r
+                       int channel_index) override\r
        {\r
                format_desc_    = format_desc;\r
                channel_index_  = channel_index;\r
index 13e8a49cd8161514290edf7f1fe738985b8124cd..2d95b8c0e9d333fe689f55c6190d4518c157d99e 100644 (file)
@@ -60,7 +60,7 @@ public:
                , index_(index)\r
                , format_desc_(format_desc)\r
                , ogl_(ogl)\r
-               , output_(new caspar::core::output(graph_, format_desc, index))\r
+               , output_(new caspar::core::output(graph_, format_desc, audio_channel_layout, index))\r
                , mixer_(new caspar::core::mixer(graph_, output_, format_desc, ogl, audio_channel_layout))\r
                , stage_(new caspar::core::stage(graph_, mixer_, format_desc))  \r
                , monitor_subject_(make_safe<monitor::subject>("/channel/" + boost::lexical_cast<std::string>(index)))\r
index b6ed886de681473606074cc4ff90b6fa35de6f63..aa354394429b853cc3412091ed601dc05fecc6c9 100644 (file)
@@ -263,39 +263,17 @@ public:
                if(embedded_audio_)\r
                {\r
                        auto src_view = frame->multichannel_view();\r
+                       auto frame_audio = core::audio_32_to_24(\r
+                                       core::get_rearranged_and_mixed(\r
+                                                       src_view,\r
+                                                       channel_layout_,\r
+                                                       channel_layout_.num_channels));\r
+                       encode_hanc(\r
+                                       reinterpret_cast<BLUE_UINT32*>(reserved_frames_.front()->hanc_data()),\r
+                                       frame_audio.data(),\r
+                                       src_view.num_samples(),\r
+                                       channel_layout_.num_channels);\r
 \r
-                       if (core::needs_rearranging(src_view, channel_layout_, channel_layout_.num_channels))\r
-                       {\r
-                               std::vector<int32_t> resulting_audio_data;\r
-                               resulting_audio_data.resize(src_view.num_samples() * channel_layout_.num_channels, 0);\r
-\r
-                               auto dest_view = core::make_multichannel_view<int32_t>(\r
-                                               resulting_audio_data.begin(), \r
-                                               resulting_audio_data.end(),\r
-                                               channel_layout_);\r
-\r
-                               core::rearrange_or_rearrange_and_mix(\r
-                                               src_view,\r
-                                               dest_view,\r
-                                               core::default_mix_config_repository());\r
-\r
-                               auto frame_audio = core::audio_32_to_24(resulting_audio_data);\r
-                               encode_hanc(\r
-                                               reinterpret_cast<BLUE_UINT32*>(reserved_frames_.front()->hanc_data()),\r
-                                               frame_audio.data(),\r
-                                               src_view.num_samples(),\r
-                                               channel_layout_.num_channels);\r
-                       }\r
-                       else\r
-                       {\r
-                               auto frame_audio = core::audio_32_to_24(frame->audio_data());\r
-                               encode_hanc(\r
-                                               reinterpret_cast<BLUE_UINT32*>(reserved_frames_.front()->hanc_data()),\r
-                                               frame_audio.data(),\r
-                                               src_view.num_samples(),\r
-                                               channel_layout_.num_channels);\r
-                       }\r
-                                                               \r
                        blue_->system_buffer_write_async(const_cast<uint8_t*>(reserved_frames_.front()->image_data()), \r
                                                                                        reserved_frames_.front()->image_size(), \r
                                                                                        nullptr, \r
@@ -403,7 +381,10 @@ public:
 \r
        // frame_consumer\r
        \r
-       virtual void initialize(const core::video_format_desc& format_desc, int channel_index) override\r
+       virtual void initialize(\r
+                       const core::video_format_desc& format_desc,\r
+                       const core::channel_layout& audio_channel_layout,\r
+                       int channel_index) override\r
        {\r
                consumer_.reset(new bluefish_consumer(\r
                                format_desc,\r
index b12ec63ca40c5c4f55964db951fdf91e2e558bc6..9f70f5bca68baabe2fab0afcf1ce712be2653b94 100644 (file)
@@ -53,7 +53,9 @@
 namespace caspar { namespace decklink { 
 
 // second is the index in the array to consume the next time
-typedef std::pair<std::vector<int32_t>, size_t> audio_buffer;
+typedef std::pair<
+               std::vector<int32_t, tbb::cache_aligned_allocator<int32_t>>,
+               size_t> audio_buffer;
 
 struct blocking_decklink_consumer : boost::noncopyable
 {              
@@ -170,38 +172,13 @@ public:
                        buffered_audio_samples_ = 0;
                }
 
-               if (core::needs_rearranging(
-                               view, config_.audio_layout, config_.num_out_channels()))
-               {
-                       std::vector<int32_t> resulting_audio_data;
-                       resulting_audio_data.resize(
-                                       sample_frame_count * config_.num_out_channels());
-
-                       auto dest_view = core::make_multichannel_view<int32_t>(
-                                       resulting_audio_data.begin(), 
-                                       resulting_audio_data.end(),
-                                       config_.audio_layout,
-                                       config_.num_out_channels());
-
-                       core::rearrange_or_rearrange_and_mix(
-                                       view, dest_view, core::default_mix_config_repository());
-
-                       if (config_.audio_layout.num_channels == 1) // mono
-                               boost::copy(                            // duplicate L to R
-                                               dest_view.channel(0),
-                                               dest_view.channel(1).begin());
-
-                       audio_samples_.push_back(
-                                       std::make_pair(std::move(resulting_audio_data), 0));
-               }
-               else
-               {
-                       audio_samples_.push_back(std::make_pair(
-                                       std::vector<int32_t>(
-                                                       frame->audio_data().begin(),
-                                                       frame->audio_data().end()),
-                                       0));
-               }
+               audio_samples_.push_back(
+                               std::make_pair(
+                                               core::get_rearranged_and_mixed(
+                                                               view,
+                                                               config_.audio_layout,
+                                                               config_.num_out_channels()),
+                                               0));
 
                buffered_audio_samples_ += sample_frame_count;
                graph_->set_value("buffered-audio",
@@ -209,7 +186,8 @@ public:
                                                / format_desc_.audio_cadence[0] * 0.5);
        }
 
-       bool try_consume_audio(std::pair<std::vector<int32_t>, size_t>& buffer)
+       template<typename Buffer>
+       bool try_consume_audio(Buffer& buffer)
        {
                size_t to_offer = (buffer.first.size() - buffer.second)
                                / config_.num_out_channels();
@@ -238,7 +216,7 @@ public:
        {
                while (!audio_samples_.empty())
                {
-                       auto buffer = audio_samples_.front();
+                       auto& buffer = audio_samples_.front();
 
                        if (try_consume_audio(buffer))
                                audio_samples_.pop_front();
@@ -383,7 +361,10 @@ public:
 
        // frame_consumer
        
-       virtual void initialize(const core::video_format_desc& format_desc, int channel_index) override
+       virtual void initialize(
+                       const core::video_format_desc& format_desc,
+                       const core::channel_layout& audio_channel_layout,
+                       int channel_index) override
        {
                context_.reset([&]{return new blocking_decklink_consumer(config_, format_desc, channel_index);});               
                audio_cadence_ = format_desc.audio_cadence;             
index 94109e912a6a6070295e2b911bf3066000e75c3c..f723bcd154e431e2b76310a2aa7bfc94bbe8ae0d 100644 (file)
@@ -162,7 +162,7 @@ struct decklink_consumer : public IDeckLinkVideoOutputCallback, public IDeckLink
 \r
        size_t                                                          preroll_count_;\r
                \r
-       boost::circular_buffer<std::vector<int32_t>>    audio_container_;\r
+       boost::circular_buffer<std::vector<int32_t, tbb::cache_aligned_allocator<int32_t>>>     audio_container_;\r
 \r
        tbb::concurrent_bounded_queue<std::shared_ptr<core::read_frame>> video_frame_buffer_;\r
        tbb::concurrent_bounded_queue<std::shared_ptr<core::read_frame>> audio_frame_buffer_;\r
@@ -420,34 +420,10 @@ public:
        {\r
                const int sample_frame_count = view.num_samples();\r
 \r
-               if (core::needs_rearranging(\r
-                               view, config_.audio_layout, config_.num_out_channels()))\r
-               {\r
-                       std::vector<int32_t> resulting_audio_data;\r
-                       resulting_audio_data.resize(\r
-                                       sample_frame_count * config_.num_out_channels());\r
-\r
-                       auto dest_view = core::make_multichannel_view<int32_t>(\r
-                                       resulting_audio_data.begin(), \r
-                                       resulting_audio_data.end(),\r
-                                       config_.audio_layout,\r
-                                       config_.num_out_channels());\r
-\r
-                       core::rearrange_or_rearrange_and_mix(\r
-                                       view, dest_view, core::default_mix_config_repository());\r
-\r
-                       if (config_.audio_layout.num_channels == 1) // mono\r
-                               boost::copy(                            // duplicate L to R\r
-                                               dest_view.channel(0),\r
-                                               dest_view.channel(1).begin());\r
-\r
-                       audio_container_.push_back(std::move(resulting_audio_data));\r
-               }\r
-               else\r
-               {\r
-                       audio_container_.push_back(\r
-                                       std::vector<int32_t>(view.raw_begin(), view.raw_end()));\r
-               }\r
+               audio_container_.push_back(core::get_rearranged_and_mixed(\r
+                               view,\r
+                               config_.audio_layout,\r
+                               config_.num_out_channels()));\r
 \r
                if(FAILED(output_->ScheduleAudioSamples(\r
                                audio_container_.back().data(),\r
@@ -558,7 +534,10 @@ public:
 \r
        // frame_consumer\r
        \r
-       virtual void initialize(const core::video_format_desc& format_desc, int channel_index) override\r
+       virtual void initialize(\r
+                       const core::video_format_desc& format_desc,\r
+                       const core::channel_layout& audio_channel_layout,\r
+                       int channel_index) override\r
        {\r
                context_.reset([&]{return new decklink_consumer(config_, format_desc, channel_index);});                \r
                audio_cadence_ = format_desc.audio_cadence;             \r
index 3f5480743bfb0a8fc8e57911a3f413ef6e6ef410..69bc0bef7ef8afbf5e72d0c315ceee9d044066ff 100644 (file)
@@ -639,7 +639,6 @@ struct ffmpeg_consumer_proxy : public core::frame_consumer
        const std::wstring                              filename_;\r
        const std::vector<option>               options_;\r
        const bool                                              separate_key_;\r
-       core::video_format_desc                 format_desc_;\r
 \r
        std::unique_ptr<ffmpeg_consumer> consumer_;\r
        std::unique_ptr<ffmpeg_consumer> key_only_consumer_;\r
@@ -653,9 +652,33 @@ public:
        {\r
        }\r
        \r
-       virtual void initialize(const core::video_format_desc& format_desc, int)\r
+       virtual void initialize(\r
+                       const core::video_format_desc& format_desc,\r
+                       const core::channel_layout& audio_channel_layout,\r
+                       int)\r
        {\r
-               format_desc_ = format_desc;\r
+               consumer_.reset();\r
+               key_only_consumer_.reset();\r
+               consumer_.reset(new ffmpeg_consumer(\r
+                               narrow(filename_),\r
+                               format_desc,\r
+                               options_,\r
+                               false,\r
+                               audio_channel_layout));\r
+\r
+               if (separate_key_)\r
+               {\r
+                       boost::filesystem::wpath fill_file(filename_);\r
+                       auto without_extension = fill_file.stem();\r
+                       auto key_file = env::media_folder() + without_extension + L"_A" + fill_file.extension();\r
+                       \r
+                       key_only_consumer_.reset(new ffmpeg_consumer(\r
+                                       narrow(key_file),\r
+                                       format_desc,\r
+                                       options_,\r
+                                       true,\r
+                                       audio_channel_layout));\r
+               }\r
        }\r
 \r
        virtual int64_t presentation_frame_age_millis() const override\r
@@ -665,9 +688,6 @@ public:
        \r
        virtual boost::unique_future<bool> send(const safe_ptr<core::read_frame>& frame) override\r
        {\r
-               if (!consumer_)\r
-                       do_initialize(frame->multichannel_view().channel_layout());\r
-\r
                bool ready_for_frame = consumer_->ready_for_frame();\r
 \r
                if (ready_for_frame && separate_key_)\r
@@ -722,28 +742,6 @@ public:
 private:\r
        void do_initialize(const core::channel_layout& channel_layout)\r
        {\r
-               consumer_.reset();\r
-               key_only_consumer_.reset();\r
-               consumer_.reset(new ffmpeg_consumer(\r
-                               narrow(filename_),\r
-                               format_desc_,\r
-                               options_,\r
-                               false,\r
-                               channel_layout));\r
-\r
-               if (separate_key_)\r
-               {\r
-                       boost::filesystem::wpath fill_file(filename_);\r
-                       auto without_extension = fill_file.stem();\r
-                       auto key_file = env::media_folder() + without_extension + L"_A" + fill_file.extension();\r
-                       \r
-                       key_only_consumer_.reset(new ffmpeg_consumer(\r
-                                       narrow(key_file),\r
-                                       format_desc_,\r
-                                       options_,\r
-                                       true,\r
-                                       channel_layout));\r
-               }\r
        }\r
 };     \r
 \r
index 6f03e84cc41380519b292b41dbf9fec3705a71b9..fbf47aa237b9b37556757941b351b9b0e843477a 100644 (file)
@@ -69,6 +69,9 @@ public:
                if(boost::to_upper_copy(filters).find(L"YADIF=3") != std::string::npos)\r
                        return true;\r
 \r
+               if(boost::to_upper_copy(filters).find(L"SEPARATEFIELDS") != std::string::npos)\r
+                       return true;\r
+\r
                return false;\r
        }\r
 \r
index 7c9b8215ec95a6861b5f65f6a64b089d320e0c67..dc647210cc63b43c2bced8adcedcfbff517dd6d4 100644 (file)
@@ -74,7 +74,7 @@ public:
        {\r
        }\r
 \r
-       virtual void initialize(const core::video_format_desc& format_desc, int) override\r
+       virtual void initialize(const core::video_format_desc& format_desc, const core::channel_layout&, int) override\r
        {\r
                format_desc_ = format_desc;\r
        }\r
index 45aa0fb32e371f92e30d33339237800c10b956a3..1e5e046aad99efb1b372f1fa70364f4d1af410af 100644 (file)
@@ -76,7 +76,10 @@ public:
 
        // frame_consumer
        
-       virtual void initialize(const core::video_format_desc& format_desc, int channel_index) override
+       virtual void initialize(
+                       const core::video_format_desc& format_desc,
+                       const core::channel_layout& audio_channel_layout,
+                       int channel_index) override
        {
                air_send_.reset(
                        airsend::create(
@@ -110,34 +113,11 @@ public:
 
                        // AUDIO
 
-                       std::vector<int16_t, tbb::cache_aligned_allocator<int16_t>> audio_buffer;
-
-                       if (core::needs_rearranging(
-                                       frame->multichannel_view(),
-                                       channel_layout_,
-                                       channel_layout_.num_channels))
-                       {
-                               core::audio_buffer downmixed;
-
-                               downmixed.resize(
-                                               frame->multichannel_view().num_samples() 
-                                                               * channel_layout_.num_channels,
-                                               0);
-
-                               auto dest_view = core::make_multichannel_view<int32_t>(
-                                               downmixed.begin(), downmixed.end(), channel_layout_);
-
-                               core::rearrange_or_rearrange_and_mix(
-                                               frame->multichannel_view(),
-                                               dest_view,
-                                               core::default_mix_config_repository());
-
-                               audio_buffer = core::audio_32_to_16(downmixed);
-                       }
-                       else
-                       {
-                               audio_buffer = core::audio_32_to_16(frame->audio_data());
-                       }
+                       auto audio_buffer = core::audio_32_to_16(
+                                       core::get_rearranged_and_mixed(
+                                                       frame->multichannel_view(),
+                                                       channel_layout_,
+                                                       channel_layout_.num_channels));
 
                        airsend::add_audio(air_send_.get(), audio_buffer.data(), audio_buffer.size() / channel_layout_.num_channels);
 
index e183d4577769d15b93e92349db7156aa78a3cffa..e33d741179600838c515b86132293dc4161ef4cf 100644 (file)
@@ -97,7 +97,10 @@ public:
 
        // frame consumer
 
-       virtual void initialize(const core::video_format_desc& format_desc, int channel_index) override
+       virtual void initialize(
+                       const core::video_format_desc& format_desc,
+                       const core::channel_layout& audio_channel_layout,
+                       int channel_index) override
        {
                format_desc_    = format_desc;          
                channel_index_  = channel_index;
@@ -118,35 +121,8 @@ public:
 
        virtual boost::unique_future<bool> send(const safe_ptr<core::read_frame>& frame) override
        {
-               std::shared_ptr<audio_buffer_16> buffer;
-
-               if (core::needs_rearranging(
-                               frame->multichannel_view(),
-                               channel_layout_,
-                               channel_layout_.num_channels))
-               {
-                       core::audio_buffer downmixed;
-                       downmixed.resize(
-                                       frame->multichannel_view().num_samples() 
-                                                       * channel_layout_.num_channels,
-                                       0);
-
-                       auto dest_view = core::make_multichannel_view<int32_t>(
-                                       downmixed.begin(), downmixed.end(), channel_layout_);
-
-                       core::rearrange_or_rearrange_and_mix(
-                                       frame->multichannel_view(),
-                                       dest_view,
-                                       core::default_mix_config_repository());
-
-                       buffer = std::make_shared<audio_buffer_16>(
-                                       core::audio_32_to_16(downmixed));
-               }
-               else
-               {
-                       buffer = std::make_shared<audio_buffer_16>(
-                                       core::audio_32_to_16(frame->audio_data()));
-               }
+               auto buffer = std::make_shared<audio_buffer_16>(
+                       core::audio_32_to_16(core::get_rearranged_and_mixed(frame->multichannel_view(), channel_layout_, channel_layout_.num_channels)));
 
                if (!input_.try_push(std::make_pair(frame, buffer)))
                        graph_->set_tag("dropped-frame");
index abc47a1daa161e7cb819b394d8907e258193e540..976209598fcfe871f240e2a7125f17ba722a90c6 100644 (file)
@@ -541,7 +541,10 @@ public:
 \r
        // frame_consumer\r
 \r
-       virtual void initialize(const core::video_format_desc& format_desc, int channel_index) override\r
+       virtual void initialize(\r
+                       const core::video_format_desc& format_desc,\r
+                       const core::channel_layout& audio_channel_layout,\r
+                       int channel_index) override\r
        {\r
                consumer_.reset();\r
                consumer_.reset(new ogl_consumer(config_, format_desc, channel_index));\r