summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJeffery Myers <[email protected]>2023-08-04 07:40:10 -0700
committerGitHub <[email protected]>2023-08-04 16:40:10 +0200
commit601cadbae6a7561d2114de891f374a2d9f2f497e (patch)
tree4427068233222fcdcd05524623c3a9f54e2f9107
parentd3058fe58972b80684591237c6358104f9e28ba0 (diff)
downloadraylib-601cadbae6a7561d2114de891f374a2d9f2f497e.tar.gz
raylib-601cadbae6a7561d2114de891f374a2d9f2f497e.zip
[AUDIO] Add a function to make an alias of a sound and share it's sample data (#3219)
* Add a function to clone a sound and share data with another sound. * rename items based on feedback * PR Feedback, use custom unload for sound alias, not variant of normal sound unloading
-rw-r--r--src/raudio.c37
-rw-r--r--src/raylib.h2
2 files changed, 39 insertions, 0 deletions
diff --git a/src/raudio.c b/src/raudio.c
index 5e2ccf99..5f84688d 100644
--- a/src/raudio.c
+++ b/src/raudio.c
@@ -916,6 +916,32 @@ Sound LoadSoundFromWave(Wave wave)
return sound;
}
+// Clone sound from existing sound data, clone does not own wave data
+// Wave data must
+// NOTE: Wave data must be unallocated manually and will be shared across all clones
+Sound LoadSoundAlias(Sound source)
+{
+ Sound sound = { 0 };
+
+ if (source.stream.buffer->data != NULL)
+ {
+ AudioBuffer* audioBuffer = LoadAudioBuffer(AUDIO_DEVICE_FORMAT, AUDIO_DEVICE_CHANNELS, AUDIO.System.device.sampleRate, source.frameCount, AUDIO_BUFFER_USAGE_STATIC);
+ if (audioBuffer == NULL)
+ {
+ TRACELOG(LOG_WARNING, "SOUND: Failed to create buffer");
+ return sound; // early return to avoid dereferencing the audioBuffer null pointer
+ }
+ audioBuffer->data = source.stream.buffer->data;
+ sound.frameCount = source.frameCount;
+ sound.stream.sampleRate = AUDIO.System.device.sampleRate;
+ sound.stream.sampleSize = 32;
+ sound.stream.channels = AUDIO_DEVICE_CHANNELS;
+ sound.stream.buffer = audioBuffer;
+ }
+
+ return sound;
+}
+
// Checks if a sound is ready
bool IsSoundReady(Sound sound)
{
@@ -940,6 +966,17 @@ void UnloadSound(Sound sound)
//TRACELOG(LOG_INFO, "SOUND: Unloaded sound data from RAM");
}
+void UnloadSoundAlias(Sound alias)
+{
+ // untrack and unload just the sound buffer, not the sample data, it is shared with the source for the alias
+ if (alias.stream.buffer != NULL)
+ {
+ ma_data_converter_uninit(&alias.stream.buffer->converter, NULL);
+ UntrackAudioBuffer(alias.stream.buffer);
+ RL_FREE(alias.stream.buffer);
+ }
+}
+
// Update sound buffer with new data
void UpdateSound(Sound sound, const void *data, int sampleCount)
{
diff --git a/src/raylib.h b/src/raylib.h
index 8b5a8070..a49e19a5 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -1533,10 +1533,12 @@ RLAPI Wave LoadWaveFromMemory(const char *fileType, const unsigned char *fileDat
RLAPI bool IsWaveReady(Wave wave); // Checks if wave data is ready
RLAPI Sound LoadSound(const char *fileName); // Load sound from file
RLAPI Sound LoadSoundFromWave(Wave wave); // Load sound from wave data
+RLAPI Sound LoadSoundAlias(Sound source); // Create a new sound that shares the same sample data as the source sound, does not own the sound data
RLAPI bool IsSoundReady(Sound sound); // Checks if a sound is ready
RLAPI void UpdateSound(Sound sound, const void *data, int sampleCount); // Update sound buffer with new data
RLAPI void UnloadWave(Wave wave); // Unload wave data
RLAPI void UnloadSound(Sound sound); // Unload sound
+RLAPI void UnloadSoundAlias(Sound alias); // Unload a sound alias (does not deallocate sample data)
RLAPI bool ExportWave(Wave wave, const char *fileName); // Export wave data to file, returns true on success
RLAPI bool ExportWaveAsCode(Wave wave, const char *fileName); // Export wave sample data to code (.h), returns true on success