diff options
author | bonmas14 <bonmas14@gmail.com> | 2025-09-20 22:28:15 +0300 |
---|---|---|
committer | bonmas14 <bonmas14@gmail.com> | 2025-09-20 22:28:15 +0300 |
commit | cdda4c4182c9ee068567529715e4a5c68a8efb58 (patch) | |
tree | 38a63f62a64018a2d35fc33354f8589fd33b7514 /deps/raylib/examples/audio | |
download | c_wizard-cdda4c4182c9ee068567529715e4a5c68a8efb58.tar.gz c_wizard-cdda4c4182c9ee068567529715e4a5c68a8efb58.zip |
Init commit v1.0
Diffstat (limited to 'deps/raylib/examples/audio')
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 Binary files differnew file mode 100644 index 0000000..8575a83 --- /dev/null +++ b/deps/raylib/examples/audio/audio_mixed_processor.png 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 Binary files differnew file mode 100644 index 0000000..63003e0 --- /dev/null +++ b/deps/raylib/examples/audio/audio_module_playing.png 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 Binary files differnew file mode 100644 index 0000000..f8b14e1 --- /dev/null +++ b/deps/raylib/examples/audio/audio_music_stream.png 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 Binary files differnew file mode 100644 index 0000000..344f4a7 --- /dev/null +++ b/deps/raylib/examples/audio/audio_raw_stream.png 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 Binary files differnew file mode 100644 index 0000000..24071ce --- /dev/null +++ b/deps/raylib/examples/audio/audio_sound_loading.png 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 Binary files differnew file mode 100644 index 0000000..d60138d --- /dev/null +++ b/deps/raylib/examples/audio/audio_sound_multi.png 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 Binary files differnew file mode 100644 index 0000000..4aaee8b --- /dev/null +++ b/deps/raylib/examples/audio/audio_stream_effects.png 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 Binary files differnew file mode 100644 index 0000000..ad95bfb --- /dev/null +++ b/deps/raylib/examples/audio/resources/coin.wav diff --git a/deps/raylib/examples/audio/resources/country.mp3 b/deps/raylib/examples/audio/resources/country.mp3 Binary files differnew file mode 100644 index 0000000..91066cc --- /dev/null +++ b/deps/raylib/examples/audio/resources/country.mp3 diff --git a/deps/raylib/examples/audio/resources/mini1111.xm b/deps/raylib/examples/audio/resources/mini1111.xm Binary files differnew file mode 100644 index 0000000..a185c1a --- /dev/null +++ b/deps/raylib/examples/audio/resources/mini1111.xm diff --git a/deps/raylib/examples/audio/resources/sound.wav b/deps/raylib/examples/audio/resources/sound.wav Binary files differnew file mode 100644 index 0000000..b5d01c9 --- /dev/null +++ b/deps/raylib/examples/audio/resources/sound.wav diff --git a/deps/raylib/examples/audio/resources/spring.wav b/deps/raylib/examples/audio/resources/spring.wav Binary files differnew file mode 100644 index 0000000..b6f17f1 --- /dev/null +++ b/deps/raylib/examples/audio/resources/spring.wav diff --git a/deps/raylib/examples/audio/resources/target.flac b/deps/raylib/examples/audio/resources/target.flac Binary files differnew file mode 100644 index 0000000..5fad22c --- /dev/null +++ b/deps/raylib/examples/audio/resources/target.flac diff --git a/deps/raylib/examples/audio/resources/target.ogg b/deps/raylib/examples/audio/resources/target.ogg Binary files differnew file mode 100644 index 0000000..2b73e1c --- /dev/null +++ b/deps/raylib/examples/audio/resources/target.ogg diff --git a/deps/raylib/examples/audio/resources/target.qoa b/deps/raylib/examples/audio/resources/target.qoa Binary files differnew file mode 100644 index 0000000..d48c4f9 --- /dev/null +++ b/deps/raylib/examples/audio/resources/target.qoa diff --git a/deps/raylib/examples/audio/resources/weird.wav b/deps/raylib/examples/audio/resources/weird.wav Binary files differnew file mode 100644 index 0000000..f5c8f55 --- /dev/null +++ b/deps/raylib/examples/audio/resources/weird.wav |