\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
\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
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
\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