diff options
| author | Ray <[email protected]> | 2022-03-30 20:13:02 +0200 |
|---|---|---|
| committer | Ray <[email protected]> | 2022-03-30 20:13:02 +0200 |
| commit | 1612ba63ab66b2f875fe6aca70e5fabea6b578ca (patch) | |
| tree | e9aad3e8d84c5f53dff0610de7bd7c729b89ef23 /examples/audio | |
| parent | 90fc7c0376f39d7b19d632e1d69dec715ec3f2a8 (diff) | |
| download | raylib-1612ba63ab66b2f875fe6aca70e5fabea6b578ca.tar.gz raylib-1612ba63ab66b2f875fe6aca70e5fabea6b578ca.zip | |
ADDED: Audio stream processors support -WIP- #2212
This feature is still under consideration/testing and it doesn't work properly, at least the Delay Effect processor.
Diffstat (limited to 'examples/audio')
| -rw-r--r-- | examples/audio/audio_music_stream.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/examples/audio/audio_music_stream.c b/examples/audio/audio_music_stream.c index 22db3dd8..30a13c0d 100644 --- a/examples/audio/audio_music_stream.c +++ b/examples/audio/audio_music_stream.c @@ -11,6 +11,47 @@ #include "raylib.h" +// Audio effect: lowpass filter +static void AudioProcessEffectLPF(float *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 + + for (unsigned int i = 0; i < frames*2; i += 2) + { + float l = buffer[i], r = buffer[i + 1]; + low[0] += k * (l - low[0]); + low[1] += k * (r - low[1]); + buffer[i] = low[0]; + buffer[i + 1] = low[1]; + } +} + +static float *delayBuffer = NULL; +static unsigned int delayBufferSize = 0; +static unsigned int delayReadIndex = 2; +static unsigned int delayWriteIndex = 0; + +// Audio effect: delay +static void AudioProcessEffectDelay(float *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; + + buffer[i] = 0.5f*buffer[i] + 0.5f*leftDelay; + buffer[i + 1] = 0.5f*buffer[i + 1] + 0.5f*rightDelay; + + delayBuffer[delayWriteIndex++] = buffer[i]; + delayBuffer[delayWriteIndex++] = buffer[i + 1]; + if (delayWriteIndex == delayBufferSize) delayWriteIndex = 0; + } +} + int main(void) { // Initialization @@ -24,11 +65,17 @@ int main(void) Music music = LoadMusicStream("resources/country.mp3"); + // Allocate buffer for the delay effect + delayBuffer = (float *)RL_CALLOC(48000*2, sizeof(float)); // 1 second delay (device sampleRate*channels) + PlayMusicStream(music); float timePlayed = 0.0f; bool pause = false; + bool hasFilter = false; + bool hasDelay = false; + SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- @@ -55,6 +102,22 @@ int main(void) else ResumeMusicStream(music); } + // Add/Remove effect: lowpass filter + if (IsKeyPressed(KEY_F)) + { + hasFilter = !hasFilter; + if (hasFilter) AttachAudioStreamProcessor(music.stream, AudioProcessEffectLPF); + else DetachAudioStreamProcessor(music.stream, AudioProcessEffectLPF); + } + + // Add/Remove effect: delay + if (IsKeyPressed(KEY_D)) + { + hasDelay = !hasDelay; + if (hasDelay) AttachAudioStreamProcessor(music.stream, AudioProcessEffectDelay); + else DetachAudioStreamProcessor(music.stream, AudioProcessEffectDelay); + } + // Get timePlayed scaled to bar dimensions (400 pixels) timePlayed = GetMusicTimePlayed(music)/GetMusicTimeLength(music)*400; @@ -86,6 +149,8 @@ int main(void) CloseAudioDevice(); // Close audio device (music streaming is automatically stopped) + RL_FREE(delayBuffer); // Free delay buffer + CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- |
