g_factories.push_back(factory);\r
}\r
\r
-boost::unique_future<std::wstring> frame_producer::call(const std::wstring&) \r
+struct frame_producer_base::impl\r
+{\r
+ tbb::atomic<uint32_t> frame_number_;\r
+ tbb::atomic<bool> paused_;\r
+ frame_producer_base& self_;\r
+ draw_frame last_frame_;\r
+\r
+ impl(frame_producer_base& self)\r
+ : self_(self)\r
+ , last_frame_(draw_frame::empty())\r
+ {\r
+ frame_number_ = 0;\r
+ paused_ = false;\r
+ }\r
+ \r
+ draw_frame receive()\r
+ {\r
+ if(paused_)\r
+ return self_.last_frame();\r
+\r
+ auto frame = draw_frame::push(self_.receive_impl());\r
+ if(frame == draw_frame::late())\r
+ return frame;\r
+\r
+ ++frame_number_;\r
+\r
+ return last_frame_ = frame;\r
+ }\r
+\r
+ void paused(bool value)\r
+ {\r
+ paused_ = value;\r
+ }\r
+\r
+ draw_frame last_frame() const\r
+ {\r
+ return draw_frame::still(last_frame_);\r
+ }\r
+};\r
+\r
+frame_producer_base::frame_producer_base() : impl_(new impl(*this))\r
+{\r
+}\r
+\r
+frame_producer_base::frame_producer_base(frame_producer_base& self) : impl_(new impl(self))\r
+{\r
+}\r
+\r
+draw_frame frame_producer_base::receive()\r
+{\r
+ return impl_->receive();\r
+}\r
+\r
+void frame_producer_base::paused(bool value)\r
+{\r
+ impl_->paused(value);\r
+}\r
+\r
+draw_frame frame_producer_base::last_frame() const\r
+{\r
+ return impl_->last_frame();\r
+}\r
+\r
+boost::unique_future<std::wstring> frame_producer_base::call(const std::wstring&) \r
{\r
BOOST_THROW_EXCEPTION(not_supported());\r
}\r
\r
+uint32_t frame_producer_base::nb_frames() const\r
+{\r
+ return std::numeric_limits<uint32_t>::max();\r
+}\r
+\r
+uint32_t frame_producer_base::frame_number() const\r
+{\r
+ return impl_->frame_number_;\r
+}\r
+\r
const spl::shared_ptr<frame_producer>& frame_producer::empty() \r
{\r
class empty_frame_producer : public frame_producer\r
{\r
public:\r
empty_frame_producer(){}\r
- virtual draw_frame receive(int){return draw_frame::empty();}\r
- virtual draw_frame last_frame() const{return draw_frame::empty();}\r
- virtual void set_frame_factory(const spl::shared_ptr<frame_factory>&){}\r
- virtual uint32_t nb_frames() const {return 0;}\r
- virtual std::wstring print() const { return L"empty";}\r
- virtual void subscribe(const monitor::observable::observer_ptr& o){}\r
- virtual void unsubscribe(const monitor::observable::observer_ptr& o){} \r
- virtual std::wstring name() const {return L"empty";}\r
+ draw_frame receive() override{return draw_frame::empty();}\r
+ void paused(bool value) override{}\r
+ uint32_t nb_frames() const override {return 0;}\r
+ std::wstring print() const override { return L"empty";}\r
+ void subscribe(const monitor::observable::observer_ptr& o) override{}\r
+ void unsubscribe(const monitor::observable::observer_ptr& o) override{} \r
+ std::wstring name() const override {return L"empty";}\r
+ uint32_t frame_number() const override {return 0;}\r
+ boost::unique_future<std::wstring> call(const std::wstring& params) override{BOOST_THROW_EXCEPTION(not_supported());}\r
+ draw_frame last_frame() const {return draw_frame::empty();}\r
\r
boost::property_tree::wptree info() const override\r
{\r
}).detach(); \r
}\r
\r
- draw_frame receive(int flags) override {return producer_->receive(flags);}\r
- draw_frame last_frame() const override {return producer_->last_frame();}\r
+ draw_frame receive() override {return producer_->receive();}\r
std::wstring print() const override {return producer_->print();}\r
+ void paused(bool value) override {producer_->paused(value);}\r
std::wstring name() const override {return producer_->name();}\r
+ uint32_t frame_number() const override {return producer_->frame_number();}\r
boost::property_tree::wptree info() const override {return producer_->info();}\r
boost::unique_future<std::wstring> call(const std::wstring& str) override {return producer_->call(str);}\r
void leading_producer(const spl::shared_ptr<frame_producer>& producer) override {return producer_->leading_producer(producer);}\r
uint32_t nb_frames() const override {return producer_->nb_frames();}\r
- virtual void subscribe(const monitor::observable::observer_ptr& o) {return producer_->subscribe(o);}\r
- virtual void unsubscribe(const monitor::observable::observer_ptr& o) {return producer_->unsubscribe(o);}\r
+ class draw_frame last_frame() const {return producer_->last_frame();}\r
+ void subscribe(const monitor::observable::observer_ptr& o) {return producer_->subscribe(o);}\r
+ void unsubscribe(const monitor::observable::observer_ptr& o) {return producer_->unsubscribe(o);}\r
};\r
\r
spl::shared_ptr<core::frame_producer> create_destroy_proxy(spl::shared_ptr<core::frame_producer> producer)\r