summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorRay <[email protected]>2022-03-24 20:49:11 +0100
committerRay <[email protected]>2022-03-24 20:49:11 +0100
commit381236051f696f0c2818b1fff1c119302ae99b27 (patch)
tree578e79e7dc9138928c91a73e0b945abac38982f1 /src
parentbcd84cd36d8777d6fa4dff6dfe08bbb8839ea2be (diff)
downloadraylib-381236051f696f0c2818b1fff1c119302ae99b27.tar.gz
raylib-381236051f696f0c2818b1fff1c119302ae99b27.zip
ADDED: Audio stream input callback #2212 -WIP-
WARNING: This addition is based on a PR and it's still under review, not sure if it will be maintained in the future. In general, raylib tries to avoid callbacks usage mechanisms.
Diffstat (limited to 'src')
-rw-r--r--src/raudio.c22
-rw-r--r--src/raylib.h4
2 files changed, 25 insertions, 1 deletions
diff --git a/src/raudio.c b/src/raudio.c
index d5b13086..8118338b 100644
--- a/src/raudio.c
+++ b/src/raudio.c
@@ -311,9 +311,11 @@ typedef enum {
AUDIO_BUFFER_USAGE_STREAM
} AudioBufferUsage;
-// Audio buffer structure
+// Audio buffer struct
struct rAudioBuffer {
ma_data_converter converter; // Audio data converter
+
+ AudioStreamCallback callback; // Audio buffer callback for buffer filling on audio threads
float volume; // Audio buffer volume
float pitch; // Audio buffer pitch
@@ -555,10 +557,13 @@ AudioBuffer *LoadAudioBuffer(ma_format format, ma_uint32 channels, ma_uint32 sam
audioBuffer->volume = 1.0f;
audioBuffer->pitch = 1.0f;
audioBuffer->pan = 0.5f;
+
+ audioBuffer->callback = NULL;
audioBuffer->playing = false;
audioBuffer->paused = false;
audioBuffer->looping = false;
+
audioBuffer->usage = usage;
audioBuffer->frameCursorPos = 0;
audioBuffer->sizeInFrames = sizeInFrames;
@@ -2028,6 +2033,12 @@ void SetAudioStreamBufferSizeDefault(int size)
AUDIO.Buffer.defaultSize = size;
}
+// Audio thread callback to request new data
+void SetAudioStreamCallback(AudioStream stream, AudioStreamCallback callback)
+{
+ if (stream.buffer != NULL) stream.buffer->callback = callback;
+}
+
//----------------------------------------------------------------------------------
// Module specific Functions Definition
//----------------------------------------------------------------------------------
@@ -2041,6 +2052,15 @@ static void OnLog(void *pUserData, ma_uint32 level, const char *pMessage)
// Reads audio data from an AudioBuffer object in internal format.
static ma_uint32 ReadAudioBufferFramesInInternalFormat(AudioBuffer *audioBuffer, void *framesOut, ma_uint32 frameCount)
{
+ // Using audio buffer callback
+ if (audioBuffer->callback)
+ {
+ audioBuffer->callback(framesOut, frameCount);
+ audioBuffer->framesProcessed += frameCount;
+
+ return frameCount;
+ }
+
ma_uint32 subBufferSizeInFrames = (audioBuffer->sizeInFrames > 1)? audioBuffer->sizeInFrames/2 : audioBuffer->sizeInFrames;
ma_uint32 currentSubBufferIndex = audioBuffer->frameCursorPos/subBufferSizeInFrames;
diff --git a/src/raylib.h b/src/raylib.h
index 262194fd..198cadea 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -425,6 +425,8 @@ typedef struct Wave {
void *data; // Buffer data pointer
} Wave;
+// Opaque structs declaration
+// NOTE: Actual structs are defined internally in raudio module
typedef struct rAudioBuffer rAudioBuffer;
// AudioStream, custom audio stream
@@ -1472,6 +1474,7 @@ RLAPI RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3
//------------------------------------------------------------------------------------
// Audio Loading and Playing Functions (Module: audio)
//------------------------------------------------------------------------------------
+typedef void (*AudioStreamCallback)(void *bufferData, unsigned int frames);
// Audio device management functions
RLAPI void InitAudioDevice(void); // Initialize audio device and context
@@ -1539,6 +1542,7 @@ RLAPI void SetAudioStreamVolume(AudioStream stream, float volume); // Set vol
RLAPI void SetAudioStreamPitch(AudioStream stream, float pitch); // Set pitch for audio stream (1.0 is base level)
RLAPI void SetAudioStreamPan(AudioStream stream, float pan); // Set pan for audio stream (0.5 is centered)
RLAPI void SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams
+RLAPI void SetAudioStreamCallback(AudioStream stream, AudioStreamCallback callback); // Audio thread callback to request new data
#if defined(__cplusplus)
}