]> git.sesse.net Git - casparcg/blobdiff - core/mixer/mixer.cpp
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
[casparcg] / core / mixer / mixer.cpp
index c0bb80189aac33be6b3a1e9aa352622b12852705..2b9768c858dc4561e3c45c2f625882b587ea1e83 100644 (file)
@@ -86,8 +86,6 @@ public:
 \r
 struct mixer::implementation : boost::noncopyable\r
 {              \r
-       critical_section                        mutex_;\r
-\r
        const video_format_desc format_desc_;\r
        ogl_device&                             ogl_;\r
        \r
@@ -96,9 +94,8 @@ struct mixer::implementation : boost::noncopyable
        \r
        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>>, core::audio_buffer>> buffer_;\r
-       \r
+               \r
+       critical_section                        mutex_;\r
        Concurrency::transformer<safe_ptr<message<std::map<int, safe_ptr<basic_frame>>>>, \r
                                                         safe_ptr<message<safe_ptr<core::read_frame>>>> mixer_;\r
 public:\r
@@ -145,33 +142,19 @@ public:
                auto image = image_mixer_.render();\r
                auto audio = audio_mixer_.mix();\r
                        \r
-               buffer_.push(std::make_pair(std::move(image), audio));\r
-\r
-               if(buffer_.size() < 2)\r
-                       return msg->transfer(make_safe<core::read_frame>());    \r
-\r
-               auto res = std::move(buffer_.front());\r
-               buffer_.pop();\r
-\r
-               auto buffer = [&]() -> safe_ptr<core::host_buffer>\r
                {\r
                        scoped_oversubcription_token oversubscribe;\r
-                       return std::move(res.first.get());\r
-               }();\r
+                       image.wait();\r
+               }\r
 \r
-               auto frame = make_safe<read_frame>(ogl_, format_desc_.size, std::move(buffer), std::move(res.second));\r
+               auto frame = make_safe<read_frame>(ogl_, format_desc_.size, std::move(image.get()), std::move(audio));\r
 \r
                return msg->transfer<safe_ptr<core::read_frame>>(std::move(frame));     \r
        }\r
                                                \r
-       safe_ptr<core::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc)\r
-       {               \r
-               return image_mixer_.create_frame(tag, desc);\r
-       }\r
-\r
-       boost::unique_future<safe_ptr<core::write_frame>> create_frame2(const void* tag, const core::pixel_format_desc& desc)\r
+       boost::unique_future<safe_ptr<core::write_frame>> async_create_frame(const void* tag, const core::pixel_format_desc& desc)\r
        {               \r
-               return image_mixer_.create_frame2(tag, desc);\r
+               return image_mixer_.async_create_frame(tag, desc);\r
        }\r
                \r
        void set_transform(int index, const frame_transform& transform, unsigned int mix_duration, const std::wstring& tween)\r
@@ -215,8 +198,7 @@ public:
        \r
 mixer::mixer(mixer::source_t& source, mixer::target_t& target, const video_format_desc& format_desc, ogl_device& ogl) : impl_(new implementation(source, target, format_desc, ogl)){}\r
 core::video_format_desc mixer::get_video_format_desc() const { return impl_->format_desc_; }\r
-safe_ptr<core::write_frame> mixer::create_frame(const void* tag, const core::pixel_format_desc& desc){ return impl_->create_frame(tag, desc); }                \r
-boost::unique_future<safe_ptr<write_frame>> mixer::create_frame2(const void* video_stream_tag, const pixel_format_desc& desc){ return impl_->create_frame2(video_stream_tag, desc); }                  \r
+boost::unique_future<safe_ptr<write_frame>> mixer::async_create_frame(const void* video_stream_tag, const pixel_format_desc& desc){ return impl_->async_create_frame(video_stream_tag, desc); }                        \r
 void mixer::set_frame_transform(int index, const core::frame_transform& transform, unsigned int mix_duration, const std::wstring& tween){impl_->set_transform(index, transform, mix_duration, tween);}\r
 void mixer::apply_frame_transform(int index, const std::function<core::frame_transform(core::frame_transform)>& transform, unsigned int mix_duration, const std::wstring& tween){impl_->apply_transform(index, transform, mix_duration, tween);}\r
 void mixer::clear_transforms(){impl_->clear_transforms();}\r