struct hotswap_producer::impl
{
- monitor::subject monitor_subject;
- binding<std::shared_ptr<frame_producer>> producer;
- constraints size;
+ spl::shared_ptr<monitor::subject> monitor_subject;
+ binding<std::shared_ptr<frame_producer>> producer;
+ constraints size;
- impl(int width, int height)
+ impl(int width, int height, bool auto_size)
: size(width, height)
{
+ producer.on_change([=]
+ {
+ if (auto_size)
+ {
+ size.width.bind(producer.get()->pixel_constraints().width);
+ size.height.bind(producer.get()->pixel_constraints().height);
+ }
+
+ producer.get()->monitor_output().attach_parent(monitor_subject);
+ });
}
};
-hotswap_producer::hotswap_producer(int width, int height)
- : impl_(new impl(width, height))
+hotswap_producer::hotswap_producer(int width, int height, bool auto_size)
+ : impl_(new impl(width, height, auto_size))
{
}
monitor::subject& hotswap_producer::monitor_output()
{
- return impl_->monitor_subject;
+ return *impl_->monitor_subject;
+}
+
+variable& hotswap_producer::get_variable(const std::wstring& name)
+{
+ auto producer = impl_->producer.get();
+
+ if (producer)
+ return producer->get_variable(name);
+ else
+ return frame_producer_base::get_variable(name);
+}
+
+const std::vector<std::wstring>& hotswap_producer::get_variables() const
+{
+ auto producer = impl_->producer.get();
+
+ if (producer)
+ return producer->get_variables();
+ else
+ return frame_producer_base::get_variables();
}
binding<std::shared_ptr<frame_producer>>& hotswap_producer::producer()
class hotswap_producer : public frame_producer_base
{
public:
- hotswap_producer(int width, int height);
+ hotswap_producer(int width, int height, bool auto_size = false);
~hotswap_producer();
- draw_frame receive_impl() override;
- constraints& pixel_constraints() override;
- std::wstring print() const override;
- std::wstring name() const override;
- boost::property_tree::wptree info() const override;
- monitor::subject& monitor_output();
+ draw_frame receive_impl() override;
+ constraints& pixel_constraints() override;
+ std::wstring print() const override;
+ std::wstring name() const override;
+ boost::property_tree::wptree info() const override;
+ monitor::subject& monitor_output() override;
+ variable& get_variable(const std::wstring& name) override;
+ const std::vector<std::wstring>& get_variables() const override;
binding<std::shared_ptr<frame_producer>>& producer();
private: