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/ivstmessage.h>
15
16#include <memory>
17#include <stdexcept>
18#include <verdigris>
19
20class QTimer;
21class QJsonObject;
22namespace Media
23{
24class PluginScanner;
25}
26
27namespace vst3
28{
30{
31 QString path;
32 QString name;
33 QString url;
34 std::vector<VST3::Hosting::ClassInfo> classInfo;
35
36 bool isValid{};
37};
38
41SCORE_PLUGIN_VST3_EXPORT
42AvailablePlugin parseVst3Reply(const QString& path, const QJsonObject& obj);
43
44struct HostApp final : public Steinberg::Vst::IHostApplication
45{
46 Steinberg::Vst::PlugInterfaceSupport m_support;
47 HostApp() { }
48 virtual ~HostApp() { }
49 Steinberg::tresult PLUGIN_API getName(Steinberg::Vst::String128 name) override
50 {
51 Steinberg::String str("ossia score");
52 str.copyTo16(name, 0, 127);
53 return Steinberg::kResultTrue;
54 }
55
56 Steinberg::tresult
57 PLUGIN_API createInstance(Steinberg::TUID cid, Steinberg::TUID _iid, void** obj) override
58 {
59 using namespace Steinberg;
60 using namespace Steinberg::Vst;
61 FUID classID(FUID::fromTUID(cid));
62 FUID interfaceID(FUID::fromTUID(_iid));
63 if(classID == Vst::IMessage::iid && interfaceID == Vst::IMessage::iid)
64 {
65 *obj = new HostMessage;
66 return kResultTrue;
67 }
68 else if(
69 classID == Vst::IAttributeList::iid && interfaceID == Vst::IAttributeList::iid)
70 {
71 *obj = Vst::HostAttributeList::make();
72 return kResultTrue;
73 }
74 *obj = nullptr;
75 return kResultFalse;
76 }
77
78 Steinberg::tresult PLUGIN_API queryInterface(const char* _iid, void** obj) override
79 {
80 using namespace Steinberg;
81 using namespace Steinberg::Vst;
82 QUERY_INTERFACE(_iid, obj, FUnknown::iid, IHostApplication)
83 QUERY_INTERFACE(_iid, obj, IHostApplication::iid, IHostApplication)
84
85 if(m_support.isPlugInterfaceSupported(_iid) == kResultTrue)
86 return kResultOk;
87
88 *obj = nullptr;
89 return kResultFalse;
90 }
91
92 Steinberg::uint32 PLUGIN_API addRef() override { return 1; }
93
94 Steinberg::uint32 PLUGIN_API release() override { return 1; }
95};
96
97class SCORE_PLUGIN_VST3_EXPORT ApplicationPlugin
98 : public QObject
100{
101 W_OBJECT(ApplicationPlugin)
102public:
105
106 void initialize() override;
107
108 VST3::Hosting::Module::Ptr getModule(const std::string& path);
109
110 void rescan();
111 void rescan(const QStringList& paths);
112 void vstChanged() E_SIGNAL(SCORE_PLUGIN_VST3_EXPORT, vstChanged);
113
114 std::pair<const AvailablePlugin*, const VST3::Hosting::ClassInfo*>
115 classInfo(const VST3::UID& uid) const noexcept;
116 QString pathForClass(const VST3::UID& uid) const noexcept;
117 std::optional<VST3::UID>
118 uidForPathAndClassName(const QString& path, const QString& cls) const noexcept;
119
120 HostApp m_host;
121 ossia::string_map<VST3::Hosting::Module::Ptr> modules;
122 std::vector<AvailablePlugin> vst_infos;
123
124private:
125 void onScanned(const QString& path, const QJsonObject& obj);
126 void onScanFailed(const QString& path, const QString& reason);
127 void removeEntriesForPath(const QString& path);
128 void persistCache();
129 void schedulePersist();
130
131#if QT_CONFIG(process)
132 std::unique_ptr<Media::PluginScanner> m_scanner;
133#endif
134 QTimer* m_persistTimer{};
135 bool m_scanRan{};
136};
137}
Definition GUIApplicationPlugin.hpp:31
Definition score-plugin-vst3/Vst3/ApplicationPlugin.hpp:100
Used to access all the application-wide state and structures.
Definition ApplicationContext.hpp:25
Definition score-plugin-vst3/Vst3/ApplicationPlugin.hpp:30
Definition score-plugin-vst3/Vst3/ApplicationPlugin.hpp:45