WebAudio: Fix a noise sound before device was started

This commit is contained in:
francois@recisio.com
2024-11-05 15:32:39 +01:00
committed by David Reid
parent ad615af1a8
commit 8d5bf8210c
+9 -6
View File
@@ -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) 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_device* pDevice = (ma_device*)pUserData;
ma_uint32 frameCount;
(void)paramCount; (void)paramCount;
(void)pParams; (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 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 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 Unfortunately the audio data is not interleaved so we'll need to convert it before we give the data to miniaudio
for further processing. 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) { if (inputCount > 0) {
/* Input data needs to be interleaved before we hand it to the client. */ /* Input data needs to be interleaved before we hand it to the client. */