Loading...
Searching...
No Matches
score-plugin-vst3/Vst3/ApplicationPlugin.hpp
1#pragma once
2#include <Vst3/Plugin.hpp>
3
4#include <score/plugins/application/GUIApplicationPlugin.hpp>
5
6#include <ossia/detail/fmt.hpp>
7#include <ossia/detail/string_map.hpp>
8
9#include <QtCore/qglobal.h>
10
11#include <score_plugin_vst3_export.h>
12
13#include <base/source/fstring.h>
14#include <pluginterfaces/vst/ivsteditcontroller.h>
15#include <pluginterfaces/vst/ivstmessage.h>
16#include <pluginterfaces/vst/ivstpluginterfacesupport.h>
17
18#include <memory>
19#include <stdexcept>
20#include <verdigris>
21
22class QTimer;
23class QJsonObject;
24namespace Media
25{
26class PluginScanner;
27}
28
29namespace vst3
30{
32{
33 QString path;
34 QString name;
35 QString url;
36 std::vector<VST3::Hosting::ClassInfo> classInfo;
37
38 bool isValid{};
39};
40
43SCORE_PLUGIN_VST3_TEST_EXPORT
44AvailablePlugin parseVst3Reply(const QString& path, const QJsonObject& obj);
45
46struct HostApp final : public Steinberg::Vst::IHostApplication
47{
50 struct InterfaceSupport final : public Steinberg::Vst::IPlugInterfaceSupport
51 {
52 Steinberg::tresult PLUGIN_API
53 isPlugInterfaceSupported(const Steinberg::TUID _iid) override
54 {
55 using namespace Steinberg;
56 using namespace Steinberg::Vst;
57 for(const FUID* iid :
58 {&IComponent::iid, &IAudioProcessor::iid, &IEditController::iid,
59 &IConnectionPoint::iid, &IUnitInfo::iid, &IMidiMapping::iid})
60 if(FUnknownPrivate::iidEqual(_iid, static_cast<const TUID&>(*iid)))
61 return kResultTrue;
62 return kResultFalse;
63 }
64
65 Steinberg::tresult PLUGIN_API queryInterface(const char* _iid, void** obj) override
66 {
67 using namespace Steinberg;
68 using namespace Steinberg::Vst;
69 QUERY_INTERFACE(_iid, obj, FUnknown::iid, IPlugInterfaceSupport)
70 QUERY_INTERFACE(_iid, obj, IPlugInterfaceSupport::iid, IPlugInterfaceSupport)
71 *obj = nullptr;
72 return kNoInterface;
73 }
74 Steinberg::uint32 PLUGIN_API addRef() override { return 1; }
75 Steinberg::uint32 PLUGIN_API release() override { return 1; }
76 } m_support;
77
78 HostApp() { }
79 virtual ~HostApp() { }
80 Steinberg::tresult PLUGIN_API getName(Steinberg::Vst::String128 name) override
81 {
82 Steinberg::String str("ossia score");
83 str.copyTo16(name, 0, 127);
84 return Steinberg::kResultTrue;
85 }
86
87 Steinberg::tresult
88 PLUGIN_API createInstance(Steinberg::TUID cid, Steinberg::TUID _iid, void** obj) override
89 {
90 using namespace Steinberg;
91 using namespace Steinberg::Vst;
92 FUID classID(FUID::fromTUID(cid));
93 FUID interfaceID(FUID::fromTUID(_iid));
94 if(classID == Vst::IMessage::iid && interfaceID == Vst::IMessage::iid)
95 {
96 *obj = new HostMessage;
97 return kResultTrue;
98 }
99 else if(
100 classID == Vst::IAttributeList::iid && interfaceID == Vst::IAttributeList::iid)
101 {
102 *obj = Vst::HostAttributeList::make();
103 return kResultTrue;
104 }
105 *obj = nullptr;
106 return kResultFalse;
107 }
108
109 Steinberg::tresult PLUGIN_API queryInterface(const char* _iid, void** obj) override
110 {
111 using namespace Steinberg;
112 using namespace Steinberg::Vst;
113 QUERY_INTERFACE(_iid, obj, FUnknown::iid, IHostApplication)
114 QUERY_INTERFACE(_iid, obj, IHostApplication::iid, IHostApplication)
115
116 if(m_support.queryInterface(_iid, obj) == kResultOk)
117 return kResultOk;
118
119 *obj = nullptr;
120 return kResultFalse;
121 }
122
123 Steinberg::uint32 PLUGIN_API addRef() override { return 1; }
124
125 Steinberg::uint32 PLUGIN_API release() override { return 1; }
126};
127
128class SCORE_PLUGIN_VST3_EXPORT ApplicationPlugin
129 : public QObject
131{
132 W_OBJECT(ApplicationPlugin)
133public:
136
137 void initialize() override;
138
139 VST3::Hosting::Module::Ptr getModule(const std::string& path);
140
141 void rescan();
142 void rescan(const QStringList& paths);
143 void vstChanged() E_SIGNAL(SCORE_PLUGIN_VST3_EXPORT, vstChanged);
144
145 std::pair<const AvailablePlugin*, const VST3::Hosting::ClassInfo*>
146 classInfo(const VST3::UID& uid) const noexcept;
147 QString pathForClass(const VST3::UID& uid) const noexcept;
148 std::optional<VST3::UID>
149 uidForPathAndClassName(const QString& path, const QString& cls) const noexcept;
150
151 HostApp m_host;
152 ossia::string_map<VST3::Hosting::Module::Ptr> modules;
153 std::vector<AvailablePlugin> vst_infos;
154
155private:
156 void onScanned(const QString& path, const QJsonObject& obj);
157 void onScanFailed(const QString& path, const QString& reason);
158 void removeEntriesForPath(const QString& path);
159 void persistCache();
160 void schedulePersist();
161
162#if QT_CONFIG(process)
163 std::unique_ptr<Media::PluginScanner> m_scanner;
164#endif
165 QTimer* m_persistTimer{};
166 bool m_scanRan{};
167};
168}
Definition GUIApplicationPlugin.hpp:39
Definition score-plugin-vst3/Vst3/ApplicationPlugin.hpp:131
Used to access all the application-wide state and structures.
Definition ApplicationContext.hpp:25
Definition score-plugin-vst3/Vst3/ApplicationPlugin.hpp:32
Definition score-plugin-vst3/Vst3/ApplicationPlugin.hpp:51
Definition score-plugin-vst3/Vst3/ApplicationPlugin.hpp:47