Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
plugin_factory.h
1// SPDX-FileCopyrightText: © 2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <utility>
7
8#include "gui/backend/backend/settings_manager.h"
9#include "gui/dsp/plugin_all.h"
10#include "structure/tracks/track_all.h"
11
20class PluginFactory : public QObject
21{
22 Q_OBJECT
23 QML_ELEMENT
24public:
25 using PluginConfiguration = zrythm::plugins::PluginConfiguration;
26
27 PluginFactory () = delete;
28 PluginFactory (
29 PluginRegistry &registry,
30 PortRegistry &port_registry,
31 gui::SettingsManager &settings_mgr,
32 QObject * parent = nullptr)
33 : QObject (parent), plugin_registry_ (registry),
34 port_registry_ (port_registry), settings_manager_ (settings_mgr)
35 {
36 }
37
38 static PluginFactory * get_instance ();
39
40 template <typename PluginT> class Builder
41 {
42 friend class PluginFactory;
43
44 private:
45 explicit Builder (PluginRegistry &registry, PortRegistry &port_registry)
46 : registry_ (registry), port_registry_ (port_registry)
47 {
48 }
49
50 Builder &with_settings_manager (gui::SettingsManager &settings_manager)
51 {
52 settings_manager_ = settings_manager;
53 return *this;
54 }
55
56 Builder &with_setting (const PluginConfiguration &setting)
57 {
58 setting_ = setting;
59 return *this;
60 }
61
62 public:
63 auto build ()
64 {
65 auto obj_ref = [&] () {
66 return registry_.create_object<PluginT> (port_registry_, *setting_);
67 }();
68
69 // auto * obj = std::get<PluginT *> (obj_ref.get_object ());
70
71 return obj_ref;
72 }
73
74 private:
75 PluginRegistry &registry_;
76 PortRegistry &port_registry_;
77 OptionalRef<gui::SettingsManager> settings_manager_;
79 };
80
81 template <typename PluginT> auto get_builder () const
82 {
83 auto builder =
84 Builder<PluginT> (plugin_registry_, port_registry_)
85 .with_settings_manager (settings_manager_);
86 return builder;
87 }
88
89public:
90 PluginUuidReference
91 create_plugin_from_setting (const PluginConfiguration &setting) const
92 {
93 auto obj_ref =
94 get_builder<CarlaNativePlugin> ().with_setting (setting).build ();
95 return obj_ref;
96 }
97
98 template <typename PluginT>
99 auto clone_new_object_identity (const PluginT &other) const
100 {
101 return plugin_registry_.clone_object (other, plugin_registry_);
102 }
103
104 template <typename PluginT>
105 auto clone_object_snapshot (const PluginT &other, QObject &owner) const
106 {
107 PluginT * new_obj{};
108
109 new_obj = utils::clone_qobject (
110 other, &owner, utils::ObjectCloneType::Snapshot, plugin_registry_);
111 return new_obj;
112 }
113
114private:
115 PluginRegistry &plugin_registry_;
116 PortRegistry &port_registry_;
117 gui::SettingsManager &settings_manager_;
118};
Configuration for instantiating a plugin descriptor.
Wrapper around std::optional<std::reference_wrapper<T>> that provides a more convenient API.
Definition types.h:308