From 78d9ef36e27dbe340b4a869107844e9a3a07a370 Mon Sep 17 00:00:00 2001 From: Roman Pudashkin Date: Tue, 23 Apr 2024 10:41:28 +0300 Subject: [PATCH] Check result of init call to MuseSampler - Using the library if this init call does not return "OK" can lead to segfaults. - This checks the return value and disallows use of the library on failure. --- .../musesampler/internal/libhandler.h | 33 ++++++++++++------ .../internal/musesamplerresolver.cpp | 34 +++++++++---------- .../internal/musesamplerresolver.h | 3 +- .../internal/musesamplerwrapper.cpp | 2 -- 4 files changed, 41 insertions(+), 31 deletions(-) diff --git a/src/framework/musesampler/internal/libhandler.h b/src/framework/musesampler/internal/libhandler.h index 82f8bfd22a49c..8d413fb356734 100644 --- a/src/framework/musesampler/internal/libhandler.h +++ b/src/framework/musesampler/internal/libhandler.h @@ -34,8 +34,6 @@ namespace mu::musesampler { struct MuseSamplerLibHandler { - ms_init initLib = nullptr; - ms_disable_reverb disableReverb = nullptr; ms_get_version_major getVersionMajor = nullptr; ms_get_version_minor getVersionMinor = nullptr; ms_get_version_revision getVersionRevision = nullptr; @@ -103,6 +101,8 @@ struct MuseSamplerLibHandler ms_MuseSampler_all_notes_off allNotesOff = nullptr; private: + ms_init initLib = nullptr; + ms_disable_reverb disableReverb = nullptr; ms_MuseSampler_add_track_dynamics_event addDynamicsEventInternal = nullptr; ms_MuseSampler_add_track_dynamics_event_2 addDynamicsEventInternal2 = nullptr; ms_MuseSampler_add_track_pedal_event addPedalEventInternal = nullptr; @@ -380,14 +380,6 @@ struct MuseSamplerLibHandler setPlaying = (ms_MuseSampler_set_playing)getLibFunc(m_lib, "ms_MuseSampler_set_playing"); process = (ms_MuseSampler_process)getLibFunc(m_lib, "ms_MuseSampler_process"); allNotesOff = (ms_MuseSampler_all_notes_off)getLibFunc(m_lib, "ms_MuseSampler_all_notes_off"); - - if (initLib) { - initLib(); - - if (disableReverb) { - disableReverb(); - } - } } ~MuseSamplerLibHandler() @@ -399,6 +391,27 @@ struct MuseSamplerLibHandler closeLib(m_lib); } + bool init() + { + if (!initLib) { + LOGE() << "Could not find ms_init"; + return false; + } + + if (initLib() != ms_Result_OK) { + LOGE() << "Could not init lib"; + return false; + } + + if (disableReverb) { + if (disableReverb() != ms_Result_OK) { + LOGW() << "Could not disable reverb"; + } + } + + return true; + } + bool isValid() const { return m_lib diff --git a/src/framework/musesampler/internal/musesamplerresolver.cpp b/src/framework/musesampler/internal/musesamplerresolver.cpp index c92d404968711..25c9dd8d78c64 100644 --- a/src/framework/musesampler/internal/musesamplerresolver.cpp +++ b/src/framework/musesampler/internal/musesamplerresolver.cpp @@ -85,18 +85,28 @@ InstrumentInfo findInstrument(MuseSamplerLibHandlerPtr libHandler, const AudioRe void MuseSamplerResolver::init() { - io::path_t path = configuration()->userLibraryPath(); - m_libHandler = std::make_shared(path); - if (checkLibrary()) { + if (doInit(configuration()->userLibraryPath())) { return; } - // Use fallback - path = configuration()->fallbackLibraryPath(); - m_libHandler = std::make_shared(path); - if (!checkLibrary()) { + doInit(configuration()->fallbackLibraryPath()); +} + +bool MuseSamplerResolver::doInit(const io::path_t& libPath) +{ + m_libHandler = std::make_shared(libPath); + + bool ok = m_libHandler->isValid(); + if (ok) { + ok = m_libHandler->init(); + } + + if (!ok) { + LOGE() << "Incompatible MuseSampler library; ignoring"; m_libHandler.reset(); } + + return ok; } ISynthesizerPtr MuseSamplerResolver::resolveSynth(const audio::TrackId /*trackId*/, const audio::AudioInputParams& params) const @@ -304,16 +314,6 @@ std::vector MuseSamplerResolver::instruments() const return result; } -bool MuseSamplerResolver::checkLibrary() const -{ - if (!m_libHandler->isValid()) { - LOGE() << "Incompatible MuseSampler library; ignoring"; - return false; - } - - return true; -} - void MuseSamplerResolver::loadSoundPresetAttributes(SoundPresetAttributes& attributes, int instrumentId, const char* presetCode) const { const char* articulations_cstr = m_libHandler->getTextArticulations(instrumentId, presetCode); diff --git a/src/framework/musesampler/internal/musesamplerresolver.h b/src/framework/musesampler/internal/musesamplerresolver.h index 62ec58d6fe9cc..913dab7ee6c2a 100644 --- a/src/framework/musesampler/internal/musesamplerresolver.h +++ b/src/framework/musesampler/internal/musesamplerresolver.h @@ -54,8 +54,7 @@ class MuseSamplerResolver : public audio::synth::ISynthResolver::IResolver, publ std::vector instruments() const override; private: - bool checkLibrary() const; - bool isVersionSupported() const; + bool doInit(const io::path_t& libPath); void loadSoundPresetAttributes(audio::SoundPresetAttributes& attributes, int instrumentId, const char* presetCode) const; diff --git a/src/framework/musesampler/internal/musesamplerwrapper.cpp b/src/framework/musesampler/internal/musesamplerwrapper.cpp index d98ff6865877a..0dbd37ed0311a 100644 --- a/src/framework/musesampler/internal/musesamplerwrapper.cpp +++ b/src/framework/musesampler/internal/musesamplerwrapper.cpp @@ -40,8 +40,6 @@ MuseSamplerWrapper::MuseSamplerWrapper(MuseSamplerLibHandlerPtr samplerLib, cons return; } - m_samplerLib->initLib(); - m_sequencer.setOnOffStreamFlushed([this]() { revokePlayingNotes(); });