24class PluginFactory :
public QObject
36 using InstantiationFinishedHandler =
37 std::function<void (plugins::PluginUuidReference)>;
41 InstantiationFinishedHandler handler_;
42 QObject * handler_context_{};
48 plugins::JucePlugin::CreatePluginInstanceAsyncFunc
49 create_plugin_instance_async_func_;
50 std::function<units::sample_rate_t ()> sample_rate_provider_;
51 std::function<units::sample_u32_t ()> buffer_size_provider_;
52 plugins::PluginHostWindowFactory top_level_window_provider_;
55 PluginFactory () =
delete;
58 QObject * parent =
nullptr)
59 : QObject (parent), dependencies_ (std::move (dependencies))
64 template <
typename PluginT>
class Builder
69 explicit Builder (CommonFactoryDependencies dependencies)
70 : dependencies_ (std::move (dependencies))
74 Builder &with_setting (
const PluginConfiguration &setting)
76 setting_ = type_safe::opt_ref (setting);
80 Builder &with_instantiation_finished_options (
81 InstantiationFinishOptions instantiation_finish_options)
83 instantiation_finish_options_.emplace (instantiation_finish_options);
90 auto obj_ref = [&] () {
91 if constexpr (std::is_same_v<PluginT, plugins::ClapPlugin>)
93 return utils::create_object<PluginT> (
94 dependencies_.registry, dependencies_.registry,
95 dependencies_.top_level_window_provider_);
98 std::derived_from<PluginT, plugins::InternalPluginBase>)
100 return utils::create_object<PluginT> (
101 dependencies_.registry, dependencies_.registry);
105 return utils::create_object<PluginT> (
106 dependencies_.registry, dependencies_.registry,
107 dependencies_.create_plugin_instance_async_func_,
108 dependencies_.sample_rate_provider_,
109 dependencies_.buffer_size_provider_,
110 dependencies_.top_level_window_provider_);
114 if (instantiation_finish_options_.has_value ())
119 const auto instantiation_finish_opts =
120 instantiation_finish_options_.value ();
121 auto * plugin = obj_ref.get ();
124 instantiation_finish_opts.handler_context_,
125 [obj_ref, instantiation_finish_opts] () {
126 instantiation_finish_opts.handler_ (obj_ref);
130 if (setting_.has_value ())
132 obj_ref.template get_object_as<PluginT> ()->set_configuration (
137 throw std::logic_error (
"PluginConfiguration required");
144 CommonFactoryDependencies dependencies_;
145 type_safe::optional_ref<const PluginConfiguration> setting_;
146 std::optional<InstantiationFinishOptions> instantiation_finish_options_;
149 template <
typename PluginT>
auto get_builder ()
const
151 auto builder = Builder<PluginT> (dependencies_);
156 template <
typename PluginT>
157 std::unique_ptr<PluginT> build_for_deserialization ()
const
159 if constexpr (std::is_same_v<PluginT, plugins::ClapPlugin>)
161 return std::make_unique<PluginT> (
162 dependencies_.registry, dependencies_.top_level_window_provider_);
164 else if constexpr (std::derived_from<PluginT, plugins::InternalPluginBase>)
166 return std::make_unique<PluginT> (dependencies_.registry);
170 return std::make_unique<PluginT> (
171 dependencies_.registry,
172 dependencies_.create_plugin_instance_async_func_,
173 dependencies_.sample_rate_provider_,
174 dependencies_.buffer_size_provider_,
175 dependencies_.top_level_window_provider_);
180 plugins::PluginUuidReference create_plugin_from_setting (
181 const PluginConfiguration &setting,
184 const auto * descriptor = setting.descriptor ();
185 if (descriptor ==
nullptr)
187 throw std::invalid_argument (
"Setting with valid descriptor required");
190 const auto protocol = descriptor->protocol_;
191 if (protocol == plugins::Protocol::ProtocolType::CLAP)
193 return get_builder<plugins::ClapPlugin> ()
194 .with_setting (setting)
195 .with_instantiation_finished_options (instantiation_finish_options)
200 return get_builder<plugins::InternalPluginBase> ()
201 .with_setting (setting)
202 .with_instantiation_finished_options (instantiation_finish_options)
206 return get_builder<plugins::JucePlugin> ()
207 .with_setting (setting)
208 .with_instantiation_finished_options (instantiation_finish_options)
214 template <
typename PluginT>
215 auto clone_new_object_identity (
const PluginT &other)
const
217 return plugin_registry_.clone_object (other, plugin_registry_);
220 template <
typename PluginT>
221 auto clone_object_snapshot (
const PluginT &other, QObject &owner)
const
225 new_obj = utils::clone_qobject (