21class PluginFactory :
public QObject
33 using InstantiationFinishedHandler =
34 std::function<void (plugins::PluginUuidReference)>;
38 InstantiationFinishedHandler handler_;
39 QObject * handler_context_{};
44 plugins::PluginRegistry &plugin_registry_;
46 plugins::JucePlugin::CreatePluginInstanceAsyncFunc
47 create_plugin_instance_async_func_;
48 std::function<units::sample_rate_t ()> sample_rate_provider_;
49 std::function<units::sample_u32_t ()> buffer_size_provider_;
50 plugins::PluginHostWindowFactory top_level_window_provider_;
53 PluginFactory () =
delete;
56 QObject * parent =
nullptr)
57 : QObject (parent), dependencies_ (std::move (dependencies))
62 template <
typename PluginT>
class Builder
67 explicit Builder (CommonFactoryDependencies dependencies)
68 : dependencies_ (std::move (dependencies))
72 Builder &with_setting (
const PluginConfiguration &setting)
78 Builder &with_instantiation_finished_options (
79 InstantiationFinishOptions instantiation_finish_options)
81 instantiation_finish_options_.emplace (instantiation_finish_options);
88 auto obj_ref = [&] () {
89 if constexpr (std::is_same_v<PluginT, plugins::ClapPlugin>)
91 return dependencies_.plugin_registry_.create_object<PluginT> (
92 dependencies_.processor_base_dependencies_,
93 dependencies_.top_level_window_provider_);
96 std::derived_from<PluginT, plugins::InternalPluginBase>)
98 return dependencies_.plugin_registry_.create_object<PluginT> (
99 dependencies_.processor_base_dependencies_);
103 return dependencies_.plugin_registry_.create_object<PluginT> (
104 dependencies_.processor_base_dependencies_,
105 dependencies_.create_plugin_instance_async_func_,
106 dependencies_.sample_rate_provider_,
107 dependencies_.buffer_size_provider_,
108 dependencies_.top_level_window_provider_);
112 if (instantiation_finish_options_.has_value ())
119 const auto instantiation_finish_opts =
120 instantiation_finish_options_.value ();
123 instantiation_finish_opts.handler_context_,
124 [obj_ref, instantiation_finish_opts] () {
125 instantiation_finish_opts.handler_ (obj_ref);
128 obj_ref.get_object ());
131 if (setting_.has_value ())
133 obj_ref.template get_object_as<PluginT> ()->set_configuration (
138 throw std::logic_error (
"PluginConfiguration required");
145 CommonFactoryDependencies dependencies_;
146 utils::OptionalRef<const PluginConfiguration> setting_;
147 std::optional<InstantiationFinishOptions> instantiation_finish_options_;
150 template <
typename PluginT>
auto get_builder ()
const
152 auto builder = Builder<PluginT> (dependencies_);
157 plugins::PluginUuidReference create_plugin_from_setting (
158 const PluginConfiguration &setting,
161 const auto * descriptor = setting.descriptor ();
162 if (descriptor ==
nullptr)
164 throw std::invalid_argument (
"Setting with valid descriptor required");
167 const auto protocol = descriptor->protocol_;
168 if (protocol == plugins::Protocol::ProtocolType::CLAP)
170 return get_builder<plugins::ClapPlugin> ()
171 .with_setting (setting)
172 .with_instantiation_finished_options (instantiation_finish_options)
177 return get_builder<plugins::InternalPluginBase> ()
178 .with_setting (setting)
179 .with_instantiation_finished_options (instantiation_finish_options)
183 return get_builder<plugins::JucePlugin> ()
184 .with_setting (setting)
185 .with_instantiation_finished_options (instantiation_finish_options)
191 template <
typename PluginT>
192 auto clone_new_object_identity (
const PluginT &other)
const
194 return plugin_registry_.clone_object (other, plugin_registry_);
197 template <
typename PluginT>
198 auto clone_object_snapshot (
const PluginT &other, QObject &owner)
const
202 new_obj = utils::clone_qobject (