From 005ff74eb08a0bb6b9ccb825b7c84a8fe146b096 Mon Sep 17 00:00:00 2001 From: David Reid Date: Sat, 21 Feb 2026 17:02:40 +1000 Subject: [PATCH] Audio: Improvements to device configuration (#5577) * Audio: Stop setting capture config options. Since the device is being configured as a playback device, all capture config options are unused and therefore need to not be set. * Audio: Stop pre-silencing the miniaudio output buffer. raylib already manually silences the output buffer prior to mixing so there is no reason to have miniaudio also do it. It can therefore be disabled via the device config to make data processing slightly more efficient. * Audio: Stop forcing fixed sized processing callbacks. There is no requirement for raylib to have guaranteed fixed sized audio processing. By disabling it, audio processing can be made more efficient by not having to run the data through an internal intermediary buffer. * Audio: Make the period size (latency) configurable. The default period size is 10ms, but this is inappropriate for certain platforms so it is useful to be able to allow those platforms to configure the period size as required. * Audio: Fix documentation for pan. The pan if -1..1, not 0..1. --- src/config.h | 1 + src/raudio.c | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/config.h b/src/config.h index 5e7c6f1d2..3beaeeceb 100644 --- a/src/config.h +++ b/src/config.h @@ -303,6 +303,7 @@ #define AUDIO_DEVICE_FORMAT ma_format_f32 // Device output format (miniaudio: float-32bit) #define AUDIO_DEVICE_CHANNELS 2 // Device output channels: stereo #define AUDIO_DEVICE_SAMPLE_RATE 0 // Device sample rate (device default) +#define AUDIO_DEVICE_PERIOD_SIZE_IN_FRAMES 0 // Device period size (controls latency, 0 defaults to 10ms) #define MAX_AUDIO_BUFFER_POOL_CHANNELS 16 // Maximum number of audio pool channels diff --git a/src/raudio.c b/src/raudio.c index 8322f1baf..848b48c4d 100644 --- a/src/raudio.c +++ b/src/raudio.c @@ -290,6 +290,9 @@ typedef struct tagBITMAPINFOHEADER { #ifndef AUDIO_DEVICE_SAMPLE_RATE #define AUDIO_DEVICE_SAMPLE_RATE 0 // Device output sample rate #endif +#ifndef AUDIO_DEVICE_PERIOD_SIZE_IN_FRAMES + #define AUDIO_DEVICE_PERIOD_SIZE_IN_FRAMES 0 // Device latency. 0 defaults to 10ms +#endif #ifndef MAX_AUDIO_BUFFER_POOL_CHANNELS #define MAX_AUDIO_BUFFER_POOL_CHANNELS 16 // Audio pool channels @@ -349,7 +352,7 @@ struct rAudioBuffer { float volume; // Audio buffer volume float pitch; // Audio buffer pitch - float pan; // Audio buffer pan (0.0f to 1.0f) + float pan; // Audio buffer pan (-1.0f to 1.0f) bool playing; // Audio buffer state: AUDIO_PLAYING bool paused; // Audio buffer state: AUDIO_PAUSED @@ -477,12 +480,12 @@ void InitAudioDevice(void) config.playback.pDeviceID = NULL; // NULL for the default playback AUDIO.System.device config.playback.format = AUDIO_DEVICE_FORMAT; config.playback.channels = AUDIO_DEVICE_CHANNELS; - config.capture.pDeviceID = NULL; // NULL for the default capture AUDIO.System.device - config.capture.format = ma_format_s16; - config.capture.channels = 1; config.sampleRate = AUDIO_DEVICE_SAMPLE_RATE; + config.periodSizeInFrames = AUDIO_DEVICE_PERIOD_SIZE_IN_FRAMES; config.dataCallback = OnSendAudioDataToDevice; config.pUserData = NULL; + config.noPreSilencedOutputBuffer = true; // raylib pre-silences the output buffer manually + config.noFixedSizedCallback = true; // raylib does not require fixed sized callback guarantees. This bypasses an internal intermediary buffer result = ma_device_init(&AUDIO.System.context, &config, &AUDIO.System.device); if (result != MA_SUCCESS)