23class PluginFactory :
public QObject
35 using InstantiationFinishedHandler =
36 std::function<void (plugins::PluginUuidReference)>;
40 InstantiationFinishedHandler handler_;
41 QObject * handler_context_{};
47 plugins::JucePlugin::CreatePluginInstanceAsyncFunc
48 create_plugin_instance_async_func_;
49 std::function<units::sample_rate_t ()> sample_rate_provider_;
50 std::function<units::sample_u32_t ()> buffer_size_provider_;
51 plugins::PluginHostWindowFactory top_level_window_provider_;
54 PluginFactory () =
delete;
57 QObject * parent =
nullptr)
58 : QObject (parent), dependencies_ (std::move (dependencies))
63 template <
typename PluginT>
class Builder
68 explicit Builder (CommonFactoryDependencies dependencies)
69 : dependencies_ (std::move (dependencies))
73 Builder &with_setting (
const PluginConfiguration &setting)
79 Builder &with_instantiation_finished_options (
80 InstantiationFinishOptions instantiation_finish_options)
82 instantiation_finish_options_.emplace (instantiation_finish_options);
89 auto obj_ref = [&] () {
90 if constexpr (std::is_same_v<PluginT, plugins::ClapPlugin>)
92 return utils::create_object<PluginT> (
93 dependencies_.registry, dependencies_.registry,
94 dependencies_.top_level_window_provider_);
97 std::derived_from<PluginT, plugins::InternalPluginBase>)
99 return utils::create_object<PluginT> (
100 dependencies_.registry, dependencies_.registry);
104 return utils::create_object<PluginT> (
105 dependencies_.registry, dependencies_.registry,
106 dependencies_.create_plugin_instance_async_func_,
107 dependencies_.sample_rate_provider_,
108 dependencies_.buffer_size_provider_,
109 dependencies_.top_level_window_provider_);
113 if (instantiation_finish_options_.has_value ())
118 const auto instantiation_finish_opts =
119 instantiation_finish_options_.value ();
120 auto * plugin = obj_ref.get ();
123 instantiation_finish_opts.handler_context_,
124 [obj_ref, instantiation_finish_opts] () {
125 instantiation_finish_opts.handler_ (obj_ref);
129 if (setting_.has_value ())
131 obj_ref.template get_object_as<PluginT> ()->set_configuration (
136 throw std::logic_error (
"PluginConfiguration required");
143 CommonFactoryDependencies dependencies_;
144 utils::OptionalRef<const PluginConfiguration> setting_;
145 std::optional<InstantiationFinishOptions> instantiation_finish_options_;
148 template <
typename PluginT>
auto get_builder ()
const
150 auto builder = Builder<PluginT> (dependencies_);
155 template <
typename PluginT>
156 std::unique_ptr<PluginT> build_for_deserialization ()
const
158 if constexpr (std::is_same_v<PluginT, plugins::ClapPlugin>)
160 return std::make_unique<PluginT> (
161 dependencies_.registry, dependencies_.top_level_window_provider_);
163 else if constexpr (std::derived_from<PluginT, plugins::InternalPluginBase>)
165 return std::make_unique<PluginT> (dependencies_.registry);
169 return std::make_unique<PluginT> (
170 dependencies_.registry,
171 dependencies_.create_plugin_instance_async_func_,
172 dependencies_.sample_rate_provider_,
173 dependencies_.buffer_size_provider_,
174 dependencies_.top_level_window_provider_);
179 plugins::PluginUuidReference create_plugin_from_setting (
180 const PluginConfiguration &setting,
183 const auto * descriptor = setting.descriptor ();
184 if (descriptor ==
nullptr)
186 throw std::invalid_argument (
"Setting with valid descriptor required");
189 const auto protocol = descriptor->protocol_;
190 if (protocol == plugins::Protocol::ProtocolType::CLAP)
192 return get_builder<plugins::ClapPlugin> ()
193 .with_setting (setting)
194 .with_instantiation_finished_options (instantiation_finish_options)
199 return get_builder<plugins::InternalPluginBase> ()
200 .with_setting (setting)
201 .with_instantiation_finished_options (instantiation_finish_options)
205 return get_builder<plugins::JucePlugin> ()
206 .with_setting (setting)
207 .with_instantiation_finished_options (instantiation_finish_options)
213 template <
typename PluginT>
214 auto clone_new_object_identity (
const PluginT &other)
const
216 return plugin_registry_.clone_object (other, plugin_registry_);
219 template <
typename PluginT>
220 auto clone_object_snapshot (
const PluginT &other, QObject &owner)
const
224 new_obj = utils::clone_qobject (