X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=core%2Fproducer%2Fscene%2Fscene_producer.cpp;h=efcfa3516460e6f94b8149be1a0a8d44fc663b53;hb=62c7da66319a85de98331bcf9dded7490ab62884;hp=7c3466b110334ab373847def24c121158fb14fd6;hpb=ff8eb9202aef3824d41592c53c9eacedf462f920;p=casparcg diff --git a/core/producer/scene/scene_producer.cpp b/core/producer/scene/scene_producer.cpp index 7c3466b11..efcfa3516 100644 --- a/core/producer/scene/scene_producer.cpp +++ b/core/producer/scene/scene_producer.cpp @@ -199,6 +199,15 @@ struct scene_producer::impl layers_.reverse(); } + layer& get_layer(const std::wstring& name) + { + for (auto& layer : layers_) + if (layer.name.get() == name) + return layer; + + CASPAR_THROW_EXCEPTION(user_error() << msg_info(name + L" not found in scene")); + } + void store_keyframe(void* timeline_identity, const keyframe& k) { timelines_[timeline_identity].keyframes.insert(std::make_pair(k.destination_frame, k)); @@ -216,6 +225,27 @@ struct scene_producer::impl markers_by_frame_.insert(std::make_pair(frame, marker(action, label))); } + void add_task(binding when, std::function task) + { + auto subscription = when.on_change([=] + { + if (when.get()) + { + try + { + task(); + } + catch (...) + { + CASPAR_LOG_CURRENT_EXCEPTION_AT_LEVEL(debug); + CASPAR_LOG(error) << print() << " Error when invoking scene task. Turn on log level debug for stacktrace."; + } + } + }); + + task_subscriptions_.push_back(std::move(subscription)); + } + core::variable& get_variable(const std::wstring& name) { auto found = variables_.find(name); @@ -614,10 +644,16 @@ layer& scene_producer::create_layer( return impl_->create_layer(producer, 0, 0, name); } -void scene_producer::reverse_layers() { +void scene_producer::reverse_layers() +{ impl_->reverse_layers(); } +layer& scene_producer::get_layer(const std::wstring& name) +{ + return impl_->get_layer(name); +} + binding scene_producer::timeline_frame() { return impl_->timeline_frame(); @@ -681,6 +717,11 @@ void scene_producer::add_mark(int64_t frame, mark_action action, const std::wstr impl_->add_mark(frame, action, label); } +void scene_producer::add_task(binding when, std::function task) +{ + impl_->add_task(std::move(when), std::move(task)); +} + core::variable& scene_producer::get_variable(const std::wstring& name) { return impl_->get_variable(name);