summaryrefslogtreecommitdiff
path: root/src/app/main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/main.cc')
-rw-r--r--src/app/main.cc43
1 files changed, 25 insertions, 18 deletions
diff --git a/src/app/main.cc b/src/app/main.cc
index 537da74..3c80520 100644
--- a/src/app/main.cc
+++ b/src/app/main.cc
@@ -207,7 +207,10 @@ int main(int argc, char** argv) {
#endif /* !defined(STRIP_ALL) */
// Pre-fill ring buffer to target lookahead (prevents startup delay)
- fill_audio_buffer(audio_get_required_prefill_time(), 0.0);
+ // Skip pre-fill in WAV dump mode (direct render, no ring buffer)
+ if (!dump_wav) {
+ fill_audio_buffer(audio_get_required_prefill_time(), 0.0);
+ }
audio_start();
g_last_audio_time = audio_get_playback_time(); // Initialize after start
@@ -268,37 +271,41 @@ int main(int argc, char** argv) {
printf("Running WAV dump simulation (%.1fs - %.1fs)...\n", start_time,
end_time);
- // Seek to start time if needed
+ // Seek to start time if needed (advance state without rendering)
if (start_time > 0.0f) {
const double step = 1.0 / 60.0;
for (double t = 0.0; t < start_time; t += step) {
- fill_audio_buffer(step, t);
- audio_render_silent((float)step);
+ g_audio_engine.update(g_music_time, (float)step * g_tempo_scale);
+ g_music_time += (float)step * g_tempo_scale;
}
printf("Seeked to %.1fs\n", start_time);
}
- const float update_dt = 1.0f / 60.0f; // 60Hz update rate
- const int frames_per_update = (int)(32000 * update_dt); // ~533 frames
- const int samples_per_update = frames_per_update * 2; // Stereo
+ const float update_dt = 1.0f / 60.0f; // 60Hz update rate
+ const int sample_rate = 32000;
- AudioRingBuffer* ring_buffer = audio_get_ring_buffer();
- std::vector<float> chunk_buffer(samples_per_update);
+ std::vector<float> chunk_buffer(2048); // Max samples for one update
double physical_time = start_time;
+ double frame_accumulator = 0.0;
while (physical_time < end_time) {
- // Update music time and tracker (using tempo logic from
- // fill_audio_buffer)
- fill_audio_buffer(update_dt, physical_time);
+ // Calculate exact frames for this update
+ frame_accumulator += sample_rate * update_dt;
+ const int frames_this_update = (int)frame_accumulator;
+ frame_accumulator -= frames_this_update;
+ const int samples_this_update = frames_this_update * 2;
- // Read rendered audio from ring buffer
- if (ring_buffer != nullptr) {
- ring_buffer->read(chunk_buffer.data(), samples_per_update);
- }
+ // Update tracker/audio state
+ g_audio_engine.update(g_music_time, update_dt * g_tempo_scale);
- // Write to WAV file
- wav_backend.write_audio(chunk_buffer.data(), samples_per_update);
+ // Render directly to buffer (bypass ring buffer)
+ if (frames_this_update > 0) {
+ synth_render(chunk_buffer.data(), frames_this_update);
+ wav_backend.write_audio(chunk_buffer.data(), samples_this_update);
+ }
+ // Advance music time
+ g_music_time += update_dt * g_tempo_scale;
physical_time += update_dt;
// Progress indicator every second