From 8d5bf8210c90d7c4c7f4c9d60fe0e6f41e39436f Mon Sep 17 00:00:00 2001 From: "francois@recisio.com" Date: Tue, 5 Nov 2024 15:32:39 +0100 Subject: [PATCH] WebAudio: Fix a noise sound before device was started --- miniaudio.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/miniaudio.h b/miniaudio.h index 25604185..cacd5d4d 100644 --- a/miniaudio.h +++ b/miniaudio.h @@ -40099,15 +40099,10 @@ typedef struct static EM_BOOL ma_audio_worklet_process_callback__webaudio(int inputCount, const AudioSampleFrame* pInputs, int outputCount, AudioSampleFrame* pOutputs, int paramCount, const AudioParamFrame* pParams, void* pUserData) { ma_device* pDevice = (ma_device*)pUserData; - ma_uint32 frameCount; (void)paramCount; (void)pParams; - if (ma_device_get_state(pDevice) != ma_device_state_started) { - return EM_TRUE; - } - /* The Emscripten documentation says that it'll always be 128 frames being passed in. Hard coding it like that feels like a very bad idea to me. Even if it's hard coded in the backend, the API and documentation should always refer @@ -40116,7 +40111,15 @@ static EM_BOOL ma_audio_worklet_process_callback__webaudio(int inputCount, const Unfortunately the audio data is not interleaved so we'll need to convert it before we give the data to miniaudio for further processing. */ - frameCount = 128; + ma_uint32 frameCount = 128; + + if (ma_device_get_state(pDevice) != ma_device_state_started) { + /* Fill the output buffer with zero to avoid a noise sound */ + if (outputCount > 0) { + MA_ZERO_MEMORY(pOutputs[0].data, frameCount * pDevice->playback.internalChannels * sizeof(float)); + } + return EM_TRUE; + } if (inputCount > 0) { /* Input data needs to be interleaved before we hand it to the client. */