LCOV - code coverage report
Current view: top level - muse/framework/musesampler/internal - libhandler.h Coverage Total Hit
Test: filtered_coverage.info Lines: 0.0 % 271 0
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              : 
      23              : #pragma once
      24              : 
      25              : #include <memory>
      26              : #include <cstring>
      27              : #include <string>
      28              : #include <variant>
      29              : 
      30              : #include "dlib.h"
      31              : #include "apitypes.h"
      32              : 
      33              : #include "types/version.h"
      34              : 
      35              : namespace muse::musesampler {
      36              : struct MuseSamplerLibHandler
      37              : {
      38              : public:
      39            0 :     MuseSamplerLibHandler() = default;
      40              : 
      41            0 :     bool loadLib(const io::path_t& path)
      42              :     {
      43            0 :         m_lib = muse::loadLib(path);
      44            0 :         return m_lib != nullptr;
      45              :     }
      46              : 
      47            0 :     bool loadApi(const Version& minSupportedVersion, bool useLegacyAudition = false)
      48              :     {
      49            0 :         IF_ASSERT_FAILED(m_lib) {
      50            0 :             return false;
      51              :         }
      52              : 
      53            0 :         auto getVersionMajor = (ms_get_version_major)libFunc("ms_get_version_major");
      54            0 :         auto getVersionMinor = (ms_get_version_minor)libFunc("ms_get_version_minor");
      55            0 :         auto getVersionRevision = (ms_get_version_revision)libFunc("ms_get_version_revision");
      56            0 :         auto getBuildNumber = (ms_get_version_build_number)libFunc("ms_get_version_build_number");
      57              : 
      58              :         // Invalid...
      59            0 :         if (!getVersionMajor || !getVersionMinor || !getVersionRevision) {
      60            0 :             return false;
      61              :         }
      62              : 
      63            0 :         m_version = Version(getVersionMajor(), getVersionMinor(), getVersionRevision());
      64              : 
      65            0 :         if (getBuildNumber) {
      66            0 :             m_buildNumber = getBuildNumber();
      67              :         }
      68              : 
      69            0 :         if (m_version < minSupportedVersion) {
      70            0 :             LOGE() << "MuseSampler " << m_version.toString() << " is not supported (too old -- update MuseSampler); ignoring";
      71            0 :             return false;
      72              :         }
      73              : 
      74              :         // Major versions have incompatible changes; we can only support interfaces we know about
      75            0 :         constexpr int maximumMajorVersion = 0;
      76              : 
      77            0 :         if (m_version.major() > maximumMajorVersion) {
      78            0 :             LOGE() << "MuseSampler " << m_version.toString() << " is not supported (too new -- update MuseScore Studio); ignoring";
      79            0 :             return false;
      80              :         }
      81              : 
      82              :         // Check versions here; define optional functions below
      83            0 :         bool at_least_v_0_106 = (m_version.major() == 0 && m_version.minor() >= 106) || m_version.major() > 0;
      84              : 
      85            0 :         if (at_least_v_0_106) {
      86            0 :             if (auto initLibFunc = (ms_init_3)libFunc("ms_init_3")) {
      87            0 :                 initLib = [initLibFunc]() -> std::variant<ms_InitResult, ms_Result> { return initLibFunc(); };
      88              :             }
      89              :         } else {
      90            0 :             if (auto initLibFunc = (ms_init_2)libFunc("ms_init_2")) {
      91            0 :                 initLib = [initLibFunc]() -> std::variant<ms_InitResult, ms_Result> { return initLibFunc(); };
      92              :             }
      93              :         }
      94              : 
      95            0 :         deinitLib = (ms_deinit)libFunc("ms_deinit");
      96              : 
      97            0 :         getInstrumentList = (ms_get_instrument_list)libFunc("ms_get_instrument_list");
      98            0 :         getMatchingInstrumentList = (ms_get_matching_instrument_list)libFunc("ms_get_matching_instrument_list");
      99            0 :         getNextInstrument = (ms_InstrumentList_get_next)libFunc("ms_InstrumentList_get_next");
     100            0 :         getInstrumentId = (ms_Instrument_get_id)libFunc("ms_Instrument_get_id");
     101            0 :         getInstrumentName = (ms_Instrument_get_name)libFunc("ms_Instrument_get_name");
     102            0 :         getInstrumentCategory = (ms_Instrument_get_category)libFunc("ms_Instrument_get_category");
     103              : 
     104            0 :         getMusicXmlSoundId = (ms_Instrument_get_musicxml_sound)libFunc("ms_Instrument_get_musicxml_sound");
     105            0 :         getMpeSoundId = (ms_Instrument_get_mpe_sound)libFunc("ms_Instrument_get_mpe_sound");
     106              : 
     107            0 :         getPresetList = (ms_Instrument_get_preset_list)libFunc("ms_Instrument_get_preset_list");
     108            0 :         getNextPreset = (ms_PresetList_get_next)libFunc("ms_PresetList_get_next");
     109              : 
     110            0 :         create = (ms_MuseSampler_create)libFunc("ms_MuseSampler_create");
     111            0 :         destroy = (ms_MuseSampler_destroy)libFunc("ms_MuseSampler_destroy");
     112              : 
     113            0 :         if (useLegacyAudition) {
     114            0 :             LOGI() << "Use legacy audition (ms_MuseSampler_init)";
     115              : 
     116            0 :             auto initSamplerFunc = (ms_MuseSampler_init)libFunc("ms_MuseSampler_init");
     117            0 :             initSampler = [initSamplerFunc](ms_MuseSampler ms, double sample_rate, int block_size, int channel_count) {
     118            0 :                 return initSamplerFunc(ms, sample_rate, block_size, channel_count) == ms_Result_OK;
     119            0 :             };
     120              :         } else {
     121            0 :             auto initSamplerFunc = (ms_MuseSampler_init_2)libFunc("ms_MuseSampler_init_2");
     122            0 :             initSampler = [initSamplerFunc](ms_MuseSampler ms, double sample_rate, int block_size, int channel_count) {
     123            0 :                 return initSamplerFunc(ms, sample_rate, block_size, channel_count) == ms_Result_OK;
     124            0 :             };
     125              :         }
     126              : 
     127            0 :         addTrack = (ms_MuseSampler_add_track)libFunc("ms_MuseSampler_add_track");
     128            0 :         finalizeTrack = (ms_MuseSampler_finalize_track)libFunc("ms_MuseSampler_finalize_track");
     129            0 :         clearTrack = (ms_MuseSampler_clear_track)libFunc("ms_MuseSampler_clear_track");
     130              : 
     131            0 :         disableReverb = (ms_disable_reverb)libFunc("ms_disable_reverb");
     132            0 :         getReverbLevel = (ms_Instrument_get_reverb_level)libFunc("ms_Instrument_get_reverb_level");
     133              : 
     134            0 :         addDynamicsEvent = (ms_MuseSampler_add_track_dynamics_event_2)libFunc(
     135              :             "ms_MuseSampler_add_track_dynamics_event_2");
     136            0 :         addPedalEvent = (ms_MuseSampler_add_track_pedal_event_2)libFunc("ms_MuseSampler_add_track_pedal_event_2");
     137              : 
     138            0 :         auto addNoteEventFunc = (ms_MuseSampler_add_track_note_event_6)libFunc("ms_MuseSampler_add_track_note_event_6");
     139            0 :         addNoteEvent = [addNoteEventFunc](ms_MuseSampler ms, ms_Track track, const NoteEvent& ev, long long& event_id) {
     140            0 :             return addNoteEventFunc(ms, track, ev, event_id) == ms_Result_OK;
     141            0 :         };
     142              : 
     143            0 :         auto startAuditionNoteFunc = (ms_MuseSampler_start_audition_note_5)libFunc(
     144            0 :             "ms_MuseSampler_start_audition_note_5");
     145            0 :         startAuditionNote = [startAuditionNoteFunc](ms_MuseSampler ms, ms_Track track, ms_AuditionStartNoteEvent_5 ev) {
     146            0 :             return startAuditionNoteFunc(ms, track, ev) == ms_Result_OK;
     147            0 :         };
     148              : 
     149            0 :         isRangedArticulation = (ms_MuseSampler_is_ranged_articulation)libFunc("ms_MuseSampler_is_ranged_articulation");
     150              :         addTrackEventRangeStart
     151            0 :             = (ms_MuseSampler_add_track_event_range_start)libFunc("ms_MuseSampler_add_track_event_range_start");
     152              :         addTrackEventRangeEnd
     153            0 :             = (ms_MuseSampler_add_track_event_range_end)libFunc("ms_MuseSampler_add_track_event_range_end");
     154              : 
     155            0 :         stopAuditionNote = (ms_MuseSampler_stop_audition_note)libFunc("ms_MuseSampler_stop_audition_note");
     156              : 
     157            0 :         addSyllableEvent = (ms_MuseSampler_add_track_syllable_event_2)libFunc("ms_MuseSampler_add_track_syllable_event_2");
     158              : 
     159            0 :         getInstrumentVendorName = (ms_Instrument_get_vendor_name)libFunc("ms_Instrument_get_vendor_name");
     160            0 :         getInstrumentPackName = (ms_Instrument_get_pack_name)libFunc("ms_Instrument_get_pack_name");
     161            0 :         getInstrumentInfoJson = (ms_Instrument_get_info_json)libFunc("ms_Instrument_get_info_json");
     162            0 :         createPresetChange = (ms_MuseSampler_create_preset_change)libFunc("ms_MuseSampler_create_preset_change");
     163            0 :         addPreset = (ms_MuseSampler_add_preset)libFunc("ms_MuseSampler_add_preset");
     164            0 :         getTextArticulations = (ms_get_text_articulations)libFunc("ms_get_text_articulations");
     165            0 :         addTextArticulationEvent = (ms_MuseSampler_add_track_text_articulation_event)
     166            0 :                                    libFunc("ms_MuseSampler_add_track_text_articulation_event");
     167            0 :         getDrumMapping = (ms_get_drum_mapping)libFunc("ms_get_drum_mapping");
     168              : 
     169            0 :         addPitchBend = (ms_MuseSampler_add_pitch_bend)libFunc("ms_MuseSampler_add_pitch_bend");
     170            0 :         addVibrato = (ms_MuseSampler_add_vibrato)libFunc("ms_MuseSampler_add_vibrato");
     171              : 
     172            0 :         startOfflineMode = (ms_MuseSampler_start_offline_mode)libFunc("ms_MuseSampler_start_offline_mode");
     173            0 :         stopOfflineMode = (ms_MuseSampler_stop_offline_mode)libFunc("ms_MuseSampler_stop_offline_mode");
     174            0 :         processOffline = (ms_MuseSampler_process_offline)libFunc("ms_MuseSampler_process_offline");
     175              : 
     176            0 :         setPosition = (ms_MuseSampler_set_position)libFunc("ms_MuseSampler_set_position");
     177            0 :         setPlaying = (ms_MuseSampler_set_playing)libFunc("ms_MuseSampler_set_playing");
     178            0 :         process = (ms_MuseSampler_process)libFunc("ms_MuseSampler_process");
     179            0 :         allNotesOff = (ms_MuseSampler_all_notes_off)libFunc("ms_MuseSampler_all_notes_off");
     180              : 
     181            0 :         reloadAllInstruments = (ms_reload_all_instruments)libFunc("ms_reload_all_instruments");
     182            0 :         readyToPlay = (ms_MuseSampler_ready_to_play)libFunc("ms_MuseSampler_ready_to_play");
     183              : 
     184            0 :         setLoggingCallback = (ms_set_logging_callback)libFunc("ms_set_logging_callback");
     185            0 :         isOnlineInstrument = (ms_Instrument_is_online)libFunc("ms_Instrument_is_online");
     186            0 :         setScoreId = (ms_MuseSampler_set_score_id)libFunc("ms_MuseSampler_set_score_id");
     187            0 :         setAutoRenderInterval = (ms_MuseSampler_set_auto_render_interval)libFunc(
     188              :             "ms_MuseSampler_set_auto_render_interval");
     189            0 :         triggerRender = (ms_MuseSampler_trigger_render)libFunc("ms_MuseSampler_trigger_render");
     190            0 :         clearOnlineCache = (ms_MuseSampler_clear_online_cache)libFunc("ms_MuseSampler_clear_online_cache");
     191            0 :         addAuditionCCEvent = (ms_MuseSampler_add_audition_cc_event)libFunc("ms_MuseSampler_add_audition_cc_event");
     192              : 
     193            0 :         setRenderingStateChangedCallback = (ms_MuseSampler_set_rendering_state_changed_callback_2)libFunc(
     194              :             "ms_MuseSampler_set_rendering_state_changed_callback_2");
     195            0 :         getNextRenderProgressInfo = (ms_RenderProgressInfo2_get_next)libFunc("ms_RenderProgressInfo2_get_next");
     196            0 :         setLazyRender = (ms_MuseSampler_set_lazy_render)libFunc("ms_MuseSampler_set_lazy_render");
     197              : 
     198            0 :         if (!isValid()) {
     199            0 :             printApiStatus();
     200            0 :             return false;
     201              :         }
     202              : 
     203            0 :         return true;
     204              :     }
     205              : 
     206            0 :     bool init()
     207              :     {
     208            0 :         if (!initLib) {
     209            0 :             LOGE() << "Could not find ms_init";
     210            0 :             return false;
     211              :         }
     212              : 
     213            0 :         const std::variant<ms_InitResult, ms_Result> initResult = initLib();
     214            0 :         if (const ms_InitResult* result = std::get_if<ms_InitResult>(&initResult)) {
     215            0 :             if (*result != ms_InitResult_OK) {
     216            0 :                 LOGE() << "Could not init lib, error code: " << initResultToString(*result);
     217            0 :                 return false;
     218              :             }
     219            0 :         } else if (std::get<ms_Result>(initResult) != ms_Result_OK) {
     220            0 :             LOGE() << "Could not init lib";
     221            0 :             return false;
     222              :         }
     223              : 
     224            0 :         if (disableReverb) {
     225            0 :             if (disableReverb() != ms_Result_OK) {
     226            0 :                 LOGW() << "Could not disable reverb";
     227              :             }
     228              :         }
     229              : 
     230            0 :         return true;
     231              :     }
     232              : 
     233            0 :     void deinit()
     234              :     {
     235            0 :         IF_ASSERT_FAILED(m_lib) {
     236            0 :             return;
     237              :         }
     238              : 
     239            0 :         if (deinitLib) {
     240            0 :             if (deinitLib() != ms_Result_OK) {
     241            0 :                 LOGE() << "Could not deinit lib";
     242              :             }
     243              :         }
     244              : 
     245            0 :         muse::closeLib(m_lib);
     246            0 :         m_lib = nullptr;
     247              :     }
     248              : 
     249            0 :     bool isValid() const
     250              :     {
     251            0 :         return m_lib
     252            0 :                && initLib
     253            0 :                && deinitLib
     254            0 :                && disableReverb
     255            0 :                && getInstrumentList
     256            0 :                && getMatchingInstrumentList
     257            0 :                && getNextInstrument
     258            0 :                && getInstrumentId
     259            0 :                && getInstrumentName
     260            0 :                && getInstrumentCategory
     261            0 :                && getInstrumentPackName
     262            0 :                && getInstrumentVendorName
     263            0 :                && getInstrumentInfoJson
     264            0 :                && getMusicXmlSoundId
     265            0 :                && getMpeSoundId
     266            0 :                && getPresetList
     267            0 :                && getNextPreset
     268            0 :                && getReverbLevel
     269            0 :                && getTextArticulations
     270            0 :                && getDrumMapping
     271            0 :                && create
     272            0 :                && destroy
     273            0 :                && initSampler
     274            0 :                && addTrack
     275            0 :                && finalizeTrack
     276            0 :                && clearTrack
     277            0 :                && addDynamicsEvent
     278            0 :                && addPedalEvent
     279            0 :                && addNoteEvent
     280            0 :                && addSyllableEvent
     281            0 :                && addPitchBend
     282            0 :                && addVibrato
     283            0 :                && addTextArticulationEvent
     284            0 :                && addPreset
     285            0 :                && createPresetChange
     286            0 :                && setPosition
     287            0 :                && setPlaying
     288            0 :                && isRangedArticulation
     289            0 :                && addTrackEventRangeStart
     290            0 :                && addTrackEventRangeEnd
     291            0 :                && startAuditionNote
     292            0 :                && stopAuditionNote
     293            0 :                && startOfflineMode
     294            0 :                && stopOfflineMode
     295            0 :                && processOffline
     296            0 :                && process
     297            0 :                && allNotesOff
     298            0 :                && readyToPlay
     299            0 :                && setLoggingCallback
     300            0 :                && setRenderingStateChangedCallback
     301            0 :                && isOnlineInstrument
     302            0 :                && setScoreId
     303            0 :                && getNextRenderProgressInfo
     304            0 :                && setAutoRenderInterval
     305            0 :                && triggerRender
     306            0 :                && clearOnlineCache
     307            0 :                && addAuditionCCEvent
     308            0 :                && setLazyRender;
     309              :     }
     310              : 
     311            0 :     const Version& version() const
     312              :     {
     313            0 :         return m_version;
     314              :     }
     315              : 
     316            0 :     int buildNumber() const
     317              :     {
     318            0 :         return m_buildNumber;
     319              :     }
     320              : 
     321            0 :     void printApiStatus() const
     322              :     {
     323            0 :         LOGI() << "MuseSampler API status:"
     324            0 :                << "\n ms_init - " << static_cast<bool>(initLib)
     325            0 :                << "\n ms_deinit - " << reinterpret_cast<uint64_t>(deinitLib)
     326            0 :                << "\n ms_disable_reverb - " << reinterpret_cast<uint64_t>(disableReverb)
     327            0 :                << "\n ms_get_instrument_list - " << reinterpret_cast<uint64_t>(getInstrumentList)
     328            0 :                << "\n ms_get_matching_instrument_list - " << reinterpret_cast<uint64_t>(getMatchingInstrumentList)
     329            0 :                << "\n ms_get_drum_mapping - " << reinterpret_cast<uint64_t>(getDrumMapping)
     330            0 :                << "\n ms_InstrumentList_get_next - " << reinterpret_cast<uint64_t>(getNextInstrument)
     331            0 :                << "\n ms_Instrument_get_info_json - " << reinterpret_cast<uint64_t>(getInstrumentInfoJson)
     332            0 :                << "\n ms_Instrument_get_id - " << reinterpret_cast<uint64_t>(getInstrumentId)
     333            0 :                << "\n ms_Instrument_get_name - " << reinterpret_cast<uint64_t>(getInstrumentName)
     334            0 :                << "\n ms_Instrument_get_vendor_name - " << reinterpret_cast<uint64_t>(getInstrumentVendorName)
     335            0 :                << "\n ms_Instrument_get_category - " << reinterpret_cast<uint64_t>(getInstrumentCategory)
     336            0 :                << "\n ms_Instrument_get_pack_name - " << reinterpret_cast<uint64_t>(getInstrumentPackName)
     337            0 :                << "\n ms_Instrument_get_musicxml_sound - " << reinterpret_cast<uint64_t>(getMusicXmlSoundId)
     338            0 :                << "\n ms_Instrument_get_mpe_sound - " << reinterpret_cast<uint64_t>(getMpeSoundId)
     339            0 :                << "\n ms_Instrument_get_reverb_level - " << reinterpret_cast<uint64_t>(getReverbLevel)
     340            0 :                << "\n ms_Instrument_get_preset_list - " << reinterpret_cast<uint64_t>(getPresetList)
     341            0 :                << "\n ms_PresetList_get_next - " << reinterpret_cast<uint64_t>(getNextPreset)
     342            0 :                << "\n ms_MuseSampler_create_preset_change - " << reinterpret_cast<uint64_t>(createPresetChange)
     343            0 :                << "\n ms_MuseSampler_add_preset - " << reinterpret_cast<uint64_t>(addPreset)
     344            0 :                << "\n ms_get_text_articulations - " << reinterpret_cast<uint64_t>(getTextArticulations)
     345            0 :                << "\n ms_MuseSampler_add_track_text_articulation_event - " << reinterpret_cast<uint64_t>(addTextArticulationEvent)
     346            0 :                << "\n ms_MuseSampler_create - " << reinterpret_cast<uint64_t>(create)
     347            0 :                << "\n ms_MuseSampler_destroy - " << reinterpret_cast<uint64_t>(destroy)
     348            0 :                << "\n ms_MuseSampler_add_track - " << reinterpret_cast<uint64_t>(addTrack)
     349            0 :                << "\n ms_MuseSampler_clear_track - " << reinterpret_cast<uint64_t>(clearTrack)
     350            0 :                << "\n ms_MuseSampler_finalize_track - " << reinterpret_cast<uint64_t>(finalizeTrack)
     351            0 :                << "\n ms_MuseSampler_add_track_dynamics_event_2 - " << reinterpret_cast<uint64_t>(addDynamicsEvent)
     352            0 :                << "\n ms_MuseSampler_add_track_pedal_event_2 - " << reinterpret_cast<uint64_t>(addPedalEvent)
     353            0 :                << "\n ms_MuseSampler_add_pitch_bend - " << reinterpret_cast<uint64_t>(addPitchBend)
     354            0 :                << "\n ms_MuseSampler_stop_audition_note - " << reinterpret_cast<uint64_t>(stopAuditionNote)
     355            0 :                << "\n ms_MuseSampler_add_pitch_bend - " << reinterpret_cast<uint64_t>(addPitchBend)
     356            0 :                << "\n ms_MuseSampler_add_vibrato - " << reinterpret_cast<uint64_t>(addVibrato)
     357            0 :                << "\n ms_MuseSampler_is_ranged_articulation - " << reinterpret_cast<uint64_t>(isRangedArticulation)
     358            0 :                << "\n ms_MuseSampler_add_track_event_range_start - " << reinterpret_cast<uint64_t>(addTrackEventRangeStart)
     359            0 :                << "\n ms_MuseSampler_add_track_event_range_end - " << reinterpret_cast<uint64_t>(addTrackEventRangeEnd)
     360            0 :                << "\n ms_MuseSampler_add_audition_cc_event - " << reinterpret_cast<uint64_t>(addAuditionCCEvent)
     361            0 :                << "\n ms_MuseSampler_add_track_syllable_event_2 - " << reinterpret_cast<uint64_t>(addSyllableEvent)
     362            0 :                << "\n ms_MuseSampler_start_offline_mode - " << reinterpret_cast<uint64_t>(startOfflineMode)
     363            0 :                << "\n ms_MuseSampler_stop_offline_mode - " << reinterpret_cast<uint64_t>(stopOfflineMode)
     364            0 :                << "\n ms_MuseSampler_process_offline - " << reinterpret_cast<uint64_t>(processOffline)
     365            0 :                << "\n ms_MuseSampler_set_position - " << reinterpret_cast<uint64_t>(setPosition)
     366            0 :                << "\n ms_MuseSampler_set_playing - " << reinterpret_cast<uint64_t>(setPlaying)
     367            0 :                << "\n ms_MuseSampler_process - " << reinterpret_cast<uint64_t>(process)
     368            0 :                << "\n ms_MuseSampler_all_notes_off - " << reinterpret_cast<uint64_t>(allNotesOff)
     369            0 :                << "\n ms_MuseSampler_ready_to_play - " << reinterpret_cast<uint64_t>(readyToPlay)
     370            0 :                << "\n ms_Instrument_is_online - " << reinterpret_cast<uint64_t>(isOnlineInstrument)
     371            0 :                << "\n ms_MuseSampler_trigger_render - " << reinterpret_cast<uint64_t>(triggerRender)
     372            0 :                << "\n ms_reload_all_instruments - " << reinterpret_cast<uint64_t>(reloadAllInstruments)
     373            0 :                << "\n ms_set_logging_callback - " << reinterpret_cast<uint64_t>(setLoggingCallback)
     374            0 :                << "\n ms_MuseSampler_set_rendering_state_changed_callback_2 - " <<
     375            0 :             reinterpret_cast<uint64_t>(setRenderingStateChangedCallback)
     376            0 :                << "\n ms_MuseSampler_set_score_id - " << reinterpret_cast<uint64_t>(setScoreId)
     377            0 :                << "\n ms_MuseSampler_clear_online_cache - " << reinterpret_cast<uint64_t>(clearOnlineCache)
     378            0 :                << "\n ms_RenderProgressInfo2_get_next - " << reinterpret_cast<uint64_t>(getNextRenderProgressInfo)
     379            0 :                << "\n ms_MuseSampler_set_auto_render_interval - " << reinterpret_cast<uint64_t>(setAutoRenderInterval)
     380            0 :                << "\n ms_MuseSampler_set_lazy_render - " << reinterpret_cast<uint64_t>(setLazyRender);
     381            0 :     }
     382              : 
     383              :     ms_get_instrument_list getInstrumentList = nullptr;
     384              :     ms_get_matching_instrument_list getMatchingInstrumentList = nullptr;
     385              :     ms_InstrumentList_get_next getNextInstrument = nullptr;
     386              :     ms_Instrument_get_id getInstrumentId = nullptr;
     387              :     ms_Instrument_get_name getInstrumentName = nullptr;
     388              :     ms_Instrument_get_category getInstrumentCategory = nullptr;
     389              :     ms_Instrument_get_pack_name getInstrumentPackName = nullptr;
     390              :     ms_Instrument_get_info_json getInstrumentInfoJson = nullptr;
     391              :     ms_Instrument_get_vendor_name getInstrumentVendorName = nullptr;
     392              :     ms_Instrument_get_musicxml_sound getMusicXmlSoundId = nullptr;
     393              :     ms_Instrument_get_mpe_sound getMpeSoundId = nullptr;
     394              :     ms_Instrument_get_reverb_level getReverbLevel = nullptr;
     395              : 
     396              :     ms_Instrument_get_preset_list getPresetList = nullptr;
     397              :     ms_PresetList_get_next getNextPreset = nullptr;
     398              :     ms_MuseSampler_create_preset_change createPresetChange = nullptr;
     399              :     ms_MuseSampler_add_preset addPreset = nullptr;
     400              :     ms_get_text_articulations getTextArticulations = nullptr;
     401              :     ms_MuseSampler_add_track_text_articulation_event addTextArticulationEvent = nullptr;
     402              :     ms_get_drum_mapping getDrumMapping = nullptr;
     403              : 
     404              :     ms_MuseSampler_create create = nullptr;
     405              :     ms_MuseSampler_destroy destroy = nullptr;
     406              : 
     407              :     std::function<bool(ms_MuseSampler ms, double sample_rate, int block_size, int channel_count)> initSampler = nullptr;
     408              : 
     409              :     ms_MuseSampler_add_track addTrack = nullptr;
     410              :     ms_MuseSampler_finalize_track finalizeTrack = nullptr;
     411              :     ms_MuseSampler_clear_track clearTrack = nullptr;
     412              : 
     413              :     ms_MuseSampler_add_track_dynamics_event_2 addDynamicsEvent = nullptr;
     414              :     ms_MuseSampler_add_track_pedal_event_2 addPedalEvent = nullptr;
     415              :     std::function<bool(ms_MuseSampler ms, ms_Track track, const NoteEvent& ev, long long& event_id)> addNoteEvent = nullptr;
     416              : 
     417              :     ms_MuseSampler_is_ranged_articulation isRangedArticulation = nullptr;
     418              :     ms_MuseSampler_add_track_event_range_start addTrackEventRangeStart = nullptr;
     419              :     ms_MuseSampler_add_track_event_range_end addTrackEventRangeEnd = nullptr;
     420              : 
     421              :     ms_MuseSampler_add_pitch_bend addPitchBend = nullptr;
     422              :     ms_MuseSampler_add_vibrato addVibrato = nullptr;
     423              : 
     424              :     ms_MuseSampler_add_track_syllable_event_2 addSyllableEvent = nullptr;
     425              : 
     426              :     std::function<bool(ms_MuseSampler ms, ms_Track track, ms_AuditionStartNoteEvent_5)> startAuditionNote = nullptr;
     427              :     ms_MuseSampler_stop_audition_note stopAuditionNote = nullptr;
     428              :     ms_MuseSampler_add_audition_cc_event addAuditionCCEvent = nullptr;
     429              : 
     430              :     ms_MuseSampler_start_offline_mode startOfflineMode = nullptr;
     431              :     ms_MuseSampler_stop_offline_mode stopOfflineMode = nullptr;
     432              :     ms_MuseSampler_process_offline processOffline = nullptr;
     433              : 
     434              :     ms_MuseSampler_ready_to_play readyToPlay = nullptr;
     435              : 
     436              :     ms_MuseSampler_set_position setPosition = nullptr;
     437              :     ms_MuseSampler_set_playing setPlaying = nullptr;
     438              :     ms_MuseSampler_process process = nullptr;
     439              :     ms_MuseSampler_all_notes_off allNotesOff = nullptr;
     440              : 
     441              :     ms_reload_all_instruments reloadAllInstruments = nullptr;
     442              : 
     443              :     ms_set_logging_callback setLoggingCallback = nullptr;
     444              :     ms_MuseSampler_set_rendering_state_changed_callback_2 setRenderingStateChangedCallback = nullptr;
     445              : 
     446              :     ms_MuseSampler_set_score_id setScoreId = nullptr;
     447              :     ms_Instrument_is_online isOnlineInstrument = nullptr;
     448              :     ms_RenderProgressInfo2_get_next getNextRenderProgressInfo = nullptr;
     449              :     ms_MuseSampler_set_auto_render_interval setAutoRenderInterval = nullptr;
     450              :     ms_MuseSampler_trigger_render triggerRender = nullptr;
     451              :     ms_MuseSampler_clear_online_cache clearOnlineCache = nullptr;
     452              :     ms_MuseSampler_set_lazy_render setLazyRender = nullptr;
     453              : 
     454              : private:
     455            0 :     void* libFunc(const char* funcName)
     456              :     {
     457            0 :         return muse::getLibFunc(m_lib, funcName);
     458              :     }
     459              : 
     460            0 :     static std::string initResultToString(ms_InitResult result)
     461              :     {
     462            0 :         switch (result) {
     463            0 :         case ms_InitResult_OK: return "OK";
     464            0 :         case ms_InitResult_ProtectionRejected: return "ProtectionRejected";
     465            0 :         case ms_InitResult_ConfigurationMissing: return "ConfigurationMissing";
     466            0 :         case ms_InitResult_ConfigurationUnreadable: return "ConfigurationUnreadable";
     467            0 :         case ms_InitResult_ConfigurationInvalid: return "ConfigurationInvalid";
     468            0 :         case ms_InitResult_InstrumentMapMissing: return "InstrumentMapMissing";
     469            0 :         case ms_InitResult_ReceiptMissing: return "ReceiptMissing";
     470            0 :         case ms_InitResult_ReceiptRejected: return "ReceiptRejected";
     471            0 :         case ms_InitResult_DatabaseOpenFailed: return "DatabaseOpenFailed";
     472            0 :         case ms_InitResult_InstrumentMapReadFailed: return "InstrumentMapReadFailed";
     473            0 :         case ms_InitResult_NoInstalledInstruments: return "NoInstalledInstruments";
     474            0 :         case ms_InitResult_NoUsableInstruments: return "NoUsableInstruments";
     475              :         }
     476              : 
     477            0 :         return std::to_string(static_cast<int>(result));
     478              :     }
     479              : 
     480              :     std::function<std::variant<ms_InitResult, ms_Result>()> initLib = nullptr;
     481              :     ms_deinit deinitLib = nullptr;
     482              :     ms_disable_reverb disableReverb = nullptr;
     483              : 
     484              :     MuseSamplerLib m_lib = nullptr;
     485              :     Version m_version;
     486              :     int m_buildNumber = -1;
     487              : };
     488              : 
     489              : using MuseSamplerLibHandlerPtr = std::shared_ptr<MuseSamplerLibHandler>;
     490              : }
        

Generated by: LCOV version 2.0-1