Anklang-0.3.0-1416-gfa8ce8d2 anklang-0.3.0-1416-gfa8ce8d2
ASE — Anklang Sound Engine (C++)

« « « Anklang Documentation
Loading...
Searching...
No Matches
plugin.cc
Go to the documentation of this file.
1 // This Source Code Form is licensed MPL-2.0: http://mozilla.org/MPL/2.0
2#include "trkn/tracktion.hh" // PCH include must come first
3
4#include "plugin.hh"
5#include "server.hh"
6#include "jsonipc/jsonipc.hh"
7#include "internal.hh"
8
9namespace te = tracktion::engine;
10
11namespace Ase {
12
13// == PluginStateListener ==
15 PluginImpl &aseplugin_;
16 juce::ValueTree plugin_state_;
17public:
18 PluginStateListener (PluginImpl &aseplugin) :
19 aseplugin_ (aseplugin), plugin_state_ (aseplugin_.plugin_->state)
20 {
21 plugin_state_.addListener (this);
22 }
23 ~PluginStateListener() override
24 {
25 plugin_state_.removeListener (this);
26 }
27 void
28 valueTreePropertyChanged (juce::ValueTree &tree, const juce::Identifier &property) override
29 {
30 assert_return (tree == plugin_state_);
31 if (property == tracktion::engine::IDs::name || property == tracktion::engine::IDs::title)
32 aseplugin_.emit_notify ("name");
33 else if (property == tracktion::engine::IDs::enabled)
34 aseplugin_.emit_notify ("enabled");
35 else if (property == tracktion::engine::IDs::frozen)
36 aseplugin_.emit_notify ("frozen");
37 }
38 void valueTreeChildAdded (juce::ValueTree&, juce::ValueTree&) override {}
39 void valueTreeChildRemoved (juce::ValueTree&, juce::ValueTree&, int) override {}
40 void valueTreeParentChanged (juce::ValueTree&) override {}
41 void valueTreeChildOrderChanged (juce::ValueTree&, int, int) override {}
42};
43
44// == PluginImpl ==
46trkn_plugin_name (te::Plugin *plugin)
47{
48 if (auto text = dynamic_cast<te::TextPlugin*> (plugin))
49 return &text->textTitle;
50 if (auto insert = dynamic_cast<te::InsertPlugin*> (plugin))
51 return &insert->name;
52 return nullptr;
53}
54
55PluginImplP
56PluginImpl::from_trkn (tracktion::Plugin &p)
57{
58 PluginImpl *plugin = find_ase_obj<PluginImpl> (p);
59 if (plugin)
60 return shared_ptr_cast<PluginImpl> (plugin);
61 PluginImplP pluginp = PluginImpl::make_shared (p);
62 return pluginp;
63}
64
65PluginImpl::PluginImpl (tracktion::Plugin &plugin) :
66 plugin_ (&plugin), plugin_type_ (plugin.getPluginType().toStdString())
67{
69 state_listener_ = std::make_unique<PluginStateListener> (*this);
70}
71
72PluginImpl::~PluginImpl()
73{
74 unregister_ase_obj (this, plugin_.get());
75 state_listener_ = nullptr;
76 assert_return (_parent() == nullptr);
77}
78
80PluginImpl::name() const
81{
82 if (auto pluginp = plugin_.get())
83 return pluginp->getName().toStdString();
84 return "";
85}
86
87void
88PluginImpl::name (const std::string &n)
89{
90 const juce::String new_name (n);
91 if (auto name = trkn_plugin_name (plugin_.get()); name && name->get() != new_name)
92 {
93 plugin_->getUndoManager()->beginNewTransaction ("Set Plugin Name");
94 *name = new_name;
95 }
96}
97
100{
101 return plugin_type_;
102}
103
104bool
106{
107 if (auto pluginp = plugin_.get())
108 return pluginp->isEnabled();
109 return false;
110}
111
112void
114{
115 if (auto pluginp = plugin_.get())
116 pluginp->setEnabled (enabled);
117}
118
119bool
121{
122 if (auto pluginp = plugin_.get())
123 return pluginp->isFrozen();
124 return false;
125}
126
127void
129{
130 if (auto pluginp = plugin_.get())
131 pluginp->setFrozen (frozen);
132}
133
136{
137 DeviceInfo info;
138 if (auto pluginp = plugin_.get()) {
139 info.uri = pluginp->getIdentifierString().toStdString();
140 info.name = pluginp->getName().toStdString();
141 info.description = pluginp->getTooltip().toStdString();
142 }
143 return info;
144}
145
148{
149 return trkn_plugin_name (plugin_.get()) ? StringS {} : StringS { "name" };
150}
151
152void
154{
155 auto *plugin = plugin_.get();
156 if (plugin) {
157 plugin->removeFromParent();
159 state_listener_ = nullptr;
160 }
162}
163
164} // Ase
void emit_notify(const String &detail) override
Emit notify:detail, multiple notifications maybe coalesced if a CoalesceNotifies instance exists.
Definition object.cc:164
GadgetImpl * _parent() const override
Retrieve parent container.
Definition gadget.hh:25
void remove_self() override
Remove self from parent container.
Definition gadget.cc:86
Ase::Plugin implementation wrapping tracktion::Plugin.
Definition plugin.hh:10
tracktion::Plugin * plugin() const noexcept
Access underlying tracktion::Plugin (for internal use).
Definition plugin.hh:32
bool enabled() const override
Check if plugin is enabled.
Definition plugin.cc:105
StringS read_only_properties() const override
List x()/x (v) properties that this object can't change, their setters ignore the value or warn.
Definition plugin.cc:147
String plugin_type() const override
Plugin type identifier.
Definition plugin.cc:99
void remove_self() override
Remove self from parent container.
Definition plugin.cc:153
bool frozen() const override
Check if plugin is frozen.
Definition plugin.cc:120
DeviceInfo device_info() override
Describe this Device type.
Definition plugin.cc:135
Mimick tracktion::engine::SafeSelectable<> for tracktion::Selectable descendants.
Definition trkn-utils.hh:35
void addListener(Listener *listener)
void removeListener(Listener *listener)
#define assert_return(expr,...)
Return from the current function if expr is unmet and issue an assertion warning.
Definition internal.hh:28
The Anklang C++ API namespace.
Definition api.hh:8
void register_ase_obj(VirtualBase *ase_impl, tracktion::Selectable &selectable)
Helper: register AseImpl with a tracktion Selectable via ase_obj_.
std::string String
Convenience alias for std::string.
Definition cxxaux.hh:34
void unregister_ase_obj(VirtualBase *ase_impl, tracktion::Selectable *selectable)
Helper: unregister AseImpl from a tracktion Selectable (selectable may be nullptr)
Info for device types.
Definition api.hh:202