21class PluginFactory :
public QObject
33 using InstantiationFinishedHandler =
34 std::function<void (plugins::PluginUuidReference)>;
38 InstantiationFinishedHandler handler_;
39 QObject * handler_context_{};
49 plugins::PluginRegistry &plugin_registry_;
52 plugins::JucePlugin::CreatePluginInstanceAsyncFunc
53 create_plugin_instance_async_func_;
54 std::function<units::sample_rate_t ()> sample_rate_provider_;
55 std::function<
nframes_t ()> buffer_size_provider_;
56 plugins::PluginHostWindowFactory top_level_window_provider_;
60 PluginFactory () =
delete;
63 QObject * parent =
nullptr)
64 : QObject (parent), dependencies_ (std::move (dependencies))
69 template <
typename PluginT>
class Builder
74 explicit Builder (CommonFactoryDependencies dependencies)
75 : dependencies_ (std::move (dependencies))
79 Builder &with_setting (
const PluginConfiguration &setting)
85 Builder &with_instantiation_finished_options (
86 InstantiationFinishOptions instantiation_finish_options)
88 instantiation_finish_options_.emplace (instantiation_finish_options);
95 auto obj_ref = [&] () {
96 if constexpr (std::is_same_v<PluginT, plugins::ClapPlugin>)
98 return dependencies_.plugin_registry_.create_object<PluginT> (
99 dependencies_.processor_base_dependencies_,
100 dependencies_.state_dir_path_provider_,
101 dependencies_.audio_thread_checker_,
102 dependencies_.top_level_window_provider_);
105 std::derived_from<PluginT, plugins::InternalPluginBase>)
107 return dependencies_.plugin_registry_.create_object<PluginT> (
108 dependencies_.processor_base_dependencies_,
109 dependencies_.state_dir_path_provider_);
113 return dependencies_.plugin_registry_.create_object<PluginT> (
114 dependencies_.processor_base_dependencies_,
115 dependencies_.state_dir_path_provider_,
116 dependencies_.create_plugin_instance_async_func_,
117 dependencies_.sample_rate_provider_,
118 dependencies_.buffer_size_provider_,
119 dependencies_.top_level_window_provider_);
123 if (instantiation_finish_options_.has_value ())
130 const auto instantiation_finish_opts =
131 instantiation_finish_options_.value ();
134 instantiation_finish_opts.handler_context_,
135 [obj_ref, instantiation_finish_opts] () {
136 instantiation_finish_opts.handler_ (obj_ref);
139 obj_ref.get_object ());
142 if (setting_.has_value ())
144 obj_ref.template get_object_as<PluginT> ()->set_configuration (
149 throw std::logic_error (
"PluginConfiguration required");
156 CommonFactoryDependencies dependencies_;
157 OptionalRef<const PluginConfiguration> setting_;
158 std::optional<InstantiationFinishOptions> instantiation_finish_options_;
161 template <
typename PluginT>
auto get_builder ()
const
163 auto builder = Builder<PluginT> (dependencies_);
168 plugins::PluginUuidReference create_plugin_from_setting (
169 const PluginConfiguration &setting,
172 const auto * descriptor = setting.descriptor ();
173 if (descriptor ==
nullptr)
175 throw std::invalid_argument (
"Setting with valid descriptor required");
178 const auto protocol = descriptor->protocol_;
179 if (protocol == plugins::Protocol::ProtocolType::CLAP)
181 return get_builder<plugins::ClapPlugin> ()
182 .with_setting (setting)
183 .with_instantiation_finished_options (instantiation_finish_options)
188 return get_builder<plugins::InternalPluginBase> ()
189 .with_setting (setting)
190 .with_instantiation_finished_options (instantiation_finish_options)
194 return get_builder<plugins::JucePlugin> ()
195 .with_setting (setting)
196 .with_instantiation_finished_options (instantiation_finish_options)
202 template <
typename PluginT>
203 auto clone_new_object_identity (
const PluginT &other)
const
205 return plugin_registry_.clone_object (other, plugin_registry_);
208 template <
typename PluginT>
209 auto clone_object_snapshot (
const PluginT &other, QObject &owner)
const
213 new_obj = utils::clone_qobject (