]> git.sesse.net Git - casparcg/blobdiff - core/mixer/mixer.cpp
2.0. audio:
[casparcg] / core / mixer / mixer.cpp
index 9041b2803ad7ab30c82d626bc71e15812b74fd84..8353d4170769bd351b345e049b7a00899be812c4 100644 (file)
@@ -96,7 +96,7 @@ struct mixer::implementation : boost::noncopyable
        std::unordered_map<int, tweened_transform<core::frame_transform>> transforms_;  \r
        std::unordered_map<int, blend_mode::type> blend_modes_;\r
 \r
-       std::queue<std::pair<boost::unique_future<safe_ptr<host_buffer>>, std::vector<int16_t>>> buffer_;\r
+       std::queue<std::pair<boost::unique_future<safe_ptr<host_buffer>>, core::audio_buffer>> buffer_;\r
        \r
        const size_t buffer_size_;\r
 \r
@@ -104,7 +104,7 @@ public:
        implementation(video_channel_context& video_channel) \r
                : channel_(video_channel)\r
                , audio_mixer_(channel_.get_format_desc())\r
-               , image_mixer_(channel_)\r
+               , image_mixer_(channel_.ogl(), channel_.get_format_desc())\r
                , buffer_size_(env::properties().get("configuration.producers.buffer-depth", 1))\r
        {       \r
                CASPAR_LOG(info) << print() << L" Successfully initialized . Buffer-depth: " << buffer_size_;   \r
@@ -118,35 +118,19 @@ public:
                        {\r
                                auto blend_it = blend_modes_.find(frame.first);\r
                                image_mixer_.begin_layer(blend_it != blend_modes_.end() ? blend_it->second : blend_mode::normal);\r
+                               \r
+                               auto frame1 = make_safe<core::basic_frame>(frame.second);\r
+                               frame1->get_frame_transform() = transforms_[frame.first].fetch_and_tick(1);\r
 \r
                                if(channel_.get_format_desc().field_mode != core::field_mode::progressive)\r
-                               {\r
-                                       auto frame1 = make_safe<core::basic_frame>(frame.second);\r
-                                       frame1->get_frame_transform() = transforms_[frame.first].fetch_and_tick(1);\r
-                               \r
+                               {                               \r
                                        auto frame2 = make_safe<core::basic_frame>(frame.second);\r
                                        frame2->get_frame_transform() = transforms_[frame.first].fetch_and_tick(1);\r
-                                               \r
-                                       if(frame1->get_frame_transform() != frame2->get_frame_transform())\r
-                                               frame2 = core::basic_frame::interlace(frame1, frame2, channel_.get_format_desc().field_mode);\r
-\r
-                                       frame2->accept(audio_mixer_);                                   \r
-                                       frame2->accept(image_mixer_);\r
-                               }\r
-                               else\r
-                               {\r
-                                       auto frame2 = make_safe<core::basic_frame>(frame.second);\r
-                                       frame2->get_frame_transform() = transforms_[frame.first].fetch_and_tick(1);\r
-                                       \r
-                                       // Audio\r
-                                       frame2->accept(audio_mixer_);\r
-\r
-                                       // Video\r
-                                       auto blend_it = blend_modes_.find(frame.first);\r
-                                       image_mixer_.begin_layer(blend_it != blend_modes_.end() ? blend_it->second : blend_mode::normal);\r
-                                       \r
-                                       frame2->accept(image_mixer_);\r
+                                       frame1 = core::basic_frame::interlace(frame1, frame2, channel_.get_format_desc().field_mode);\r
                                }\r
+                                                                       \r
+                               frame1->accept(audio_mixer_);                                   \r
+                               frame1->accept(image_mixer_);\r
 \r
                                image_mixer_.end_layer();\r
                        }\r
@@ -183,7 +167,7 @@ public:
                        auto src = transforms_[index].fetch();\r
                        auto dst = transform;\r
                        transforms_[index] = tweened_transform<frame_transform>(src, dst, mix_duration, tween);\r
-               });\r
+               }, high_priority);\r
        }\r
                                \r
        void apply_transform(int index, const std::function<frame_transform(frame_transform)>& transform, unsigned int mix_duration, const std::wstring& tween)\r
@@ -193,17 +177,24 @@ public:
                        auto src = transforms_[index].fetch();\r
                        auto dst = transform(src);\r
                        transforms_[index] = tweened_transform<frame_transform>(src, dst, mix_duration, tween);\r
-               });\r
+               }, high_priority);\r
        }\r
 \r
        void clear_transforms()\r
        {\r
-               channel_.execution().invoke([&]{transforms_.clear();});\r
+               channel_.execution().invoke([&]\r
+               {\r
+                       transforms_.clear();\r
+                       blend_modes_.clear();\r
+               }, high_priority);\r
        }\r
                \r
        void set_blend_mode(int index, blend_mode::type value)\r
        {\r
-               blend_modes_[index] = value;\r
+               channel_.execution().invoke([&]\r
+               {\r
+                       blend_modes_[index] = value;\r
+               }, high_priority);\r
        }\r
 \r
        std::wstring print() const\r