Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2021 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 :
23 : #include "vstinstancesregister.h"
24 :
25 : #include "global/containers.h"
26 :
27 : #include "vstplugininstance.h"
28 :
29 : #include "log.h"
30 :
31 : using namespace muse::vst;
32 : using namespace muse::audio;
33 :
34 0 : IVstPluginInstancePtr VstInstancesRegister::makeAndRegisterInstrPlugin(const AudioResourceId& resourceId,
35 : const muse::audio::TrackId trackId)
36 : {
37 0 : std::shared_ptr<VstPluginInstance> instance = std::make_shared<VstPluginInstance>(resourceId);
38 :
39 0 : registerInstrPlugin(trackId, instance);
40 :
41 0 : instance->load();
42 :
43 0 : return instance;
44 0 : }
45 :
46 0 : IVstPluginInstancePtr VstInstancesRegister::makeAndRegisterFxPlugin(const muse::audio::AudioResourceId& resourceId,
47 : const muse::audio::TrackId trackId,
48 : const muse::audio::AudioFxChainOrder chainOrder)
49 : {
50 0 : std::shared_ptr<VstPluginInstance> instance = std::make_shared<VstPluginInstance>(resourceId);
51 :
52 0 : registerFxPlugin(trackId, chainOrder, instance);
53 :
54 0 : instance->load();
55 :
56 0 : return instance;
57 0 : }
58 :
59 0 : IVstPluginInstancePtr VstInstancesRegister::makeAndRegisterMasterFxPlugin(const muse::audio::AudioResourceId& resourceId,
60 : const muse::audio::AudioFxChainOrder chainOrder)
61 : {
62 0 : std::shared_ptr<VstPluginInstance> instance = std::make_shared<VstPluginInstance>(resourceId);
63 :
64 0 : registerMasterFxPlugin(chainOrder, instance);
65 :
66 0 : instance->load();
67 :
68 0 : return instance;
69 0 : }
70 :
71 0 : void VstInstancesRegister::registerInstrPlugin(const muse::audio::TrackId trackId, IVstPluginInstancePtr instance)
72 : {
73 0 : IF_ASSERT_FAILED(instance) {
74 0 : return;
75 : }
76 :
77 0 : std::lock_guard lock(m_mutex);
78 :
79 0 : m_instances.insert_or_assign({ Type::Instrument, instance->resourceId(), trackId, 0 }, instance);
80 0 : }
81 :
82 0 : void VstInstancesRegister::registerFxPlugin(const muse::audio::TrackId trackId,
83 : const AudioFxChainOrder chainOrder,
84 : IVstPluginInstancePtr instance)
85 : {
86 0 : IF_ASSERT_FAILED(instance) {
87 0 : return;
88 : }
89 :
90 0 : std::lock_guard lock(m_mutex);
91 :
92 0 : m_instances.insert_or_assign({ Type::Effect, instance->resourceId(), trackId, chainOrder }, instance);
93 0 : }
94 :
95 0 : void VstInstancesRegister::registerMasterFxPlugin(const AudioFxChainOrder chainOrder, IVstPluginInstancePtr instance)
96 : {
97 0 : registerFxPlugin(-1, chainOrder, instance);
98 0 : }
99 :
100 0 : IVstPluginInstancePtr VstInstancesRegister::instanceById(const VstPluginInstanceId id) const
101 : {
102 0 : std::lock_guard lock(m_mutex);
103 0 : for (const auto& p : m_instances) {
104 0 : if (p.second->id() == id) {
105 0 : return p.second;
106 : }
107 : }
108 0 : return nullptr;
109 0 : }
110 :
111 0 : IVstPluginInstancePtr VstInstancesRegister::instrumentPlugin(const muse::audio::AudioResourceId& resourceId,
112 : const muse::audio::TrackId trackId) const
113 : {
114 0 : std::lock_guard lock(m_mutex);
115 :
116 0 : auto it = m_instances.find({ Type::Instrument, resourceId, trackId, 0 });
117 0 : if (it != m_instances.end()) {
118 0 : return it->second;
119 : }
120 :
121 0 : LOGE() << "Unable to find instrument plugin, trackId: " << trackId
122 0 : << " , resourceId: " << resourceId;
123 :
124 0 : return nullptr;
125 0 : }
126 :
127 0 : IVstPluginInstancePtr VstInstancesRegister::fxPlugin(const muse::audio::AudioResourceId& resourceId,
128 : const muse::audio::TrackId trackId,
129 : const AudioFxChainOrder chainOrder) const
130 : {
131 0 : std::lock_guard lock(m_mutex);
132 :
133 0 : auto it = m_instances.find({ Type::Effect, resourceId, trackId, chainOrder });
134 0 : if (it != m_instances.end()) {
135 0 : return it->second;
136 : }
137 :
138 0 : LOGE() << "Unable to find fx plugin, trackId: " << trackId
139 0 : << ", resourceId: " << resourceId
140 0 : << ", chainOrder: " << chainOrder;
141 :
142 0 : return nullptr;
143 0 : }
144 :
145 0 : IVstPluginInstancePtr VstInstancesRegister::masterFxPlugin(const muse::audio::AudioResourceId& resourceId,
146 : const AudioFxChainOrder chainOrder) const
147 : {
148 0 : std::lock_guard lock(m_mutex);
149 :
150 0 : auto it = m_instances.find({ Type::Effect, resourceId, -1, chainOrder });
151 0 : if (it != m_instances.end()) {
152 0 : return it->second;
153 : }
154 :
155 0 : LOGE() << "Unable to find master fx plugin"
156 0 : << ", resourceId: " << resourceId
157 0 : << ", chainOrder: " << chainOrder;
158 :
159 0 : return nullptr;
160 0 : }
161 :
162 0 : void VstInstancesRegister::unregisterById(const VstPluginInstanceId id)
163 : {
164 0 : std::lock_guard lock(m_mutex);
165 :
166 0 : muse::remove_if(m_instances, [id](const auto& p) {
167 0 : return p.second->id() == id;
168 : });
169 0 : }
170 :
171 0 : void VstInstancesRegister::unregisterInstrPlugin(const muse::audio::AudioResourceId& resourceId, const muse::audio::TrackId trackId)
172 : {
173 0 : std::lock_guard lock(m_mutex);
174 :
175 0 : m_instances.erase({ Type::Instrument, resourceId, trackId, 0 });
176 0 : }
177 :
178 0 : void VstInstancesRegister::unregisterFxPlugin(const muse::audio::AudioResourceId& resourceId,
179 : const muse::audio::TrackId trackId,
180 : const AudioFxChainOrder chainOrder)
181 : {
182 0 : std::lock_guard lock(m_mutex);
183 :
184 0 : m_instances.erase({ Type::Effect, resourceId, trackId, chainOrder });
185 0 : }
186 :
187 0 : void VstInstancesRegister::unregisterMasterFxPlugin(const muse::audio::AudioResourceId& resourceId, const AudioFxChainOrder chainOrder)
188 : {
189 0 : unregisterFxPlugin(resourceId, -1, chainOrder);
190 0 : }
191 :
192 0 : void VstInstancesRegister::unregisterAllInstrPlugin()
193 : {
194 0 : std::lock_guard lock(m_mutex);
195 :
196 0 : muse::remove_if(m_instances, [](const auto& p) {
197 0 : return p.first.type == Type::Instrument;
198 : });
199 0 : }
200 :
201 0 : void VstInstancesRegister::unregisterAllFx()
202 : {
203 0 : std::lock_guard lock(m_mutex);
204 :
205 0 : muse::remove_if(m_instances, [](const auto& p) {
206 0 : return p.first.type == Type::Effect;
207 : });
208 0 : }
|