diff --git a/src/framework/musesampler/internal/libhandler.h b/src/framework/musesampler/internal/libhandler.h index 924f1524bb962..2cb8543c45b38 100644 --- a/src/framework/musesampler/internal/libhandler.h +++ b/src/framework/musesampler/internal/libhandler.h @@ -167,6 +167,7 @@ struct MuseSamplerLibHandler int versionMinor = getVersionMinor(); bool at_least_v_0_100 = (versionMajor == 0 && versionMinor >= 100) || versionMajor > 0; + m_supportsReinit = at_least_v_0_100; containsInstrument = (ms_contains_instrument)muse::getLibFunc(m_lib, "ms_contains_instrument"); getMatchingInstrumentId = (ms_get_matching_instrument_id)muse::getLibFunc(m_lib, "ms_get_matching_instrument_id"); @@ -388,6 +389,11 @@ struct MuseSamplerLibHandler && allNotesOff; } + bool supportsReinit() const + { + return m_supportsReinit; + } + private: void printApiStatus() const { @@ -448,6 +454,7 @@ struct MuseSamplerLibHandler } MuseSamplerLib m_lib = nullptr; + bool m_supportsReinit = false; }; using MuseSamplerLibHandlerPtr = std::shared_ptr; diff --git a/src/framework/musesampler/internal/musesamplerwrapper.cpp b/src/framework/musesampler/internal/musesamplerwrapper.cpp index a1a79ba2e0a76..41f773d6b8bd9 100644 --- a/src/framework/musesampler/internal/musesamplerwrapper.cpp +++ b/src/framework/musesampler/internal/musesamplerwrapper.cpp @@ -58,24 +58,20 @@ MuseSamplerWrapper::~MuseSamplerWrapper() void MuseSamplerWrapper::setSampleRate(unsigned int sampleRate) { - m_sampleRate = sampleRate; - - if (!m_sampler) { - m_sampler = m_samplerLib->create(); - - samples_t defaultSize = config()->samplesToPreallocate(); + const bool isOffline = currentRenderMode() == RenderMode::OfflineMode; + const bool shouldUpdateSampleRate = m_samplerSampleRate != sampleRate && !isOffline; - if (!m_samplerLib->initSampler(m_sampler, m_sampleRate, defaultSize, AUDIO_CHANNELS_COUNT)) { - LOGE() << "Unable to init MuseSampler"; + if (!m_sampler || shouldUpdateSampleRate) { + if (!initSampler(sampleRate, config()->samplesToPreallocate())) { return; - } else { - LOGD() << "Successfully initialized sampler"; } - prepareOutputBuffer(defaultSize); + m_samplerSampleRate = sampleRate; } - if (currentRenderMode() == RenderMode::OfflineMode) { + m_sampleRate = sampleRate; + + if (isOffline) { m_samplerLib->startOfflineMode(m_sampler, m_sampleRate); m_offlineModeStarted = true; } @@ -262,6 +258,33 @@ void MuseSamplerWrapper::setIsActive(bool arg) } } +bool MuseSamplerWrapper::initSampler(const sample_rate_t sampleRate, const samples_t blockSize) +{ + TRACEFUNC; + + const bool isFirstInit = m_sampler == nullptr; + + if (isFirstInit) { + m_sampler = m_samplerLib->create(); + IF_ASSERT_FAILED(m_sampler) { + return false; + } + } + + if (isFirstInit || m_samplerLib->supportsReinit()) { + if (!m_samplerLib->initSampler(m_sampler, sampleRate, blockSize, AUDIO_CHANNELS_COUNT)) { + LOGE() << "Unable to init MuseSampler"; + return false; + } else { + LOGD() << "Successfully initialized sampler"; + } + } + + prepareOutputBuffer(blockSize); + + return true; +} + InstrumentInfo MuseSamplerWrapper::resolveInstrument(const mpe::PlaybackSetupData& setupData) const { IF_ASSERT_FAILED(m_samplerLib) { @@ -316,7 +339,7 @@ std::string MuseSamplerWrapper::resolveDefaultPresetCode(const InstrumentInfo& i return std::string(); } -void MuseSamplerWrapper::prepareOutputBuffer(const muse::audio::samples_t samples) +void MuseSamplerWrapper::prepareOutputBuffer(const samples_t samples) { if (m_leftChannel.size() < samples) { m_leftChannel.resize(samples, 0.f); diff --git a/src/framework/musesampler/internal/musesamplerwrapper.h b/src/framework/musesampler/internal/musesamplerwrapper.h index df7c573dd3cb8..e8bb612ea7755 100644 --- a/src/framework/musesampler/internal/musesamplerwrapper.h +++ b/src/framework/musesampler/internal/musesamplerwrapper.h @@ -70,6 +70,8 @@ class MuseSamplerWrapper : public muse::audio::synth::AbstractSynthesizer, publi bool isActive() const override; void setIsActive(bool arg) override; + bool initSampler(const muse::audio::sample_rate_t sampleRate, const muse::audio::samples_t blockSize); + InstrumentInfo resolveInstrument(const mpe::PlaybackSetupData& setupData) const; std::string resolveDefaultPresetCode(const InstrumentInfo& instrument) const; @@ -87,6 +89,7 @@ class MuseSamplerWrapper : public muse::audio::synth::AbstractSynthesizer, publi ms_OutputBuffer m_bus; muse::audio::samples_t m_currentPosition = 0; + muse::audio::sample_rate_t m_samplerSampleRate = 0; std::vector m_leftChannel; std::vector m_rightChannel;