summaryrefslogtreecommitdiff
path: root/src/audio/audio.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/audio.cc')
-rw-r--r--src/audio/audio.cc29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/audio/audio.cc b/src/audio/audio.cc
index 0407fb3..b00d416 100644
--- a/src/audio/audio.cc
+++ b/src/audio/audio.cc
@@ -21,7 +21,7 @@ static AudioRingBuffer g_ring_buffer;
// Maximum size: one chunk (533 frames @ 60fps = 1066 samples stereo)
#define MAX_PENDING_SAMPLES 2048
static float g_pending_buffer[MAX_PENDING_SAMPLES];
-static int g_pending_samples = 0; // How many samples are waiting to be written
+static int g_pending_samples = 0; // How many samples are waiting to be written
// Global backend pointer for audio abstraction
static AudioBackend* g_audio_backend = nullptr;
@@ -59,7 +59,8 @@ int register_spec_asset(AssetId id) {
void audio_init() {
// Note: synth_init() must be called separately before using audio system.
- // In production code, use AudioEngine::init() which manages initialization order.
+ // In production code, use AudioEngine::init() which manages initialization
+ // order.
// Clear pending buffer
g_pending_samples = 0;
@@ -83,21 +84,22 @@ void audio_start() {
void audio_render_ahead(float music_time, float dt) {
// Target: maintain look-ahead buffer
- const float target_lookahead =
- (float)RING_BUFFER_LOOKAHEAD_MS / 1000.0f;
+ const float target_lookahead = (float)RING_BUFFER_LOOKAHEAD_MS / 1000.0f;
// Render in small chunks to keep synth time synchronized with tracker
// Chunk size: one frame's worth of audio (~16.6ms @ 60fps)
const int chunk_frames = (int)(dt * RING_BUFFER_SAMPLE_RATE);
const int chunk_samples = chunk_frames * RING_BUFFER_CHANNELS;
- if (chunk_frames <= 0) return;
+ if (chunk_frames <= 0)
+ return;
// Keep rendering small chunks until buffer is full enough
while (true) {
// First, try to flush any pending samples from previous partial writes
if (g_pending_samples > 0) {
- const int written = g_ring_buffer.write(g_pending_buffer, g_pending_samples);
+ const int written =
+ g_ring_buffer.write(g_pending_buffer, g_pending_samples);
if (written > 0) {
// Some or all samples were written
@@ -119,16 +121,19 @@ void audio_render_ahead(float music_time, float dt) {
}
// If still have pending samples, buffer is full - wait for consumption
- if (g_pending_samples > 0) break;
+ if (g_pending_samples > 0)
+ break;
}
// Check current buffer state
const int buffered_samples = g_ring_buffer.available_read();
const float buffered_time =
- (float)buffered_samples / (RING_BUFFER_SAMPLE_RATE * RING_BUFFER_CHANNELS);
+ (float)buffered_samples /
+ (RING_BUFFER_SAMPLE_RATE * RING_BUFFER_CHANNELS);
// Stop if buffer is full enough
- if (buffered_time >= target_lookahead) break;
+ if (buffered_time >= target_lookahead)
+ break;
// Check available space and render chunk that fits
const int available_space = g_ring_buffer.available_write();
@@ -139,7 +144,8 @@ void audio_render_ahead(float music_time, float dt) {
// Determine how much we can actually render
// Render the smaller of: desired chunk size OR available space
- const int actual_samples = (available_space < chunk_samples) ? available_space : chunk_samples;
+ const int actual_samples =
+ (available_space < chunk_samples) ? available_space : chunk_samples;
const int actual_frames = actual_samples / RING_BUFFER_CHANNELS;
// Allocate temporary buffer (stereo)
@@ -172,7 +178,8 @@ void audio_render_ahead(float music_time, float dt) {
delete[] temp_buffer;
// If we couldn't write everything, stop and retry next frame
- if (written < actual_samples) break;
+ if (written < actual_samples)
+ break;
}
}