From 9c2574a604d10f9b63485db72f568bfe80501aea Mon Sep 17 00:00:00 2001 From: JeffMyers Date: Mon, 17 Aug 2026 10:51:46 -0700 Subject: [PATCH] Add user data to the audio stream callback --- src/raudio.c | 18 ++++++++++++++---- src/raylib.h | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/raudio.c b/src/raudio.c index ec97bdee1..2157c313e 100644 --- a/src/raudio.c +++ b/src/raudio.c @@ -348,6 +348,7 @@ struct rAudioBuffer { unsigned int converterResidualCount; // The number of valid frames sitting in converterResidual AudioCallback callback; // Audio buffer callback for buffer filling on audio threads + void* userData; rAudioProcessor *processor; // Audio processor float volume; // Audio buffer volume @@ -374,6 +375,7 @@ struct rAudioBuffer { // NOTE: Useful to apply effects to an AudioBuffer struct rAudioProcessor { AudioCallback process; // Processor callback function + void* userData; rAudioProcessor *next; // Next audio processor on the list rAudioProcessor *prev; // Previous audio processor on the list }; @@ -2255,11 +2257,17 @@ void SetAudioStreamBufferSizeDefault(int size) // Audio thread callback to request new data void SetAudioStreamCallback(AudioStream stream, AudioCallback callback) +{ + SetAudioStreamCallbackEX(stream, callback, NULL); +} + +void SetAudioStreamCallbackEX(AudioStream stream, AudioCallback callback, void* userData) { if (stream.buffer != NULL) { ma_mutex_lock(&AUDIO.System.lock); stream.buffer->callback = callback; + stream.buffer->userData = userData; ma_mutex_unlock(&AUDIO.System.lock); } } @@ -2273,6 +2281,7 @@ void AttachAudioStreamProcessor(AudioStream stream, AudioCallback process) rAudioProcessor *processor = (rAudioProcessor *)RL_CALLOC(1, sizeof(rAudioProcessor)); processor->process = process; + processor->userData = stream.buffer->userData; rAudioProcessor *last = stream.buffer->processor; @@ -2326,7 +2335,8 @@ void AttachAudioMixedProcessor(AudioCallback process) rAudioProcessor *processor = (rAudioProcessor *)RL_CALLOC(1, sizeof(rAudioProcessor)); processor->process = process; - + processor->userData = NULL; + rAudioProcessor *last = AUDIO.mixedProcessor; while (last && last->next) @@ -2388,7 +2398,7 @@ static ma_uint32 ReadAudioBufferFramesInInternalFormat(AudioBuffer *audioBuffer, // Using audio buffer callback if (audioBuffer->callback) { - audioBuffer->callback(framesOut, frameCount); + audioBuffer->callback(framesOut, frameCount, audioBuffer->userData); audioBuffer->framesProcessed += frameCount; return frameCount; @@ -2603,7 +2613,7 @@ static void OnSendAudioDataToDevice(ma_device *pDevice, void *pFramesOut, const rAudioProcessor *processor = audioBuffer->processor; while (processor) { - processor->process(framesIn, framesJustRead); + processor->process(framesIn, framesJustRead, audioBuffer->userData); processor = processor->next; } @@ -2647,7 +2657,7 @@ static void OnSendAudioDataToDevice(ma_device *pDevice, void *pFramesOut, const rAudioProcessor *processor = AUDIO.mixedProcessor; while (processor) { - processor->process(pFramesOut, frameCount); + processor->process(pFramesOut, frameCount, processor->userData); processor = processor->next; } diff --git a/src/raylib.h b/src/raylib.h index 154158131..9b7682f75 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1744,6 +1744,7 @@ RLAPI void SetAudioStreamPitch(AudioStream stream, float pitch); // Set pit RLAPI void SetAudioStreamPan(AudioStream stream, float pan); // Set pan for audio stream (-1.0 left, 0.0 center, 1.0 right) RLAPI void SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams RLAPI void SetAudioStreamCallback(AudioStream stream, AudioCallback callback); // Audio thread callback to request new data +RLAPI void SetAudioStreamCallbackEX(AudioStream stream, AudioCallback callback, void* userData); // Audio thread callback to request new data with user data RLAPI void AttachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Attach audio stream processor to stream, receives frames x 2 samples as 'float' (stereo) RLAPI void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Detach audio stream processor from stream