\r
safe_ptr<read_frame> execute(const std::map<int, safe_ptr<core::basic_frame>>& frames)\r
{ \r
- decltype(mix_image(frames)) image;\r
- decltype(mix_audio(frames)) audio;\r
-\r
- tbb::parallel_invoke\r
- (\r
- [&]{image = mix_image(frames);}, \r
- [&]{audio = mix_audio(frames);}\r
- );\r
+ try\r
+ {\r
+ decltype(mix_image(frames)) image;\r
+ decltype(mix_audio(frames)) audio;\r
+\r
+ tbb::parallel_invoke\r
+ (\r
+ [&]{image = mix_image(frames);}, \r
+ [&]{audio = mix_audio(frames);}\r
+ );\r
\r
- buffer_.push(std::make_pair(std::move(image), audio));\r
+ buffer_.push(std::make_pair(std::move(image), audio));\r
\r
- if(buffer_.size()-1 < buffer_size_) \r
- return make_safe<read_frame>();\r
+ if(buffer_.size()-1 < buffer_size_) \r
+ return make_safe<read_frame>();\r
\r
- auto res = std::move(buffer_.front());\r
- buffer_.pop();\r
- \r
- return make_safe<read_frame>(channel_.ogl(), channel_.get_format_desc().size, std::move(res.first.get()), std::move(res.second)); \r
+ auto res = std::move(buffer_.front());\r
+ buffer_.pop();\r
+\r
+ return make_safe<read_frame>(channel_.ogl(), channel_.get_format_desc().size, std::move(res.first.get()), std::move(res.second)); \r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG(error) << L"[mixer] Error detected.";\r
+ throw;\r
+ } \r
}\r
\r
safe_ptr<core::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc)\r
}\r
\r
std::map<int, safe_ptr<basic_frame>> execute()\r
- { \r
- std::map<int, safe_ptr<basic_frame>> frames;\r
+ { \r
+ try\r
+ {\r
+ std::map<int, safe_ptr<basic_frame>> frames;\r
\r
- BOOST_FOREACH(auto& layer, layers_) \r
- frames[layer.first] = basic_frame::empty(); \r
+ BOOST_FOREACH(auto& layer, layers_) \r
+ frames[layer.first] = basic_frame::empty(); \r
+\r
+ tbb::parallel_for_each(layers_.begin(), layers_.end(), [&](std::map<int, layer>::value_type& layer) \r
+ {\r
+ frames[layer.first] = layer.second.receive(); \r
+ });\r
\r
- tbb::parallel_for_each(layers_.begin(), layers_.end(), [&](std::map<int, layer>::value_type& layer) \r
+ return frames;\r
+\r
+ }\r
+ catch(...)\r
{\r
- frames[layer.first] = layer.second.receive(); \r
- });\r
- \r
- return frames;\r
+ CASPAR_LOG(error) << L"[stage] Error detected";\r
+ throw;\r
+ } \r
}\r
\r
void load(int index, const safe_ptr<frame_producer>& producer, bool preview, int auto_play_delta)\r