{\r
for(size_t i = r.begin(); i != r.end(); ++i)\r
{\r
- frames[i] = layers_[i].receive(i);\r
+ frames[i] = layers_[i].receive();\r
frames[i]->set_layer_index(i);\r
}\r
}); \r
producer->initialize(factory_);\r
executor_.invoke([&]\r
{\r
- layers_[index].load(index, producer, play_on_load);\r
+ layers_[index].load(producer, play_on_load);\r
});\r
}\r
\r
producer->initialize(factory_);\r
executor_.invoke([&]\r
{ \r
- layers_[index].preview(index, producer);\r
+ layers_[index].preview(producer);\r
});\r
}\r
\r
check_bounds(index);\r
executor_.invoke([&]\r
{\r
- layers_[index].pause(index);\r
+ layers_[index].pause();\r
});\r
}\r
\r
check_bounds(index);\r
executor_.invoke([&]\r
{\r
- layers_[index].play(index);\r
+ layers_[index].play();\r
});\r
}\r
\r
check_bounds(index);\r
executor_.invoke([&]\r
{\r
- layers_[index].stop(index);\r
+ layers_[index].stop();\r
});\r
}\r
\r
\r
void swap_output(frame_producer_device& other)\r
{\r
+ if(other.impl_.get() == this)\r
+ return;\r
+\r
tbb::spin_mutex::scoped_lock lock1(output_mutex_);\r
tbb::spin_mutex::scoped_lock lock2(other.impl_->output_mutex_);\r
output_.swap(other.impl_->output_);\r
, last_frame_(draw_frame::empty())\r
, is_paused_(false){}\r
\r
- void load(int index, const safe_ptr<frame_producer>& frame_producer, bool play_on_load)\r
+ void load(const safe_ptr<frame_producer>& frame_producer, bool play_on_load)\r
{ \r
background_ = frame_producer;\r
- CASPAR_LOG(info) << print(index) << " " << frame_producer->print() << " => background";\r
if(play_on_load)\r
- play(index); \r
+ play(); \r
}\r
\r
- void preview(int index, const safe_ptr<frame_producer>& frame_producer)\r
+ void preview(const safe_ptr<frame_producer>& frame_producer)\r
{\r
- stop(index);\r
- load(index, frame_producer, false); \r
+ stop();\r
+ load(frame_producer, false); \r
try\r
{\r
last_frame_ = frame_producer->receive();\r
catch(...)\r
{\r
CASPAR_LOG_CURRENT_EXCEPTION();\r
- clear(index);\r
+ clear();\r
}\r
}\r
\r
- void play(int index)\r
+ void play()\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(index) << L" background => foreground";\r
}\r
}\r
\r
- void pause(int)\r
+ void pause()\r
{\r
is_paused_ = true;\r
}\r
\r
- void stop(int index)\r
+ void stop()\r
{\r
- pause(index);\r
+ pause();\r
last_frame_ = draw_frame::empty();\r
foreground_ = frame_producer::empty();\r
- CASPAR_LOG(warning) << print(index) << L" empty => foreground";\r
}\r
\r
- void clear(int index)\r
+ void clear()\r
{\r
- stop(index);\r
+ stop();\r
background_ = frame_producer::empty();\r
- CASPAR_LOG(warning) << print(index) << L" empty => background";\r
}\r
\r
- safe_ptr<draw_frame> receive(int index)\r
+ safe_ptr<draw_frame> receive()\r
{ \r
if(is_paused_)\r
return last_frame_;\r
following->set_leading_producer(foreground_);\r
foreground_ = following;\r
\r
- CASPAR_LOG(info) << print(index) << L" [EOF] " << foreground_->print() << " => foreground";\r
-\r
- last_frame_ = receive(index);\r
+ last_frame_ = receive();\r
}\r
}\r
catch(...)\r
{\r
CASPAR_LOG_CURRENT_EXCEPTION();\r
- stop(index);\r
+ stop();\r
}\r
\r
return last_frame_;\r
}\r
-\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(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
+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
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(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
+ 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
\r
safe_ptr<frame_producer> foreground() const; // nothrow\r
safe_ptr<frame_producer> background() const; // nothrow\r
\r
- safe_ptr<draw_frame> receive(int index); // nothrow\r
+ safe_ptr<draw_frame> receive(); // nothrow\r
private:\r
struct implementation;\r
tbb::atomic<implementation*> impl_;\r