From ada02c1ac9d2b9ef923e47851a219fda504991cb Mon Sep 17 00:00:00 2001 From: Roman Pudashkin Date: Fri, 21 Jun 2024 10:13:16 +0300 Subject: [PATCH 1/5] update sampleRate when changing output device --- src/framework/audio/iaudiodriver.h | 2 ++ .../internal/audiooutputdevicecontroller.cpp | 27 +++++++++++++++---- .../internal/audiooutputdevicecontroller.h | 3 +-- .../platform/jack/jackaudiodriver.cpp | 5 ++++ .../internal/platform/jack/jackaudiodriver.h | 2 ++ .../platform/lin/linuxaudiodriver.cpp | 5 ++++ .../internal/platform/lin/linuxaudiodriver.h | 2 ++ .../internal/platform/osx/osxaudiodriver.h | 8 +++--- .../internal/platform/osx/osxaudiodriver.mm | 7 +++-- .../platform/win/wasapiaudiodriver.cpp | 5 ++++ .../internal/platform/win/wasapiaudiodriver.h | 6 +++++ .../audio/internal/worker/audioengine.cpp | 4 +-- .../audio/internal/worker/audioengine.h | 6 ++--- .../audio/internal/worker/iaudioengine.h | 5 ++-- src/framework/stubs/audio/audiodriverstub.cpp | 6 +++++ src/framework/stubs/audio/audiodriverstub.h | 2 ++ 16 files changed, 74 insertions(+), 21 deletions(-) diff --git a/src/framework/audio/iaudiodriver.h b/src/framework/audio/iaudiodriver.h index 15a0abe149475..4a6a80520becd 100644 --- a/src/framework/audio/iaudiodriver.h +++ b/src/framework/audio/iaudiodriver.h @@ -65,6 +65,8 @@ class IAudioDriver : MODULE_EXPORT_INTERFACE virtual void close() = 0; virtual bool isOpened() const = 0; + virtual const Spec& activeSpec() const = 0; + virtual AudioDeviceID outputDevice() const = 0; virtual bool selectOutputDevice(const AudioDeviceID& id) = 0; virtual bool resetToDefaultOutputDevice() = 0; diff --git a/src/framework/audio/internal/audiooutputdevicecontroller.cpp b/src/framework/audio/internal/audiooutputdevicecontroller.cpp index fc14e67eb221c..d20c385676a2e 100644 --- a/src/framework/audio/internal/audiooutputdevicecontroller.cpp +++ b/src/framework/audio/internal/audiooutputdevicecontroller.cpp @@ -39,7 +39,10 @@ void AudioOutputDeviceController::init() configuration()->audioOutputDeviceIdChanged().onNotify(this, [this]() { AudioDeviceID deviceId = configuration()->audioOutputDeviceId(); - audioDriver()->selectOutputDevice(deviceId); + bool ok = audioDriver()->selectOutputDevice(deviceId); + if (ok) { + onOutputDeviceChanged(); + } }); configuration()->driverBufferSizeChanged().onNotify(this, [this]() { @@ -79,12 +82,26 @@ void AudioOutputDeviceController::checkConnection() AudioDeviceID currentDeviceId = audioDriver()->outputDevice(); AudioDeviceList devices = audioDriver()->availableOutputDevices(); + bool deviceChanged = false; + if (!preferredDeviceId.empty() && preferredDeviceId != currentDeviceId && containsDevice(devices, preferredDeviceId)) { - audioDriver()->selectOutputDevice(preferredDeviceId); - return; + deviceChanged = audioDriver()->selectOutputDevice(preferredDeviceId); + } else if (!containsDevice(devices, currentDeviceId)) { + deviceChanged = audioDriver()->resetToDefaultOutputDevice(); } - if (!containsDevice(devices, currentDeviceId)) { - audioDriver()->resetToDefaultOutputDevice(); + if (deviceChanged) { + onOutputDeviceChanged(); } } + +void AudioOutputDeviceController::onOutputDeviceChanged() +{ + IAudioDriver::Spec activeSpec = audioDriver()->activeSpec(); + + async::Async::call(this, [this, activeSpec]() { + audioEngine()->setAudioChannelsCount(activeSpec.channels); + audioEngine()->setSampleRate(activeSpec.sampleRate); + audioEngine()->setReadBufferSize(activeSpec.samples); + }, AudioThread::ID); +} diff --git a/src/framework/audio/internal/audiooutputdevicecontroller.h b/src/framework/audio/internal/audiooutputdevicecontroller.h index 2b880c253def7..82f595876055b 100644 --- a/src/framework/audio/internal/audiooutputdevicecontroller.h +++ b/src/framework/audio/internal/audiooutputdevicecontroller.h @@ -45,8 +45,7 @@ class AudioOutputDeviceController : public Injectable, public async::Asyncable private: void checkConnection(); - - void connectCurrentOutputDevice(); + void onOutputDeviceChanged(); }; } diff --git a/src/framework/audio/internal/platform/jack/jackaudiodriver.cpp b/src/framework/audio/internal/platform/jack/jackaudiodriver.cpp index f2543a50bdd8c..fd1d2a2327083 100644 --- a/src/framework/audio/internal/platform/jack/jackaudiodriver.cpp +++ b/src/framework/audio/internal/platform/jack/jackaudiodriver.cpp @@ -192,6 +192,11 @@ bool JackAudioDriver::isOpened() const return s_jackData != nullptr; } +const JackAudioDriver::Spec& JackAudioDriver::activeSpec() const +{ + return s_format2; +} + AudioDeviceID JackAudioDriver::outputDevice() const { return m_deviceId; diff --git a/src/framework/audio/internal/platform/jack/jackaudiodriver.h b/src/framework/audio/internal/platform/jack/jackaudiodriver.h index 5f386c0f87ac9..0d488693a9a10 100644 --- a/src/framework/audio/internal/platform/jack/jackaudiodriver.h +++ b/src/framework/audio/internal/platform/jack/jackaudiodriver.h @@ -46,6 +46,8 @@ class JackAudioDriver : public IAudioDriver, public async::Asyncable void close() override; bool isOpened() const override; + const Spec& activeSpec() const override; + AudioDeviceID outputDevice() const override; bool selectOutputDevice(const AudioDeviceID& deviceId) override; bool resetToDefaultOutputDevice() override; diff --git a/src/framework/audio/internal/platform/lin/linuxaudiodriver.cpp b/src/framework/audio/internal/platform/lin/linuxaudiodriver.cpp index 5dc90c4ee78af..b8dfd9dda06ed 100644 --- a/src/framework/audio/internal/platform/lin/linuxaudiodriver.cpp +++ b/src/framework/audio/internal/platform/lin/linuxaudiodriver.cpp @@ -207,6 +207,11 @@ bool LinuxAudioDriver::isOpened() const return s_alsaData != nullptr; } +const LinuxAudioDriver::Spec& LinuxAudioDriver::activeSpec() const +{ + return s_format; +} + AudioDeviceID LinuxAudioDriver::outputDevice() const { return m_deviceId; diff --git a/src/framework/audio/internal/platform/lin/linuxaudiodriver.h b/src/framework/audio/internal/platform/lin/linuxaudiodriver.h index 59dec9dc28f5e..f827178bb0824 100644 --- a/src/framework/audio/internal/platform/lin/linuxaudiodriver.h +++ b/src/framework/audio/internal/platform/lin/linuxaudiodriver.h @@ -43,6 +43,8 @@ class LinuxAudioDriver : public IAudioDriver, public async::Asyncable void close() override; bool isOpened() const override; + const Spec& activeSpec() const override; + AudioDeviceID outputDevice() const override; bool selectOutputDevice(const AudioDeviceID& deviceId) override; bool resetToDefaultOutputDevice() override; diff --git a/src/framework/audio/internal/platform/osx/osxaudiodriver.h b/src/framework/audio/internal/platform/osx/osxaudiodriver.h index dce0db6dc6a69..11298dfd25652 100644 --- a/src/framework/audio/internal/platform/osx/osxaudiodriver.h +++ b/src/framework/audio/internal/platform/osx/osxaudiodriver.h @@ -28,9 +28,6 @@ #include -#include "global/modularity/ioc.h" -#include "iaudioconfiguration.h" - #include "iaudiodriver.h" struct AudioTimeStamp; @@ -40,8 +37,6 @@ struct OpaqueAudioQueue; namespace muse::audio { class OSXAudioDriver : public IAudioDriver { - INJECT(IAudioConfiguration, configuration) - public: OSXAudioDriver(); ~OSXAudioDriver(); @@ -52,6 +47,9 @@ class OSXAudioDriver : public IAudioDriver bool open(const Spec& spec, Spec* activeSpec) override; void close() override; bool isOpened() const override; + + const Spec& activeSpec() const override; + void resume() override; void suspend() override; diff --git a/src/framework/audio/internal/platform/osx/osxaudiodriver.mm b/src/framework/audio/internal/platform/osx/osxaudiodriver.mm index f5a12c4441f31..2477e63ede2bd 100644 --- a/src/framework/audio/internal/platform/osx/osxaudiodriver.mm +++ b/src/framework/audio/internal/platform/osx/osxaudiodriver.mm @@ -26,8 +26,6 @@ #include -#include - #include "translation.h" #include "log.h" @@ -185,6 +183,11 @@ return m_data->audioQueue != nullptr; } +const OSXAudioDriver::Spec& OSXAudioDriver::activeSpec() const +{ + return m_data->format; +} + AudioDeviceList OSXAudioDriver::availableOutputDevices() const { std::lock_guard lock(m_devicesMutex); diff --git a/src/framework/audio/internal/platform/win/wasapiaudiodriver.cpp b/src/framework/audio/internal/platform/win/wasapiaudiodriver.cpp index 0f7af06a0de2d..7b03f56b3a84b 100644 --- a/src/framework/audio/internal/platform/win/wasapiaudiodriver.cpp +++ b/src/framework/audio/internal/platform/win/wasapiaudiodriver.cpp @@ -166,6 +166,11 @@ bool WasapiAudioDriver::isOpened() const return m_isOpened; } +const WasapiAudioDriver::Spec& WasapiAudioDriver::activeSpec() const +{ + return m_activeSpec; +} + AudioDeviceID WasapiAudioDriver::outputDevice() const { return m_deviceId; diff --git a/src/framework/audio/internal/platform/win/wasapiaudiodriver.h b/src/framework/audio/internal/platform/win/wasapiaudiodriver.h index cbfdd08bf5850..8388d734edc12 100644 --- a/src/framework/audio/internal/platform/win/wasapiaudiodriver.h +++ b/src/framework/audio/internal/platform/win/wasapiaudiodriver.h @@ -37,20 +37,26 @@ class WasapiAudioDriver : public IAudioDriver, public async::Asyncable WasapiAudioDriver(); void init() override; + std::string name() const override; bool open(const Spec& spec, Spec* activeSpec) override; void close() override; bool isOpened() const override; + + const Spec& activeSpec() const override; + AudioDeviceID outputDevice() const override; bool selectOutputDevice(const AudioDeviceID& id) override; bool resetToDefaultOutputDevice() override; async::Notification outputDeviceChanged() const override; + AudioDeviceList availableOutputDevices() const override; async::Notification availableOutputDevicesChanged() const override; unsigned int outputDeviceBufferSize() const override; bool setOutputDeviceBufferSize(unsigned int bufferSize) override; async::Notification outputDeviceBufferSizeChanged() const override; + std::vector availableOutputDeviceBufferSizes() const override; unsigned int outputDeviceSampleRate() const override; diff --git a/src/framework/audio/internal/worker/audioengine.cpp b/src/framework/audio/internal/worker/audioengine.cpp index e471d3c1d567a..8f60af34c4cfc 100644 --- a/src/framework/audio/internal/worker/audioengine.cpp +++ b/src/framework/audio/internal/worker/audioengine.cpp @@ -88,7 +88,7 @@ sample_rate_t AudioEngine::sampleRate() const return m_sampleRate; } -void AudioEngine::setSampleRate(sample_rate_t sampleRate) +void AudioEngine::setSampleRate(const sample_rate_t sampleRate) { ONLY_AUDIO_WORKER_THREAD; @@ -108,7 +108,7 @@ void AudioEngine::setSampleRate(sample_rate_t sampleRate) } } -void AudioEngine::setReadBufferSize(uint16_t readBufferSize) +void AudioEngine::setReadBufferSize(const uint16_t readBufferSize) { ONLY_AUDIO_WORKER_THREAD; diff --git a/src/framework/audio/internal/worker/audioengine.h b/src/framework/audio/internal/worker/audioengine.h index bfc3b2f79dc1d..735e4b470a642 100644 --- a/src/framework/audio/internal/worker/audioengine.h +++ b/src/framework/audio/internal/worker/audioengine.h @@ -53,9 +53,9 @@ class AudioEngine : public IAudioEngine, public Injectable, public async::Asynca sample_rate_t sampleRate() const override; - void setSampleRate(sample_rate_t sampleRate) override; - void setReadBufferSize(uint16_t readBufferSize) override; - void setAudioChannelsCount(const audioch_t count); + void setSampleRate(const sample_rate_t sampleRate) override; + void setReadBufferSize(const uint16_t readBufferSize) override; + void setAudioChannelsCount(const audioch_t count) override; RenderMode mode() const override; void setMode(const RenderMode newMode) override; diff --git a/src/framework/audio/internal/worker/iaudioengine.h b/src/framework/audio/internal/worker/iaudioengine.h index b846a67725418..29b6808c15337 100644 --- a/src/framework/audio/internal/worker/iaudioengine.h +++ b/src/framework/audio/internal/worker/iaudioengine.h @@ -38,8 +38,9 @@ class IAudioEngine : MODULE_EXPORT_INTERFACE virtual sample_rate_t sampleRate() const = 0; - virtual void setSampleRate(sample_rate_t sampleRate) = 0; - virtual void setReadBufferSize(uint16_t readBufferSize) = 0; + virtual void setSampleRate(const sample_rate_t sampleRate) = 0; + virtual void setReadBufferSize(const uint16_t readBufferSize) = 0; + virtual void setAudioChannelsCount(const audioch_t count) = 0; virtual RenderMode mode() const = 0; virtual void setMode(const RenderMode newMode) = 0; diff --git a/src/framework/stubs/audio/audiodriverstub.cpp b/src/framework/stubs/audio/audiodriverstub.cpp index 4be40552641fe..4dd4e97c5e3de 100644 --- a/src/framework/stubs/audio/audiodriverstub.cpp +++ b/src/framework/stubs/audio/audiodriverstub.cpp @@ -47,6 +47,12 @@ bool AudioDriverStub::isOpened() const return false; } +const AudioDriverStub::Spec& AudioDriverStub::activeSpec() const +{ + static IAudioDriver::Spec dummySpec; + return dummySpec; +} + std::string AudioDriverStub::outputDevice() const { return std::string(); diff --git a/src/framework/stubs/audio/audiodriverstub.h b/src/framework/stubs/audio/audiodriverstub.h index b6320e1e9956c..bfba3859020bd 100644 --- a/src/framework/stubs/audio/audiodriverstub.h +++ b/src/framework/stubs/audio/audiodriverstub.h @@ -35,6 +35,8 @@ class AudioDriverStub : public IAudioDriver void close() override; bool isOpened() const override; + const Spec& activeSpec() const override; + AudioDeviceID outputDevice() const override; bool selectOutputDevice(const AudioDeviceID& id) override; bool resetToDefaultOutputDevice() override; From 1feae73fc2a15b9f71928152b2804e1a54d84662 Mon Sep 17 00:00:00 2001 From: Roman Pudashkin Date: Mon, 29 Jul 2024 14:33:59 +0300 Subject: [PATCH 2/5] added missing setSampleRate calls --- src/framework/audio/internal/worker/mixer.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/framework/audio/internal/worker/mixer.cpp b/src/framework/audio/internal/worker/mixer.cpp index ae341ada00cb4..08ae9d6275fae 100644 --- a/src/framework/audio/internal/worker/mixer.cpp +++ b/src/framework/audio/internal/worker/mixer.cpp @@ -162,6 +162,14 @@ void Mixer::setSampleRate(unsigned int sampleRate) for (auto& channel : m_trackChannels) { channel.second->setSampleRate(sampleRate); } + + for (AuxChannelInfo& aux : m_auxChannelInfoList) { + aux.channel->setSampleRate(sampleRate); + } + + for (IFxProcessorPtr& fx : m_masterFxProcessors) { + fx->setSampleRate(sampleRate); + } } unsigned int Mixer::audioChannelsCount() const From f4f9aab892ec38a6e87980e5726d58ffc4ec17c8 Mon Sep 17 00:00:00 2001 From: Roman Pudashkin Date: Thu, 8 Aug 2024 13:30:57 +0300 Subject: [PATCH 3/5] re-init the sampler when changing the sample rate but not in offline mode, since it runs at its own sample rate --- .../musesampler/internal/libhandler.h | 7 +++ .../internal/musesamplerwrapper.cpp | 49 ++++++++++++++----- .../musesampler/internal/musesamplerwrapper.h | 3 ++ 3 files changed, 46 insertions(+), 13 deletions(-) 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; From b88193faa6c89c579691d845c76c5f535d291375 Mon Sep 17 00:00:00 2001 From: Roman Pudashkin Date: Thu, 8 Aug 2024 16:24:49 +0300 Subject: [PATCH 4/5] update available buffer sizes when changing output device --- .../view/preferences/commonaudioapiconfigurationmodel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/appshell/view/preferences/commonaudioapiconfigurationmodel.cpp b/src/appshell/view/preferences/commonaudioapiconfigurationmodel.cpp index 576f2f28778ad..9cea7640822e6 100644 --- a/src/appshell/view/preferences/commonaudioapiconfigurationmodel.cpp +++ b/src/appshell/view/preferences/commonaudioapiconfigurationmodel.cpp @@ -44,6 +44,7 @@ void CommonAudioApiConfigurationModel::load() audioDriver()->outputDeviceChanged().onNotify(this, [this]() { emit currentDeviceIdChanged(); emit sampleRateChanged(); + emit bufferSizeListChanged(); emit bufferSizeChanged(); }); From 915294aaf8e2adb48b4ea7480c09a1861293c020 Mon Sep 17 00:00:00 2001 From: Roman Pudashkin Date: Thu, 8 Aug 2024 17:33:54 +0300 Subject: [PATCH 5/5] added logs --- src/framework/musesampler/internal/musesamplerwrapper.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/framework/musesampler/internal/musesamplerwrapper.cpp b/src/framework/musesampler/internal/musesamplerwrapper.cpp index 41f773d6b8bd9..6319f60c054e3 100644 --- a/src/framework/musesampler/internal/musesamplerwrapper.cpp +++ b/src/framework/musesampler/internal/musesamplerwrapper.cpp @@ -72,6 +72,7 @@ void MuseSamplerWrapper::setSampleRate(unsigned int sampleRate) m_sampleRate = sampleRate; if (isOffline) { + LOGD() << "Start offline mode, sampleRate: " << m_sampleRate; m_samplerLib->startOfflineMode(m_sampler, m_sampleRate); m_offlineModeStarted = true; } @@ -276,7 +277,7 @@ bool MuseSamplerWrapper::initSampler(const sample_rate_t sampleRate, const sampl LOGE() << "Unable to init MuseSampler"; return false; } else { - LOGD() << "Successfully initialized sampler"; + LOGD() << "Successfully initialized sampler, sampleRate: " << sampleRate << ", blockSize: " << blockSize; } }