From a17e4b44c6b623a4543af30a6e1d68514211b641 Mon Sep 17 00:00:00 2001 From: KislyjKisel Date: Thu, 20 Jun 2024 20:14:37 +0300 Subject: [PATCH] Add thread entry and exit callbacks --- src/raudio.c | 33 ++++++++++++++++++++++++++++++++- src/raylib.h | 5 +++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/raudio.c b/src/raudio.c index 623984e1d..6dde62f3f 100644 --- a/src/raudio.c +++ b/src/raudio.c @@ -175,6 +175,12 @@ typedef struct tagBITMAPINFOHEADER { // Threading model: Default: [0] COINIT_MULTITHREADED: COM calls objects on any thread (free threading) #define MA_COINIT_VALUE 2 // [2] COINIT_APARTMENTTHREADED: Each object has its own thread (apartment model) +static void CallAudioThreadEntryCallback(void); +static void CallAudioThreadExitCallback(void); + +#define MA_ON_THREAD_ENTRY CallAudioThreadEntryCallback(); +#define MA_ON_THREAD_EXIT CallAudioThreadExitCallback(); + #define MINIAUDIO_IMPLEMENTATION //#define MA_DEBUG_OUTPUT #include "external/miniaudio.h" // Audio device initialization and management @@ -391,6 +397,8 @@ typedef struct AudioData { int defaultSize; // Default audio buffer size for audio streams } Buffer; rAudioProcessor *mixedProcessor; + AudioThreadEntryCallback threadEntryCallback; + AudioThreadExitCallback threadExitCallback; } AudioData; //---------------------------------------------------------------------------------- @@ -403,7 +411,9 @@ static AudioData AUDIO = { // Global AUDIO context // standard double-buffering system, a 4096 samples buffer has been chosen, it should be enough // In case of music-stalls, just increase this number .Buffer.defaultSize = 0, - .mixedProcessor = NULL + .mixedProcessor = NULL, + .threadEntryCallback = NULL, + .threadExitCallback = NULL }; //---------------------------------------------------------------------------------- @@ -2327,6 +2337,14 @@ void DetachAudioMixedProcessor(AudioCallback process) ma_mutex_unlock(&AUDIO.System.lock); } +void SetAudioThreadEntryCallback(AudioThreadEntryCallback callback) { + AUDIO.threadEntryCallback = callback; +} + +void SetAudioThreadExitCallback(AudioThreadExitCallback callback) { + AUDIO.threadExitCallback = callback; +} + //---------------------------------------------------------------------------------- // Module specific Functions Definition @@ -2698,6 +2716,19 @@ static void UpdateAudioStreamInLockedState(AudioStream stream, const void *data, } } +static void CallAudioThreadEntryCallback(void) { + if (AUDIO.threadEntryCallback) { + AUDIO.threadEntryCallback(); + } +} + +static void CallAudioThreadExitCallback(void) { + if (AUDIO.threadExitCallback) { + AUDIO.threadExitCallback(); + } +} + + // Some required functions for audio standalone module version #if defined(RAUDIO_STANDALONE) // Check file extension diff --git a/src/raylib.h b/src/raylib.h index 9f06462fb..3206cba18 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1596,6 +1596,8 @@ RLAPI RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3 // Audio Loading and Playing Functions (Module: audio) //------------------------------------------------------------------------------------ typedef void (*AudioCallback)(void *bufferData, unsigned int frames); +typedef void (*AudioThreadEntryCallback)(void); +typedef void (*AudioThreadExitCallback)(void); // Audio device management functions RLAPI void InitAudioDevice(void); // Initialize audio device and context @@ -1675,6 +1677,9 @@ RLAPI void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processo RLAPI void AttachAudioMixedProcessor(AudioCallback processor); // Attach audio stream processor to the entire audio pipeline, receives the samples as 'float' RLAPI void DetachAudioMixedProcessor(AudioCallback processor); // Detach audio stream processor from the entire audio pipeline +RLAPI void SetAudioThreadEntryCallback(AudioThreadEntryCallback callback); // Audio thread creation callback (usually should be called before audio device initialization, can be NULL) +RLAPI void SetAudioThreadExitCallback(AudioThreadExitCallback callback); // Audio thread destruction callback (can be NULL) + #if defined(__cplusplus) } #endif