{\r
for(size_t i = r.begin(); i != r.end(); ++i)\r
{\r
- frames[i] = layers_[i].receive();\r
+ frames[i] = layers_[i].receive(i);\r
frames[i]->set_layer_index(i);\r
}\r
}); \r
producer->initialize(factory_);\r
executor_.invoke([&]\r
{\r
- layers_[index].load(producer, play_on_load);\r
+ layers_[index].load(index, producer, play_on_load);\r
});\r
}\r
\r
producer->initialize(factory_);\r
executor_.invoke([&]\r
{ \r
- layers_[index].preview(producer);\r
+ layers_[index].preview(index, producer);\r
});\r
}\r
\r
check_bounds(index);\r
executor_.invoke([&]\r
{\r
- layers_[index].pause();\r
+ layers_[index].pause(index);\r
});\r
}\r
\r
check_bounds(index);\r
executor_.invoke([&]\r
{\r
- layers_[index].play();\r
+ layers_[index].play(index);\r
});\r
}\r
\r
check_bounds(index);\r
executor_.invoke([&]\r
{\r
- layers_[index].stop();\r
+ layers_[index].stop(index);\r
});\r
}\r
\r
, last_frame_(draw_frame::empty())\r
, is_paused_(false){}\r
\r
- void load(const safe_ptr<frame_producer>& frame_producer, bool play_on_load)\r
+ void load(int index, const safe_ptr<frame_producer>& frame_producer, bool play_on_load)\r
{ \r
background_ = frame_producer;\r
- CASPAR_LOG(info) << print() << " " << frame_producer->print() << " => background";\r
+ CASPAR_LOG(info) << print(index) << " " << frame_producer->print() << " => background";\r
if(play_on_load)\r
- play(); \r
+ play(index); \r
}\r
\r
- void preview(const safe_ptr<frame_producer>& frame_producer)\r
+ void preview(int index, const safe_ptr<frame_producer>& frame_producer)\r
{\r
- stop();\r
- load(frame_producer, false); \r
+ stop(index);\r
+ load(index, frame_producer, false); \r
try\r
{\r
last_frame_ = frame_producer->receive();\r
catch(...)\r
{\r
CASPAR_LOG_CURRENT_EXCEPTION();\r
- clear();\r
+ clear(index);\r
}\r
}\r
\r
- void play()\r
+ void play(int index)\r
{ \r
if(is_paused_) \r
is_paused_ = false;\r
background_->set_leading_producer(foreground_);\r
foreground_ = background_;\r
background_ = frame_producer::empty();\r
- CASPAR_LOG(info) << print() << L" background => foreground";\r
+ CASPAR_LOG(info) << print(index) << L" background => foreground";\r
}\r
}\r
\r
- void pause()\r
+ void pause(int)\r
{\r
is_paused_ = true;\r
}\r
\r
- void stop()\r
+ void stop(int index)\r
{\r
- pause();\r
+ pause(index);\r
last_frame_ = draw_frame::empty();\r
foreground_ = frame_producer::empty();\r
- CASPAR_LOG(warning) << print() << L" empty => foreground";\r
+ CASPAR_LOG(warning) << print(index) << L" empty => foreground";\r
}\r
\r
- void clear()\r
+ void clear(int index)\r
{\r
- stop();\r
+ stop(index);\r
background_ = frame_producer::empty();\r
- CASPAR_LOG(warning) << print() << L" empty => background";\r
+ CASPAR_LOG(warning) << print(index) << L" empty => background";\r
}\r
\r
- safe_ptr<draw_frame> receive()\r
+ safe_ptr<draw_frame> receive(int index)\r
{ \r
if(is_paused_)\r
return last_frame_;\r
following->set_leading_producer(foreground_);\r
foreground_ = following;\r
\r
- CASPAR_LOG(info) << print() << L" [EOF] " << foreground_->print() << " => foreground";\r
+ CASPAR_LOG(info) << print(index) << L" [EOF] " << foreground_->print() << " => foreground";\r
\r
- last_frame_ = receive();\r
+ last_frame_ = receive(index);\r
}\r
}\r
catch(...)\r
{\r
CASPAR_LOG_CURRENT_EXCEPTION();\r
- stop();\r
+ stop(index);\r
}\r
\r
return last_frame_;\r
}\r
\r
- std::wstring print() const { return L"layer[]"; }\r
+ std::wstring print(int index) const { return L"layer[" + boost::lexical_cast<std::wstring>(index) + L"]"; }\r
};\r
\r
layer::layer() \r
{\r
impl_ = other.impl_.compare_and_swap(impl_, other.impl_);\r
}\r
-void layer::load(const safe_ptr<frame_producer>& frame_producer, bool play_on_load){return impl_->load(frame_producer, play_on_load);} \r
-void layer::preview(const safe_ptr<frame_producer>& frame_producer){return impl_->preview(frame_producer);} \r
-void layer::play(){impl_->play();}\r
-void layer::pause(){impl_->pause();}\r
-void layer::stop(){impl_->stop();}\r
-void layer::clear(){impl_->clear();}\r
-safe_ptr<draw_frame> layer::receive() {return impl_->receive();}\r
+void layer::load(int index, const safe_ptr<frame_producer>& frame_producer, bool play_on_load){return impl_->load(index, frame_producer, play_on_load);} \r
+void layer::preview(int index, const safe_ptr<frame_producer>& frame_producer){return impl_->preview(index, frame_producer);} \r
+void layer::play(int index){impl_->play(index);}\r
+void layer::pause(int index){impl_->pause(index);}\r
+void layer::stop(int index){impl_->stop(index);}\r
+void layer::clear(int index){impl_->clear(index);}\r
+safe_ptr<draw_frame> layer::receive(int index) {return impl_->receive(index);}\r
safe_ptr<frame_producer> layer::foreground() const { return impl_->foreground_;}\r
safe_ptr<frame_producer> layer::background() const { return impl_->background_;}\r
}}
\ No newline at end of file
//NOTE: swap is thread-safe on "other", NOT on "this".\r
void swap(layer& other); // nothrow \r
\r
- void load(const safe_ptr<frame_producer>& producer, bool play_on_load = false); // nothrow\r
- void preview(const safe_ptr<frame_producer>& producer); // nothrow\r
- void play(); // nothrow\r
- void pause(); // nothrow\r
- void stop(); // nothrow\r
- void clear(); // nothrow\r
+ void load(int index, const safe_ptr<frame_producer>& producer, bool play_on_load = false); // nothrow\r
+ void preview(int index, const safe_ptr<frame_producer>& producer); // nothrow\r
+ void play(int index); // nothrow\r
+ void pause(int index); // nothrow\r
+ void stop(int index); // nothrow\r
+ void clear(int index); // nothrow\r
\r
safe_ptr<frame_producer> foreground() const; // nothrow\r
safe_ptr<frame_producer> background() const; // nothrow\r
\r
- safe_ptr<draw_frame> receive(); // nothrow\r
+ safe_ptr<draw_frame> receive(int index); // nothrow\r
private:\r
struct implementation;\r
tbb::atomic<implementation*> impl_;\r