Skip to content

Commit

Permalink
re-init the sampler when changing the sample rate
Browse files Browse the repository at this point in the history
but not in offline mode, since it runs at its own sample rate
  • Loading branch information
RomanPudashkin committed Aug 8, 2024
1 parent 5c8604a commit 57ca481
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 13 deletions.
7 changes: 7 additions & 0 deletions src/framework/musesampler/internal/libhandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -388,6 +389,11 @@ struct MuseSamplerLibHandler
&& allNotesOff;
}

bool supportsReinit() const
{
return m_supportsReinit;
}

private:
void printApiStatus() const
{
Expand Down Expand Up @@ -448,6 +454,7 @@ struct MuseSamplerLibHandler
}

MuseSamplerLib m_lib = nullptr;
bool m_supportsReinit = false;
};

using MuseSamplerLibHandlerPtr = std::shared_ptr<MuseSamplerLibHandler>;
Expand Down
49 changes: 36 additions & 13 deletions src/framework/musesampler/internal/musesamplerwrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions src/framework/musesampler/internal/musesamplerwrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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<float> m_leftChannel;
std::vector<float> m_rightChannel;
Expand Down

0 comments on commit 57ca481

Please sign in to comment.