LCOV - code coverage report
Current view: top level - muse/framework/audio/common/rpc - rpcpacker.h Coverage Total Hit
Test: filtered_coverage.info Lines: 89.6 % 422 378
Test Date: 2026-11-05 04:07:02

            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              : }
        

Generated by: LCOV version 2.0-1