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) 2025 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 : #pragma once
23 :
24 : #include <cassert>
25 :
26 : #include "global/serialization/msgpack_forward.h"
27 : #include "audio/common/audiotypes.h"
28 :
29 : #include "log.h"
30 :
31 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioEngineConfig& value);
32 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioEngineConfig& value);
33 :
34 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::OutputSpec& value);
35 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::OutputSpec& value);
36 :
37 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::PlaybackStatus& value);
38 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::PlaybackStatus& value);
39 :
40 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioResourceType& value);
41 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioResourceType& value);
42 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioFxCategory& value);
43 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioFxCategory& value);
44 :
45 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioResourceMeta& value);
46 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioResourceMeta& value);
47 :
48 : // Params
49 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioSourceParams& value);
50 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioSourceParams& value);
51 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioFxParams& value);
52 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioFxParams& value);
53 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::AuxSendParams& value);
54 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AuxSendParams& value);
55 : template<typename T>
56 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::AutomatableValue<T>& value);
57 : template<typename T>
58 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AutomatableValue<T>& value);
59 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::ControlParams& value);
60 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::ControlParams& value);
61 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::TrackParams& value);
62 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::TrackParams& value);
63 :
64 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::SoundPreset& value);
65 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::SoundPreset& value);
66 :
67 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::SoundTrackType& value);
68 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::SoundTrackType& value);
69 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioSampleFormat& value);
70 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioSampleFormat& value);
71 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::SoundTrackFormat& value);
72 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::SoundTrackFormat& value);
73 :
74 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::SaveSoundTrackStage& value);
75 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::SaveSoundTrackStage& value);
76 :
77 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioSignalVal& value);
78 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioSignalVal& value);
79 :
80 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::AutomatedControlParams& value);
81 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AutomatedControlParams& value);
82 :
83 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::InputProcessingProgress::ChunkInfo& value);
84 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::InputProcessingProgress::ChunkInfo& value);
85 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::InputProcessingProgress::ProgressInfo& value);
86 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::InputProcessingProgress::ProgressInfo& value);
87 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::InputProcessingProgress::StatusInfo& value);
88 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::InputProcessingProgress::StatusInfo& value);
89 :
90 : void pack_custom(muse::msgpack::Packer& p, const muse::audio::TransportEvent& value);
91 : void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::TransportEvent& value);
92 :
93 : // MPE
94 : // PlaybackEvent
95 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ArrangementContext& value);
96 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ArrangementContext& value);
97 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::PitchContext& value);
98 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::PitchContext& value);
99 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ArrangementPattern& value);
100 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ArrangementPattern& value);
101 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::PitchPattern& value);
102 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::PitchPattern& value);
103 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ExpressionPattern& value);
104 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ExpressionPattern& value);
105 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ArticulationPatternSegment& value);
106 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ArticulationPatternSegment& value);
107 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ArticulationType& value);
108 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ArticulationType& value);
109 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ArticulationMeta& value);
110 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ArticulationMeta& value);
111 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ArticulationAppliedData& value);
112 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ArticulationAppliedData& value);
113 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ExpressionContext& value);
114 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ExpressionContext& value);
115 :
116 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::NoteEvent& value);
117 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::NoteEvent& value);
118 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::TextArticulationEvent& value);
119 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::TextArticulationEvent& value);
120 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::SoundPresetChangeEvent& value);
121 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::SoundPresetChangeEvent& value);
122 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::SyllableEvent& value);
123 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::SyllableEvent& value);
124 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ControllerChangeEvent& value);
125 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ControllerChangeEvent& value);
126 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::PlaybackEvent& value);
127 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::PlaybackEvent& value);
128 :
129 : // AutomationPoint
130 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::AutomationPoint::Ease& value);
131 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::AutomationPoint::Ease& value);
132 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::AutomationPoint::ArrivalFromPrevious& value);
133 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::AutomationPoint::ArrivalFromPrevious& value);
134 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::AutomationPoint::ExplicitArrival& value);
135 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::AutomationPoint::ExplicitArrival& value);
136 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::AutomationPoint::InValue& value);
137 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::AutomationPoint::InValue& value);
138 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::AutomationPoint& value);
139 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::AutomationPoint& value);
140 :
141 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::SoundCategory& value);
142 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::SoundCategory& value);
143 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::PlaybackSetupData& value);
144 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::PlaybackSetupData& value);
145 : void pack_custom(muse::msgpack::Packer& p, const muse::mpe::PlaybackData& value);
146 : void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::PlaybackData& value);
147 :
148 : #include "global/serialization/msgpack.h"
149 :
150 0 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioEngineConfig& value)
151 : {
152 0 : p.process(value.autoProcessOnlineSoundsInBackground, value.isLazyProcessingOfOnlineSoundsEnabled,
153 0 : value.useSoundFontLowPassFilter);
154 0 : }
155 :
156 0 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioEngineConfig& value)
157 : {
158 0 : p.process(value.autoProcessOnlineSoundsInBackground, value.isLazyProcessingOfOnlineSoundsEnabled,
159 0 : value.useSoundFontLowPassFilter);
160 0 : }
161 :
162 38 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::OutputSpec& value)
163 : {
164 38 : p.process(value.sampleRate, value.samplesPerChannel, value.audioChannelCount);
165 38 : }
166 :
167 9 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::OutputSpec& value)
168 : {
169 9 : p.process(value.sampleRate, value.samplesPerChannel, value.audioChannelCount);
170 9 : }
171 :
172 3 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::PlaybackStatus& value)
173 : {
174 3 : p.process(static_cast<int8_t>(value));
175 3 : }
176 :
177 2 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::PlaybackStatus& value)
178 : {
179 2 : int8_t val = 0;
180 2 : p.process(val);
181 2 : value = static_cast<muse::audio::PlaybackStatus>(val);
182 2 : }
183 :
184 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioResourceType& value)
185 : {
186 : p.process(static_cast<int8_t>(value));
187 : }
188 :
189 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioResourceType& value)
190 : {
191 : int type = 0;
192 : p.process(type);
193 : value = static_cast<muse::audio::AudioResourceType>(type);
194 : }
195 :
196 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioFxCategory& value)
197 : {
198 1 : p.process(static_cast<int>(value));
199 1 : }
200 :
201 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioFxCategory& value)
202 : {
203 1 : int cat = 0;
204 1 : p.process(cat);
205 1 : value = static_cast<muse::audio::AudioFxCategory>(cat);
206 1 : }
207 :
208 1004 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioResourceMeta& value)
209 : {
210 1004 : p.process(value.id, value.type, value.vendor, value.attributes);
211 1004 : }
212 :
213 4 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioResourceMeta& value)
214 : {
215 4 : p.process(value.id, value.type, value.vendor, value.attributes);
216 4 : }
217 :
218 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioFxParams& value)
219 : {
220 1 : p.process(value.categories, value.chainOrder, value.resourceMeta, value.configuration, value.active);
221 1 : }
222 :
223 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioFxParams& value)
224 : {
225 1 : p.process(value.categories, value.chainOrder, value.resourceMeta, value.configuration, value.active);
226 1 : }
227 :
228 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::AuxSendParams& value)
229 : {
230 1 : p.process(value.signalAmount, value.active);
231 1 : }
232 :
233 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AuxSendParams& value)
234 : {
235 1 : p.process(value.signalAmount, value.active);
236 1 : }
237 :
238 : template<typename T>
239 6 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::AutomatableValue<T>& value)
240 : {
241 6 : p.process(value.hasAutomation());
242 :
243 6 : if (value.hasAutomation()) {
244 2 : p.process(std::get<muse::audio::AutomationEnvelope>(value.value()));
245 : } else {
246 4 : p.process(std::get<T>(value.value()));
247 : }
248 6 : }
249 :
250 : template<typename T>
251 6 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AutomatableValue<T>& value)
252 : {
253 6 : bool hasAutomation = false;
254 6 : p.process(hasAutomation);
255 :
256 6 : if (hasAutomation) {
257 2 : muse::audio::AutomationEnvelope envelope;
258 2 : p.process(envelope);
259 2 : value = muse::audio::AutomatableValue<T>(envelope);
260 2 : } else {
261 4 : T staticValue{};
262 4 : p.process(staticValue);
263 4 : value = muse::audio::AutomatableValue<T>(staticValue);
264 : }
265 6 : }
266 :
267 3 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::ControlParams& value)
268 : {
269 3 : p.process(value.volume, value.balance, value.muted);
270 3 : }
271 :
272 3 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::ControlParams& value)
273 : {
274 3 : p.process(value.volume, value.balance, value.muted);
275 3 : }
276 :
277 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::TrackParams& value)
278 : {
279 1 : p.process(value.source, value.fxChain, value.auxSends, value.control);
280 1 : }
281 :
282 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::TrackParams& value)
283 : {
284 1 : p.process(value.source, value.fxChain, value.auxSends, value.control);
285 1 : }
286 :
287 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::SoundPreset& value)
288 : {
289 1 : p.process(value.code, value.name, value.isDefault, value.attributes);
290 1 : }
291 :
292 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::SoundPreset& value)
293 : {
294 1 : p.process(value.code, value.name, value.isDefault, value.attributes);
295 1 : }
296 :
297 2 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioSourceParams& value)
298 : {
299 2 : p.process(value.resourceMeta, value.configuration);
300 2 : }
301 :
302 2 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioSourceParams& value)
303 : {
304 2 : p.process(value.resourceMeta, value.configuration);
305 2 : }
306 :
307 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::SoundTrackType& value)
308 : {
309 1 : p.process(static_cast<int>(value));
310 1 : }
311 :
312 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::SoundTrackType& value)
313 : {
314 1 : int type = 0;
315 1 : p.process(type);
316 1 : value = static_cast<muse::audio::SoundTrackType>(type);
317 1 : }
318 :
319 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioSampleFormat& value)
320 : {
321 1 : p.process(static_cast<int>(value));
322 1 : }
323 :
324 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioSampleFormat& value)
325 : {
326 1 : int format = 0;
327 1 : p.process(format);
328 1 : value = static_cast<muse::audio::AudioSampleFormat>(format);
329 1 : }
330 :
331 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::SoundTrackFormat& value)
332 : {
333 1 : p.process(value.type, value.outputSpec, value.sampleFormat, value.bitRate,
334 1 : value.leadingSilenceDuration, value.trailingSilenceDuration);
335 1 : }
336 :
337 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::SoundTrackFormat& value)
338 : {
339 1 : p.process(value.type, value.outputSpec, value.sampleFormat, value.bitRate,
340 1 : value.leadingSilenceDuration, value.trailingSilenceDuration);
341 1 : }
342 :
343 0 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::SaveSoundTrackStage& value)
344 : {
345 0 : p.process(static_cast<int>(value));
346 0 : }
347 :
348 0 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::SaveSoundTrackStage& value)
349 : {
350 0 : int stage = 0;
351 0 : p.process(stage);
352 0 : value = static_cast<muse::audio::SaveSoundTrackStage>(stage);
353 0 : }
354 :
355 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::AudioSignalVal& value)
356 : {
357 1 : p.process(value.pressure);
358 1 : }
359 :
360 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AudioSignalVal& value)
361 : {
362 1 : p.process(value.pressure);
363 1 : }
364 :
365 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::AutomatedControlParams& value)
366 : {
367 1 : p.process(value.volume, value.balance);
368 1 : }
369 :
370 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::AutomatedControlParams& value)
371 : {
372 1 : p.process(value.volume, value.balance);
373 1 : }
374 :
375 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::InputProcessingProgress::ChunkInfo& value)
376 : {
377 1 : p.process(value.start, value.end);
378 1 : }
379 :
380 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::InputProcessingProgress::ChunkInfo& value)
381 : {
382 1 : p.process(value.start, value.end);
383 1 : }
384 :
385 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::InputProcessingProgress::ProgressInfo& value)
386 : {
387 1 : p.process(value.current, value.total);
388 1 : }
389 :
390 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::InputProcessingProgress::ProgressInfo& value)
391 : {
392 1 : p.process(value.current, value.total);
393 1 : }
394 :
395 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::InputProcessingProgress::StatusInfo& value)
396 : {
397 1 : p.process(static_cast<uint8_t>(value.status), value.errorCode, value.errorText, value.data);
398 1 : }
399 :
400 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::InputProcessingProgress::StatusInfo& value)
401 : {
402 1 : uint8_t status = 0;
403 1 : p.process(status, value.errorCode, value.errorText, value.data);
404 1 : value.status = static_cast<muse::audio::InputProcessingProgress::Status>(status);
405 1 : }
406 :
407 0 : inline void pack_custom(muse::msgpack::Packer& p, const muse::audio::TransportEvent& value)
408 : {
409 0 : p.process(static_cast<uint8_t>(value.type));
410 :
411 0 : if (value.type == muse::audio::TransportEvent::Type::Seek) {
412 0 : const auto& seek = std::get<muse::audio::TransportEvent::SeekData>(value.data);
413 0 : p.process(seek.position);
414 : }
415 0 : }
416 :
417 0 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::audio::TransportEvent& value)
418 : {
419 0 : uint8_t type = 0;
420 0 : p.process(type);
421 0 : value.type = static_cast<muse::audio::TransportEvent::Type>(type);
422 :
423 0 : if (value.type == muse::audio::TransportEvent::Type::Seek) {
424 0 : muse::audio::TransportEvent::SeekData seek;
425 0 : p.process(seek.position);
426 0 : value.data = seek;
427 : }
428 0 : }
429 :
430 : // MPE
431 2 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ArrangementContext& value)
432 : {
433 2 : p.process(value.nominalTimestamp, value.actualTimestamp, value.nominalDuration, value.actualDuration,
434 2 : value.voiceLayerIndex, value.staffLayerIndex, value.bps);
435 2 : }
436 :
437 2 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ArrangementContext& value)
438 : {
439 2 : p.process(value.nominalTimestamp, value.actualTimestamp, value.nominalDuration, value.actualDuration,
440 2 : value.voiceLayerIndex, value.staffLayerIndex, value.bps);
441 2 : }
442 :
443 2 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::PitchContext& value)
444 : {
445 2 : p.process(value.nominalPitchLevel, value.pitchCurve);
446 2 : }
447 :
448 2 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::PitchContext& value)
449 : {
450 2 : p.process(value.nominalPitchLevel, value.pitchCurve);
451 2 : }
452 :
453 9 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ArrangementPattern& value)
454 : {
455 9 : p.process(value.durationFactor, value.timestampOffset);
456 9 : }
457 :
458 9 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ArrangementPattern& value)
459 : {
460 9 : p.process(value.durationFactor, value.timestampOffset);
461 9 : }
462 :
463 9 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::PitchPattern& value)
464 : {
465 9 : p.process(value.pitchOffsetMap);
466 9 : }
467 :
468 9 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::PitchPattern& value)
469 : {
470 9 : p.process(value.pitchOffsetMap);
471 9 : }
472 :
473 9 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ExpressionPattern& value)
474 : {
475 9 : p.process(value.dynamicOffsetMap);
476 9 : }
477 :
478 9 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ExpressionPattern& value)
479 : {
480 9 : p.process(value.dynamicOffsetMap);
481 9 : }
482 :
483 8 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ArticulationPatternSegment& value)
484 : {
485 8 : p.process(value.arrangementPattern, value.pitchPattern, value.expressionPattern);
486 8 : }
487 :
488 8 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ArticulationPatternSegment& value)
489 : {
490 8 : p.process(value.arrangementPattern, value.pitchPattern, value.expressionPattern);
491 8 : }
492 :
493 6 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ArticulationType& value)
494 : {
495 6 : p.process(static_cast<int8_t>(value));
496 6 : }
497 :
498 6 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ArticulationType& value)
499 : {
500 6 : int8_t type = 0;
501 6 : p.process(type);
502 6 : value = static_cast<muse::mpe::ArticulationType>(type);
503 6 : }
504 :
505 4 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ArticulationMeta& value)
506 : {
507 4 : p.process(value.type, value.pattern, value.timestamp, value.overallDuration,
508 4 : value.overallPitchChangesRange, value.overallDynamicChangesRange);
509 4 : }
510 :
511 4 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ArticulationMeta& value)
512 : {
513 4 : p.process(value.type, value.pattern, value.timestamp, value.overallDuration,
514 4 : value.overallPitchChangesRange, value.overallDynamicChangesRange);
515 4 : }
516 :
517 3 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ArticulationAppliedData& value)
518 : {
519 3 : p.process(value.meta, value.appliedPatternSegment, value.occupiedFrom, value.occupiedTo,
520 3 : value.occupiedPitchChangesRange, value.occupiedDynamicChangesRange);
521 3 : }
522 :
523 3 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ArticulationAppliedData& value)
524 : {
525 3 : p.process(value.meta, value.appliedPatternSegment, value.occupiedFrom, value.occupiedTo,
526 3 : value.occupiedPitchChangesRange, value.occupiedDynamicChangesRange);
527 3 : }
528 :
529 2 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ExpressionContext& value)
530 : {
531 2 : p.process(value.articulations, value.nominalDynamicLevel, value.expressionCurve, value.velocityOverride);
532 2 : }
533 :
534 2 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ExpressionContext& value)
535 : {
536 2 : p.process(value.articulations, value.nominalDynamicLevel, value.expressionCurve, value.velocityOverride);
537 2 : }
538 :
539 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::NoteEvent& value)
540 : {
541 1 : p.process(value.arrangementCtx(), value.pitchCtx(), value.expressionCtx());
542 1 : }
543 :
544 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::NoteEvent& value)
545 : {
546 1 : muse::mpe::ArrangementContext arrCtx;
547 1 : muse::mpe::PitchContext pitchCtx;
548 1 : muse::mpe::ExpressionContext exprCtx;
549 1 : p.process(arrCtx, pitchCtx, exprCtx);
550 1 : value = muse::mpe::NoteEvent(std::move(arrCtx), std::move(pitchCtx), std::move(exprCtx));
551 1 : }
552 :
553 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::TextArticulationEvent& value)
554 : {
555 1 : p.process(value.text, value.layerIdx, value.flags);
556 1 : }
557 :
558 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::TextArticulationEvent& value)
559 : {
560 1 : p.process(value.text, value.layerIdx, value.flags);
561 1 : }
562 :
563 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::SoundPresetChangeEvent& value)
564 : {
565 1 : p.process(value.code, value.layerIdx);
566 1 : }
567 :
568 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::SoundPresetChangeEvent& value)
569 : {
570 1 : p.process(value.code, value.layerIdx);
571 1 : }
572 :
573 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::SyllableEvent& value)
574 : {
575 1 : p.process(value.text, value.layerIdx, value.flags);
576 1 : }
577 :
578 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::SyllableEvent& value)
579 : {
580 1 : p.process(value.text, value.layerIdx, value.flags);
581 1 : }
582 :
583 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::ControllerChangeEvent& value)
584 : {
585 1 : p.process(static_cast<int8_t>(value.type), value.val, value.layerIdx);
586 1 : }
587 :
588 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::ControllerChangeEvent& value)
589 : {
590 1 : int8_t type = 0;
591 1 : p.process(type, value.val, value.layerIdx);
592 1 : value.type = static_cast<muse::mpe::ControllerChangeEvent::Type>(type);
593 1 : }
594 :
595 5 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::PlaybackEvent& value)
596 : {
597 5 : uint8_t idx = static_cast<uint8_t>(value.index());
598 5 : p.process(idx);
599 :
600 5 : switch (idx) {
601 0 : case 0:
602 : // no data
603 0 : break;
604 1 : case 1: {
605 1 : const muse::mpe::NoteEvent& event = std::get<muse::mpe::NoteEvent>(value);
606 1 : p.process(event);
607 1 : } break;
608 1 : case 2: {
609 1 : const muse::mpe::TextArticulationEvent& event = std::get<muse::mpe::TextArticulationEvent>(value);
610 1 : p.process(event);
611 1 : } break;
612 1 : case 3: {
613 1 : const muse::mpe::SoundPresetChangeEvent& event = std::get<muse::mpe::SoundPresetChangeEvent>(value);
614 1 : p.process(event);
615 1 : } break;
616 1 : case 4: {
617 1 : const muse::mpe::SyllableEvent& event = std::get<muse::mpe::SyllableEvent>(value);
618 1 : p.process(event);
619 1 : } break;
620 1 : case 5: {
621 1 : const muse::mpe::ControllerChangeEvent& event = std::get<muse::mpe::ControllerChangeEvent>(value);
622 1 : p.process(event);
623 1 : } break;
624 0 : default: {
625 0 : assert(false && "unknown PlaybackEvent variant index");
626 : }
627 : }
628 5 : }
629 :
630 5 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::PlaybackEvent& value)
631 : {
632 5 : uint8_t idx = 0;
633 5 : p.process(idx);
634 :
635 5 : switch (idx) {
636 0 : case 0:
637 : // no data
638 0 : break;
639 1 : case 1: {
640 1 : muse::mpe::NoteEvent event;
641 1 : p.process(event);
642 1 : value = event;
643 1 : } break;
644 1 : case 2: {
645 1 : muse::mpe::TextArticulationEvent event;
646 1 : p.process(event);
647 1 : value = event;
648 1 : } break;
649 1 : case 3: {
650 1 : muse::mpe::SoundPresetChangeEvent event;
651 1 : p.process(event);
652 1 : value = event;
653 1 : } break;
654 1 : case 4: {
655 1 : muse::mpe::SyllableEvent event;
656 1 : p.process(event);
657 1 : value = event;
658 1 : } break;
659 1 : case 5: {
660 1 : muse::mpe::ControllerChangeEvent event;
661 1 : p.process(event);
662 1 : value = event;
663 1 : } break;
664 0 : default: {
665 0 : assert(false && "unknown PlaybackEvent variant index");
666 : p.cursor().error = true;
667 : }
668 : }
669 5 : }
670 :
671 2 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::AutomationPoint::Ease& value)
672 : {
673 2 : p.process(value.t, value.value);
674 2 : }
675 :
676 2 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::AutomationPoint::Ease& value)
677 : {
678 2 : p.process(value.t, value.value);
679 2 : }
680 :
681 2 : inline void pack_custom(muse::msgpack::Packer&, const muse::mpe::AutomationPoint::ArrivalFromPrevious&)
682 : {
683 : // no data
684 2 : }
685 :
686 2 : inline void unpack_custom(muse::msgpack::UnPacker&, muse::mpe::AutomationPoint::ArrivalFromPrevious&)
687 : {
688 : // no data
689 2 : }
690 :
691 2 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::AutomationPoint::ExplicitArrival& value)
692 : {
693 2 : p.process(value.value, value.ease);
694 2 : }
695 :
696 2 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::AutomationPoint::ExplicitArrival& value)
697 : {
698 2 : p.process(value.value, value.ease);
699 2 : }
700 :
701 4 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::AutomationPoint::InValue& value)
702 : {
703 4 : uint8_t idx = static_cast<uint8_t>(value.index());
704 4 : p.process(idx);
705 :
706 4 : switch (idx) {
707 2 : case 0: {
708 2 : const muse::mpe::AutomationPoint::ArrivalFromPrevious& arrival = std::get<muse::mpe::AutomationPoint::ArrivalFromPrevious>(value);
709 2 : p.process(arrival);
710 2 : } break;
711 2 : case 1: {
712 2 : const muse::mpe::AutomationPoint::ExplicitArrival& arrival = std::get<muse::mpe::AutomationPoint::ExplicitArrival>(value);
713 2 : p.process(arrival);
714 2 : } break;
715 0 : default: {
716 0 : assert(false && "unknown AutomationPoint::InValue variant index");
717 : }
718 : }
719 4 : }
720 :
721 4 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::AutomationPoint::InValue& value)
722 : {
723 4 : uint8_t idx = 0;
724 4 : p.process(idx);
725 :
726 4 : switch (idx) {
727 2 : case 0: {
728 : muse::mpe::AutomationPoint::ArrivalFromPrevious arrival;
729 2 : p.process(arrival);
730 2 : value = arrival;
731 2 : } break;
732 2 : case 1: {
733 2 : muse::mpe::AutomationPoint::ExplicitArrival arrival;
734 2 : p.process(arrival);
735 2 : value = arrival;
736 2 : } break;
737 0 : default: {
738 0 : assert(false && "unknown AutomationPoint::InValue variant index");
739 : p.cursor().error = true;
740 : }
741 : }
742 4 : }
743 :
744 4 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::AutomationPoint& value)
745 : {
746 4 : p.process(value.inValue, value.outValue);
747 4 : }
748 :
749 4 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::AutomationPoint& value)
750 : {
751 4 : p.process(value.inValue, value.outValue);
752 4 : }
753 :
754 2 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::SoundCategory& value)
755 : {
756 2 : p.process(static_cast<int8_t>(value));
757 2 : }
758 :
759 2 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::SoundCategory& value)
760 : {
761 2 : int8_t type = 0;
762 2 : p.process(type);
763 2 : value = static_cast<muse::mpe::SoundCategory>(type);
764 2 : }
765 :
766 2 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::PlaybackSetupData& value)
767 : {
768 2 : p.process(value.id, value.category, value.subCategories,
769 2 : value.supportsSingleNoteDynamics, value.musicXmlSoundId, value.scoreId);
770 2 : }
771 :
772 2 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::PlaybackSetupData& value)
773 : {
774 2 : p.process(value.id, value.category, value.subCategories,
775 2 : value.supportsSingleNoteDynamics, value.musicXmlSoundId, value.scoreId);
776 2 : }
777 :
778 1 : inline void pack_custom(muse::msgpack::Packer& p, const muse::mpe::PlaybackData& value)
779 : {
780 1 : p.process(value.originEvents, value.setupData, value.dynamics);
781 1 : }
782 :
783 1 : inline void unpack_custom(muse::msgpack::UnPacker& p, muse::mpe::PlaybackData& value)
784 : {
785 1 : p.process(value.originEvents, value.setupData, value.dynamics);
786 1 : }
787 :
788 : namespace muse::audio::rpc {
789 : using Options = msgpack::Options;
790 : class RpcPacker
791 : {
792 : public:
793 : RpcPacker() = default;
794 :
795 : template<class ... Types>
796 122 : static ByteArray pack(const Options& opt, const Types&... args)
797 : {
798 : // clear but keep capacity
799 122 : buffer.clear();
800 : // makes sense if the reserve is greater than the current capacity
801 122 : buffer.reserve(std::max(opt.rezerveSize, DEFAULT_CAPACITY));
802 122 : msgpack::pack(buffer, args ...);
803 :
804 122 : IF_ASSERT_FAILED(buffer.size() > 0) {
805 0 : return ByteArray();
806 : }
807 :
808 122 : return ByteArray(&buffer[0], buffer.size());
809 : }
810 :
811 : template<class ... Types>
812 121 : static ByteArray pack(const Types&... args)
813 : {
814 121 : return RpcPacker::pack(Options {}, args ...);
815 : }
816 :
817 : template<class ... Types>
818 65 : static bool unpack(const ByteArray& data, Types&... args)
819 : {
820 65 : return msgpack::unpack(data, args ...);
821 : }
822 :
823 : static constexpr size_t DEFAULT_CAPACITY = 1024 * 200;
824 : static inline thread_local std::vector<uint8_t> buffer = {};
825 : };
826 : }
|