aboutsummaryrefslogtreecommitdiff
path: root/deps/raylib/examples/audio
diff options
context:
space:
mode:
authorbonmas14 <bonmas14@gmail.com>2025-09-20 22:28:15 +0300
committerbonmas14 <bonmas14@gmail.com>2025-09-20 22:28:15 +0300
commitcdda4c4182c9ee068567529715e4a5c68a8efb58 (patch)
tree38a63f62a64018a2d35fc33354f8589fd33b7514 /deps/raylib/examples/audio
downloadc_wizard-cdda4c4182c9ee068567529715e4a5c68a8efb58.tar.gz
c_wizard-cdda4c4182c9ee068567529715e4a5c68a8efb58.zip
Init commit v1.0
Diffstat (limited to 'deps/raylib/examples/audio')
-rw-r--r--deps/raylib/examples/audio/audio_mixed_processor.c123
-rw-r--r--deps/raylib/examples/audio/audio_mixed_processor.pngbin0 -> 8708 bytes
-rw-r--r--deps/raylib/examples/audio/audio_module_playing.c160
-rw-r--r--deps/raylib/examples/audio/audio_module_playing.pngbin0 -> 45137 bytes
-rw-r--r--deps/raylib/examples/audio/audio_music_stream.c98
-rw-r--r--deps/raylib/examples/audio/audio_music_stream.pngbin0 -> 15043 bytes
-rw-r--r--deps/raylib/examples/audio/audio_raw_stream.c214
-rw-r--r--deps/raylib/examples/audio/audio_raw_stream.pngbin0 -> 16736 bytes
-rw-r--r--deps/raylib/examples/audio/audio_sound_loading.c69
-rw-r--r--deps/raylib/examples/audio/audio_sound_loading.pngbin0 -> 15438 bytes
-rw-r--r--deps/raylib/examples/audio/audio_sound_multi.c87
-rw-r--r--deps/raylib/examples/audio/audio_sound_multi.pngbin0 -> 15106 bytes
-rw-r--r--deps/raylib/examples/audio/audio_stream_effects.c183
-rw-r--r--deps/raylib/examples/audio/audio_stream_effects.pngbin0 -> 16323 bytes
-rw-r--r--deps/raylib/examples/audio/resources/LICENSE.md10
-rw-r--r--deps/raylib/examples/audio/resources/coin.wavbin0 -> 18114 bytes
-rw-r--r--deps/raylib/examples/audio/resources/country.mp3bin0 -> 1497964 bytes
-rw-r--r--deps/raylib/examples/audio/resources/mini1111.xmbin0 -> 25676 bytes
-rw-r--r--deps/raylib/examples/audio/resources/sound.wavbin0 -> 97512 bytes
-rw-r--r--deps/raylib/examples/audio/resources/spring.wavbin0 -> 31262 bytes
-rw-r--r--deps/raylib/examples/audio/resources/target.flacbin0 -> 56973 bytes
-rw-r--r--deps/raylib/examples/audio/resources/target.oggbin0 -> 13384 bytes
-rw-r--r--deps/raylib/examples/audio/resources/target.qoabin0 -> 35648 bytes
-rw-r--r--deps/raylib/examples/audio/resources/weird.wavbin0 -> 24388 bytes
24 files changed, 944 insertions, 0 deletions
diff --git a/deps/raylib/examples/audio/audio_mixed_processor.c b/deps/raylib/examples/audio/audio_mixed_processor.c
new file mode 100644
index 0000000..df46edc
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_mixed_processor.c
@@ -0,0 +1,123 @@
+/*******************************************************************************************
+*
+* raylib [audio] example - Mixed audio processing
+*
+* Example originally created with raylib 4.2, last time updated with raylib 4.2
+*
+* Example contributed by hkc (@hatkidchan) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2023 hkc (@hatkidchan)
+*
+********************************************************************************************/
+#include "raylib.h"
+#include <math.h>
+
+static float exponent = 1.0f; // Audio exponentiation value
+static float averageVolume[400] = { 0.0f }; // Average volume history
+
+//------------------------------------------------------------------------------------
+// Audio processing function
+//------------------------------------------------------------------------------------
+void ProcessAudio(void *buffer, unsigned int frames)
+{
+ float *samples = (float *)buffer; // Samples internally stored as <float>s
+ float average = 0.0f; // Temporary average volume
+
+ for (unsigned int frame = 0; frame < frames; frame++)
+ {
+ float *left = &samples[frame * 2 + 0], *right = &samples[frame * 2 + 1];
+
+ *left = powf(fabsf(*left), exponent) * ( (*left < 0.0f)? -1.0f : 1.0f );
+ *right = powf(fabsf(*right), exponent) * ( (*right < 0.0f)? -1.0f : 1.0f );
+
+ average += fabsf(*left) / frames; // accumulating average volume
+ average += fabsf(*right) / frames;
+ }
+
+ // Moving history to the left
+ for (int i = 0; i < 399; i++) averageVolume[i] = averageVolume[i + 1];
+
+ averageVolume[399] = average; // Adding last average value
+}
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [audio] example - processing mixed output");
+
+ InitAudioDevice(); // Initialize audio device
+
+ AttachAudioMixedProcessor(ProcessAudio);
+
+ Music music = LoadMusicStream("resources/country.mp3");
+ Sound sound = LoadSound("resources/coin.wav");
+
+ PlayMusicStream(music);
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateMusicStream(music); // Update music buffer with new stream data
+
+ // Modify processing variables
+ //----------------------------------------------------------------------------------
+ if (IsKeyPressed(KEY_LEFT)) exponent -= 0.05f;
+ if (IsKeyPressed(KEY_RIGHT)) exponent += 0.05f;
+
+ if (exponent <= 0.5f) exponent = 0.5f;
+ if (exponent >= 3.0f) exponent = 3.0f;
+
+ if (IsKeyPressed(KEY_SPACE)) PlaySound(sound);
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText("MUSIC SHOULD BE PLAYING!", 255, 150, 20, LIGHTGRAY);
+
+ DrawText(TextFormat("EXPONENT = %.2f", exponent), 215, 180, 20, LIGHTGRAY);
+
+ DrawRectangle(199, 199, 402, 34, LIGHTGRAY);
+ for (int i = 0; i < 400; i++)
+ {
+ DrawLine(201 + i, 232 - (int)(averageVolume[i] * 32), 201 + i, 232, MAROON);
+ }
+ DrawRectangleLines(199, 199, 402, 34, GRAY);
+
+ DrawText("PRESS SPACE TO PLAY OTHER SOUND", 200, 250, 20, LIGHTGRAY);
+ DrawText("USE LEFT AND RIGHT ARROWS TO ALTER DISTORTION", 140, 280, 20, LIGHTGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadMusicStream(music); // Unload music stream buffers from RAM
+
+ DetachAudioMixedProcessor(ProcessAudio); // Disconnect audio processor
+
+ CloseAudioDevice(); // Close audio device (music streaming is automatically stopped)
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/audio/audio_mixed_processor.png b/deps/raylib/examples/audio/audio_mixed_processor.png
new file mode 100644
index 0000000..8575a83
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_mixed_processor.png
Binary files differ
diff --git a/deps/raylib/examples/audio/audio_module_playing.c b/deps/raylib/examples/audio/audio_module_playing.c
new file mode 100644
index 0000000..6234f0e
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_module_playing.c
@@ -0,0 +1,160 @@
+/*******************************************************************************************
+*
+* raylib [audio] example - Module playing (streaming)
+*
+* Example originally created with raylib 1.5, last time updated with raylib 3.5
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2016-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#define MAX_CIRCLES 64
+
+typedef struct {
+ Vector2 position;
+ float radius;
+ float alpha;
+ float speed;
+ Color color;
+} CircleWave;
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ SetConfigFlags(FLAG_MSAA_4X_HINT); // NOTE: Try to enable MSAA 4X
+
+ InitWindow(screenWidth, screenHeight, "raylib [audio] example - module playing (streaming)");
+
+ InitAudioDevice(); // Initialize audio device
+
+ Color colors[14] = { ORANGE, RED, GOLD, LIME, BLUE, VIOLET, BROWN, LIGHTGRAY, PINK,
+ YELLOW, GREEN, SKYBLUE, PURPLE, BEIGE };
+
+ // Creates some circles for visual effect
+ CircleWave circles[MAX_CIRCLES] = { 0 };
+
+ for (int i = MAX_CIRCLES - 1; i >= 0; i--)
+ {
+ circles[i].alpha = 0.0f;
+ circles[i].radius = (float)GetRandomValue(10, 40);
+ circles[i].position.x = (float)GetRandomValue((int)circles[i].radius, (int)(screenWidth - circles[i].radius));
+ circles[i].position.y = (float)GetRandomValue((int)circles[i].radius, (int)(screenHeight - circles[i].radius));
+ circles[i].speed = (float)GetRandomValue(1, 100)/2000.0f;
+ circles[i].color = colors[GetRandomValue(0, 13)];
+ }
+
+ Music music = LoadMusicStream("resources/mini1111.xm");
+ music.looping = false;
+ float pitch = 1.0f;
+
+ PlayMusicStream(music);
+
+ float timePlayed = 0.0f;
+ bool pause = false;
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateMusicStream(music); // Update music buffer with new stream data
+
+ // Restart music playing (stop and play)
+ if (IsKeyPressed(KEY_SPACE))
+ {
+ StopMusicStream(music);
+ PlayMusicStream(music);
+ pause = false;
+ }
+
+ // Pause/Resume music playing
+ if (IsKeyPressed(KEY_P))
+ {
+ pause = !pause;
+
+ if (pause) PauseMusicStream(music);
+ else ResumeMusicStream(music);
+ }
+
+ if (IsKeyDown(KEY_DOWN)) pitch -= 0.01f;
+ else if (IsKeyDown(KEY_UP)) pitch += 0.01f;
+
+ SetMusicPitch(music, pitch);
+
+ // Get timePlayed scaled to bar dimensions
+ timePlayed = GetMusicTimePlayed(music)/GetMusicTimeLength(music)*(screenWidth - 40);
+
+ // Color circles animation
+ for (int i = MAX_CIRCLES - 1; (i >= 0) && !pause; i--)
+ {
+ circles[i].alpha += circles[i].speed;
+ circles[i].radius += circles[i].speed*10.0f;
+
+ if (circles[i].alpha > 1.0f) circles[i].speed *= -1;
+
+ if (circles[i].alpha <= 0.0f)
+ {
+ circles[i].alpha = 0.0f;
+ circles[i].radius = (float)GetRandomValue(10, 40);
+ circles[i].position.x = (float)GetRandomValue((int)circles[i].radius, (int)(screenWidth - circles[i].radius));
+ circles[i].position.y = (float)GetRandomValue((int)circles[i].radius, (int)(screenHeight - circles[i].radius));
+ circles[i].color = colors[GetRandomValue(0, 13)];
+ circles[i].speed = (float)GetRandomValue(1, 100)/2000.0f;
+ }
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ for (int i = MAX_CIRCLES - 1; i >= 0; i--)
+ {
+ DrawCircleV(circles[i].position, circles[i].radius, Fade(circles[i].color, circles[i].alpha));
+ }
+
+ // Draw time bar
+ DrawRectangle(20, screenHeight - 20 - 12, screenWidth - 40, 12, LIGHTGRAY);
+ DrawRectangle(20, screenHeight - 20 - 12, (int)timePlayed, 12, MAROON);
+ DrawRectangleLines(20, screenHeight - 20 - 12, screenWidth - 40, 12, GRAY);
+
+ // Draw help instructions
+ DrawRectangle(20, 20, 425, 145, WHITE);
+ DrawRectangleLines(20, 20, 425, 145, GRAY);
+ DrawText("PRESS SPACE TO RESTART MUSIC", 40, 40, 20, BLACK);
+ DrawText("PRESS P TO PAUSE/RESUME", 40, 70, 20, BLACK);
+ DrawText("PRESS UP/DOWN TO CHANGE SPEED", 40, 100, 20, BLACK);
+ DrawText(TextFormat("SPEED: %f", pitch), 40, 130, 20, MAROON);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadMusicStream(music); // Unload music stream buffers from RAM
+
+ CloseAudioDevice(); // Close audio device (music streaming is automatically stopped)
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/audio/audio_module_playing.png b/deps/raylib/examples/audio/audio_module_playing.png
new file mode 100644
index 0000000..63003e0
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_module_playing.png
Binary files differ
diff --git a/deps/raylib/examples/audio/audio_music_stream.c b/deps/raylib/examples/audio/audio_music_stream.c
new file mode 100644
index 0000000..bdf141e
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_music_stream.c
@@ -0,0 +1,98 @@
+/*******************************************************************************************
+*
+* raylib [audio] example - Music playing (streaming)
+*
+* Example originally created with raylib 1.3, last time updated with raylib 4.0
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2015-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [audio] example - music playing (streaming)");
+
+ InitAudioDevice(); // Initialize audio device
+
+ Music music = LoadMusicStream("resources/country.mp3");
+
+ PlayMusicStream(music);
+
+ float timePlayed = 0.0f; // Time played normalized [0.0f..1.0f]
+ bool pause = false; // Music playing paused
+
+ SetTargetFPS(30); // Set our game to run at 30 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateMusicStream(music); // Update music buffer with new stream data
+
+ // Restart music playing (stop and play)
+ if (IsKeyPressed(KEY_SPACE))
+ {
+ StopMusicStream(music);
+ PlayMusicStream(music);
+ }
+
+ // Pause/Resume music playing
+ if (IsKeyPressed(KEY_P))
+ {
+ pause = !pause;
+
+ if (pause) PauseMusicStream(music);
+ else ResumeMusicStream(music);
+ }
+
+ // Get normalized time played for current music stream
+ timePlayed = GetMusicTimePlayed(music)/GetMusicTimeLength(music);
+
+ if (timePlayed > 1.0f) timePlayed = 1.0f; // Make sure time played is no longer than music
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText("MUSIC SHOULD BE PLAYING!", 255, 150, 20, LIGHTGRAY);
+
+ DrawRectangle(200, 200, 400, 12, LIGHTGRAY);
+ DrawRectangle(200, 200, (int)(timePlayed*400.0f), 12, MAROON);
+ DrawRectangleLines(200, 200, 400, 12, GRAY);
+
+ DrawText("PRESS SPACE TO RESTART MUSIC", 215, 250, 20, LIGHTGRAY);
+ DrawText("PRESS P TO PAUSE/RESUME MUSIC", 208, 280, 20, LIGHTGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadMusicStream(music); // Unload music stream buffers from RAM
+
+ CloseAudioDevice(); // Close audio device (music streaming is automatically stopped)
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/audio/audio_music_stream.png b/deps/raylib/examples/audio/audio_music_stream.png
new file mode 100644
index 0000000..f8b14e1
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_music_stream.png
Binary files differ
diff --git a/deps/raylib/examples/audio/audio_raw_stream.c b/deps/raylib/examples/audio/audio_raw_stream.c
new file mode 100644
index 0000000..0b79542
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_raw_stream.c
@@ -0,0 +1,214 @@
+/*******************************************************************************************
+*
+* raylib [audio] example - Raw audio streaming
+*
+* Example originally created with raylib 1.6, last time updated with raylib 4.2
+*
+* Example created by Ramon Santamaria (@raysan5) and reviewed by James Hofmann (@triplefox)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2015-2024 Ramon Santamaria (@raysan5) and James Hofmann (@triplefox)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include <stdlib.h> // Required for: malloc(), free()
+#include <math.h> // Required for: sinf()
+#include <string.h> // Required for: memcpy()
+
+#define MAX_SAMPLES 512
+#define MAX_SAMPLES_PER_UPDATE 4096
+
+// Cycles per second (hz)
+float frequency = 440.0f;
+
+// Audio frequency, for smoothing
+float audioFrequency = 440.0f;
+
+// Previous value, used to test if sine needs to be rewritten, and to smoothly modulate frequency
+float oldFrequency = 1.0f;
+
+// Index for audio rendering
+float sineIdx = 0.0f;
+
+// Audio input processing callback
+void AudioInputCallback(void *buffer, unsigned int frames)
+{
+ audioFrequency = frequency + (audioFrequency - frequency)*0.95f;
+
+ float incr = audioFrequency/44100.0f;
+ short *d = (short *)buffer;
+
+ for (unsigned int i = 0; i < frames; i++)
+ {
+ d[i] = (short)(32000.0f*sinf(2*PI*sineIdx));
+ sineIdx += incr;
+ if (sineIdx > 1.0f) sineIdx -= 1.0f;
+ }
+}
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [audio] example - raw audio streaming");
+
+ InitAudioDevice(); // Initialize audio device
+
+ SetAudioStreamBufferSizeDefault(MAX_SAMPLES_PER_UPDATE);
+
+ // Init raw audio stream (sample rate: 44100, sample size: 16bit-short, channels: 1-mono)
+ AudioStream stream = LoadAudioStream(44100, 16, 1);
+
+ SetAudioStreamCallback(stream, AudioInputCallback);
+
+ // Buffer for the single cycle waveform we are synthesizing
+ short *data = (short *)malloc(sizeof(short)*MAX_SAMPLES);
+
+ // Frame buffer, describing the waveform when repeated over the course of a frame
+ short *writeBuf = (short *)malloc(sizeof(short)*MAX_SAMPLES_PER_UPDATE);
+
+ PlayAudioStream(stream); // Start processing stream buffer (no data loaded currently)
+
+ // Position read in to determine next frequency
+ Vector2 mousePosition = { -100.0f, -100.0f };
+
+ /*
+ // Cycles per second (hz)
+ float frequency = 440.0f;
+
+ // Previous value, used to test if sine needs to be rewritten, and to smoothly modulate frequency
+ float oldFrequency = 1.0f;
+
+ // Cursor to read and copy the samples of the sine wave buffer
+ int readCursor = 0;
+ */
+
+ // Computed size in samples of the sine wave
+ int waveLength = 1;
+
+ Vector2 position = { 0, 0 };
+
+ SetTargetFPS(30); // Set our game to run at 30 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+
+ // Sample mouse input.
+ mousePosition = GetMousePosition();
+
+ if (IsMouseButtonDown(MOUSE_BUTTON_LEFT))
+ {
+ float fp = (float)(mousePosition.y);
+ frequency = 40.0f + (float)(fp);
+
+ float pan = (float)(mousePosition.x) / (float)screenWidth;
+ SetAudioStreamPan(stream, pan);
+ }
+
+ // Rewrite the sine wave
+ // Compute two cycles to allow the buffer padding, simplifying any modulation, resampling, etc.
+ if (frequency != oldFrequency)
+ {
+ // Compute wavelength. Limit size in both directions.
+ //int oldWavelength = waveLength;
+ waveLength = (int)(22050/frequency);
+ if (waveLength > MAX_SAMPLES/2) waveLength = MAX_SAMPLES/2;
+ if (waveLength < 1) waveLength = 1;
+
+ // Write sine wave
+ for (int i = 0; i < waveLength*2; i++)
+ {
+ data[i] = (short)(sinf(((2*PI*(float)i/waveLength)))*32000);
+ }
+ // Make sure the rest of the line is flat
+ for (int j = waveLength*2; j < MAX_SAMPLES; j++)
+ {
+ data[j] = (short)0;
+ }
+
+ // Scale read cursor's position to minimize transition artifacts
+ //readCursor = (int)(readCursor * ((float)waveLength / (float)oldWavelength));
+ oldFrequency = frequency;
+ }
+
+ /*
+ // Refill audio stream if required
+ if (IsAudioStreamProcessed(stream))
+ {
+ // Synthesize a buffer that is exactly the requested size
+ int writeCursor = 0;
+
+ while (writeCursor < MAX_SAMPLES_PER_UPDATE)
+ {
+ // Start by trying to write the whole chunk at once
+ int writeLength = MAX_SAMPLES_PER_UPDATE-writeCursor;
+
+ // Limit to the maximum readable size
+ int readLength = waveLength-readCursor;
+
+ if (writeLength > readLength) writeLength = readLength;
+
+ // Write the slice
+ memcpy(writeBuf + writeCursor, data + readCursor, writeLength*sizeof(short));
+
+ // Update cursors and loop audio
+ readCursor = (readCursor + writeLength) % waveLength;
+
+ writeCursor += writeLength;
+ }
+
+ // Copy finished frame to audio stream
+ UpdateAudioStream(stream, writeBuf, MAX_SAMPLES_PER_UPDATE);
+ }
+ */
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText(TextFormat("sine frequency: %i",(int)frequency), GetScreenWidth() - 220, 10, 20, RED);
+ DrawText("click mouse button to change frequency or pan", 10, 10, 20, DARKGRAY);
+
+ // Draw the current buffer state proportionate to the screen
+ for (int i = 0; i < screenWidth; i++)
+ {
+ position.x = (float)i;
+ position.y = 250 + 50*data[i*MAX_SAMPLES/screenWidth]/32000.0f;
+
+ DrawPixelV(position, RED);
+ }
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ free(data); // Unload sine wave data
+ free(writeBuf); // Unload write buffer
+
+ UnloadAudioStream(stream); // Close raw audio stream and delete buffers from RAM
+ CloseAudioDevice(); // Close audio device (music streaming is automatically stopped)
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/deps/raylib/examples/audio/audio_raw_stream.png b/deps/raylib/examples/audio/audio_raw_stream.png
new file mode 100644
index 0000000..344f4a7
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_raw_stream.png
Binary files differ
diff --git a/deps/raylib/examples/audio/audio_sound_loading.c b/deps/raylib/examples/audio/audio_sound_loading.c
new file mode 100644
index 0000000..41aa216
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_sound_loading.c
@@ -0,0 +1,69 @@
+/*******************************************************************************************
+*
+* raylib [audio] example - Sound loading and playing
+*
+* Example originally created with raylib 1.1, last time updated with raylib 3.5
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2014-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [audio] example - sound loading and playing");
+
+ InitAudioDevice(); // Initialize audio device
+
+ Sound fxWav = LoadSound("resources/sound.wav"); // Load WAV audio file
+ Sound fxOgg = LoadSound("resources/target.ogg"); // Load OGG audio file
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ if (IsKeyPressed(KEY_SPACE)) PlaySound(fxWav); // Play WAV sound
+ if (IsKeyPressed(KEY_ENTER)) PlaySound(fxOgg); // Play OGG sound
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText("Press SPACE to PLAY the WAV sound!", 200, 180, 20, LIGHTGRAY);
+ DrawText("Press ENTER to PLAY the OGG sound!", 200, 220, 20, LIGHTGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadSound(fxWav); // Unload sound data
+ UnloadSound(fxOgg); // Unload sound data
+
+ CloseAudioDevice(); // Close audio device
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/audio/audio_sound_loading.png b/deps/raylib/examples/audio/audio_sound_loading.png
new file mode 100644
index 0000000..24071ce
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_sound_loading.png
Binary files differ
diff --git a/deps/raylib/examples/audio/audio_sound_multi.c b/deps/raylib/examples/audio/audio_sound_multi.c
new file mode 100644
index 0000000..d5472ef
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_sound_multi.c
@@ -0,0 +1,87 @@
+/*******************************************************************************************
+*
+* raylib [audio] example - Playing sound multiple times
+*
+* Example originally created with raylib 4.6
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2023 Jeffery Myers (@JeffM2501)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#define MAX_SOUNDS 10
+Sound soundArray[MAX_SOUNDS] = { 0 };
+int currentSound;
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [audio] example - playing sound multiple times");
+
+ InitAudioDevice(); // Initialize audio device
+
+ // load the sound list
+ soundArray[0] = LoadSound("resources/sound.wav"); // Load WAV audio file into the first slot as the 'source' sound
+ // this sound owns the sample data
+ for (int i = 1; i < MAX_SOUNDS; i++)
+ {
+ soundArray[i] = LoadSoundAlias(soundArray[0]); // Load an alias of the sound into slots 1-9. These do not own the sound data, but can be played
+ }
+ currentSound = 0; // set the sound list to the start
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ if (IsKeyPressed(KEY_SPACE))
+ {
+ PlaySound(soundArray[currentSound]); // play the next open sound slot
+ currentSound++; // increment the sound slot
+ if (currentSound >= MAX_SOUNDS) // if the sound slot is out of bounds, go back to 0
+ currentSound = 0;
+
+ // Note: a better way would be to look at the list for the first sound that is not playing and use that slot
+ }
+
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText("Press SPACE to PLAY a WAV sound!", 200, 180, 20, LIGHTGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ for (int i = 1; i < MAX_SOUNDS; i++)
+ UnloadSoundAlias(soundArray[i]); // Unload sound aliases
+ UnloadSound(soundArray[0]); // Unload source sound data
+
+ CloseAudioDevice(); // Close audio device
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/audio/audio_sound_multi.png b/deps/raylib/examples/audio/audio_sound_multi.png
new file mode 100644
index 0000000..d60138d
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_sound_multi.png
Binary files differ
diff --git a/deps/raylib/examples/audio/audio_stream_effects.c b/deps/raylib/examples/audio/audio_stream_effects.c
new file mode 100644
index 0000000..cc8273a
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_stream_effects.c
@@ -0,0 +1,183 @@
+/*******************************************************************************************
+*
+* raylib [audio] example - Music stream processing effects
+*
+* Example originally created with raylib 4.2, last time updated with raylib 5.0
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2022-2024 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include <stdlib.h> // Required for: NULL
+
+// Required delay effect variables
+static float *delayBuffer = NULL;
+static unsigned int delayBufferSize = 0;
+static unsigned int delayReadIndex = 2;
+static unsigned int delayWriteIndex = 0;
+
+//------------------------------------------------------------------------------------
+// Module Functions Declaration
+//------------------------------------------------------------------------------------
+static void AudioProcessEffectLPF(void *buffer, unsigned int frames); // Audio effect: lowpass filter
+static void AudioProcessEffectDelay(void *buffer, unsigned int frames); // Audio effect: delay
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [audio] example - stream effects");
+
+ InitAudioDevice(); // Initialize audio device
+
+ Music music = LoadMusicStream("resources/country.mp3");
+
+ // Allocate buffer for the delay effect
+ delayBufferSize = 48000*2; // 1 second delay (device sampleRate*channels)
+ delayBuffer = (float *)RL_CALLOC(delayBufferSize, sizeof(float));
+
+ PlayMusicStream(music);
+
+ float timePlayed = 0.0f; // Time played normalized [0.0f..1.0f]
+ bool pause = false; // Music playing paused
+
+ bool enableEffectLPF = false; // Enable effect low-pass-filter
+ bool enableEffectDelay = false; // Enable effect delay (1 second)
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateMusicStream(music); // Update music buffer with new stream data
+
+ // Restart music playing (stop and play)
+ if (IsKeyPressed(KEY_SPACE))
+ {
+ StopMusicStream(music);
+ PlayMusicStream(music);
+ }
+
+ // Pause/Resume music playing
+ if (IsKeyPressed(KEY_P))
+ {
+ pause = !pause;
+
+ if (pause) PauseMusicStream(music);
+ else ResumeMusicStream(music);
+ }
+
+ // Add/Remove effect: lowpass filter
+ if (IsKeyPressed(KEY_F))
+ {
+ enableEffectLPF = !enableEffectLPF;
+ if (enableEffectLPF) AttachAudioStreamProcessor(music.stream, AudioProcessEffectLPF);
+ else DetachAudioStreamProcessor(music.stream, AudioProcessEffectLPF);
+ }
+
+ // Add/Remove effect: delay
+ if (IsKeyPressed(KEY_D))
+ {
+ enableEffectDelay = !enableEffectDelay;
+ if (enableEffectDelay) AttachAudioStreamProcessor(music.stream, AudioProcessEffectDelay);
+ else DetachAudioStreamProcessor(music.stream, AudioProcessEffectDelay);
+ }
+
+ // Get normalized time played for current music stream
+ timePlayed = GetMusicTimePlayed(music)/GetMusicTimeLength(music);
+
+ if (timePlayed > 1.0f) timePlayed = 1.0f; // Make sure time played is no longer than music
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ DrawText("MUSIC SHOULD BE PLAYING!", 245, 150, 20, LIGHTGRAY);
+
+ DrawRectangle(200, 180, 400, 12, LIGHTGRAY);
+ DrawRectangle(200, 180, (int)(timePlayed*400.0f), 12, MAROON);
+ DrawRectangleLines(200, 180, 400, 12, GRAY);
+
+ DrawText("PRESS SPACE TO RESTART MUSIC", 215, 230, 20, LIGHTGRAY);
+ DrawText("PRESS P TO PAUSE/RESUME MUSIC", 208, 260, 20, LIGHTGRAY);
+
+ DrawText(TextFormat("PRESS F TO TOGGLE LPF EFFECT: %s", enableEffectLPF? "ON" : "OFF"), 200, 320, 20, GRAY);
+ DrawText(TextFormat("PRESS D TO TOGGLE DELAY EFFECT: %s", enableEffectDelay? "ON" : "OFF"), 180, 350, 20, GRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadMusicStream(music); // Unload music stream buffers from RAM
+
+ CloseAudioDevice(); // Close audio device (music streaming is automatically stopped)
+
+ RL_FREE(delayBuffer); // Free delay buffer
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------------
+// Module Functions Definition
+//------------------------------------------------------------------------------------
+// Audio effect: lowpass filter
+static void AudioProcessEffectLPF(void *buffer, unsigned int frames)
+{
+ static float low[2] = { 0.0f, 0.0f };
+ static const float cutoff = 70.0f / 44100.0f; // 70 Hz lowpass filter
+ const float k = cutoff / (cutoff + 0.1591549431f); // RC filter formula
+
+ // Converts the buffer data before using it
+ float *bufferData = (float *)buffer;
+ for (unsigned int i = 0; i < frames*2; i += 2)
+ {
+ const float l = bufferData[i];
+ const float r = bufferData[i + 1];
+
+ low[0] += k * (l - low[0]);
+ low[1] += k * (r - low[1]);
+ bufferData[i] = low[0];
+ bufferData[i + 1] = low[1];
+ }
+}
+
+// Audio effect: delay
+static void AudioProcessEffectDelay(void *buffer, unsigned int frames)
+{
+ for (unsigned int i = 0; i < frames*2; i += 2)
+ {
+ float leftDelay = delayBuffer[delayReadIndex++]; // ERROR: Reading buffer -> WHY??? Maybe thread related???
+ float rightDelay = delayBuffer[delayReadIndex++];
+
+ if (delayReadIndex == delayBufferSize) delayReadIndex = 0;
+
+ ((float *)buffer)[i] = 0.5f*((float *)buffer)[i] + 0.5f*leftDelay;
+ ((float *)buffer)[i + 1] = 0.5f*((float *)buffer)[i + 1] + 0.5f*rightDelay;
+
+ delayBuffer[delayWriteIndex++] = ((float *)buffer)[i];
+ delayBuffer[delayWriteIndex++] = ((float *)buffer)[i + 1];
+ if (delayWriteIndex == delayBufferSize) delayWriteIndex = 0;
+ }
+}
diff --git a/deps/raylib/examples/audio/audio_stream_effects.png b/deps/raylib/examples/audio/audio_stream_effects.png
new file mode 100644
index 0000000..4aaee8b
--- /dev/null
+++ b/deps/raylib/examples/audio/audio_stream_effects.png
Binary files differ
diff --git a/deps/raylib/examples/audio/resources/LICENSE.md b/deps/raylib/examples/audio/resources/LICENSE.md
new file mode 100644
index 0000000..67e6584
--- /dev/null
+++ b/deps/raylib/examples/audio/resources/LICENSE.md
@@ -0,0 +1,10 @@
+| resource | author | licence | notes |
+| :------------------- | :---------: | :------ | :---- |
+| country.mp3 | [@emegeme](https://github.com/emegeme) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Originally created for "DART that TARGET" game |
+| target.ogg | [@emegeme](https://github.com/emegeme) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Originally created for "DART that TARGET" game |
+| target.flac | [@emegeme](https://github.com/emegeme) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Originally created for "DART that TARGET" game |
+| coin.wav | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Made with [rFXGen](https://raylibtech.itch.io/rfxgen) |
+| sound.wav | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Made with [rFXGen](https://raylibtech.itch.io/rfxgen) |
+| spring.wav | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Made with [rFXGen](https://raylibtech.itch.io/rfxgen) |
+| weird.wav | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Made with [rFXGen](https://raylibtech.itch.io/rfxgen) |
+| mini1111.xm | [tPORt](https://modarchive.org/index.php?request=view_by_moduleid&query=51891) | [Mod Archive Distribution license](https://modarchive.org/index.php?terms-upload) | - |
diff --git a/deps/raylib/examples/audio/resources/coin.wav b/deps/raylib/examples/audio/resources/coin.wav
new file mode 100644
index 0000000..ad95bfb
--- /dev/null
+++ b/deps/raylib/examples/audio/resources/coin.wav
Binary files differ
diff --git a/deps/raylib/examples/audio/resources/country.mp3 b/deps/raylib/examples/audio/resources/country.mp3
new file mode 100644
index 0000000..91066cc
--- /dev/null
+++ b/deps/raylib/examples/audio/resources/country.mp3
Binary files differ
diff --git a/deps/raylib/examples/audio/resources/mini1111.xm b/deps/raylib/examples/audio/resources/mini1111.xm
new file mode 100644
index 0000000..a185c1a
--- /dev/null
+++ b/deps/raylib/examples/audio/resources/mini1111.xm
Binary files differ
diff --git a/deps/raylib/examples/audio/resources/sound.wav b/deps/raylib/examples/audio/resources/sound.wav
new file mode 100644
index 0000000..b5d01c9
--- /dev/null
+++ b/deps/raylib/examples/audio/resources/sound.wav
Binary files differ
diff --git a/deps/raylib/examples/audio/resources/spring.wav b/deps/raylib/examples/audio/resources/spring.wav
new file mode 100644
index 0000000..b6f17f1
--- /dev/null
+++ b/deps/raylib/examples/audio/resources/spring.wav
Binary files differ
diff --git a/deps/raylib/examples/audio/resources/target.flac b/deps/raylib/examples/audio/resources/target.flac
new file mode 100644
index 0000000..5fad22c
--- /dev/null
+++ b/deps/raylib/examples/audio/resources/target.flac
Binary files differ
diff --git a/deps/raylib/examples/audio/resources/target.ogg b/deps/raylib/examples/audio/resources/target.ogg
new file mode 100644
index 0000000..2b73e1c
--- /dev/null
+++ b/deps/raylib/examples/audio/resources/target.ogg
Binary files differ
diff --git a/deps/raylib/examples/audio/resources/target.qoa b/deps/raylib/examples/audio/resources/target.qoa
new file mode 100644
index 0000000..d48c4f9
--- /dev/null
+++ b/deps/raylib/examples/audio/resources/target.qoa
Binary files differ
diff --git a/deps/raylib/examples/audio/resources/weird.wav b/deps/raylib/examples/audio/resources/weird.wav
new file mode 100644
index 0000000..f5c8f55
--- /dev/null
+++ b/deps/raylib/examples/audio/resources/weird.wav
Binary files differ