summaryrefslogtreecommitdiff
path: root/src/audio/ola.cc
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-03-28 18:45:42 +0100
committerskal <pascal.massimino@gmail.com>2026-03-28 20:14:59 +0100
commit8bee7577cba9f55be8bc404038d5df959595b989 (patch)
tree4a228f02a3345d9e1275b9e0949d2fb5d6d1864a /src/audio/ola.cc
parent37df61d1a0dbd5e253f9db778c17c4187e453b8d (diff)
fix(audio): fix early timing drift in tracker, use ola_decode_frame in synth
- Replaced chunk_frames truncation accumulation with accurate double-precision integration in audio_render_ahead. - Updated tracker to use double-precision time representations for exact sample-accurate scheduling. - Extracted ola_decode_frame to handle per-frame OLA-IDCT synthesis in synth.cc. - Updated TODO.md for completed audio tasks. handoff(Claude): Audio timing drift and OLA-IDCT enhancement resolved.
Diffstat (limited to 'src/audio/ola.cc')
-rw-r--r--src/audio/ola.cc16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/audio/ola.cc b/src/audio/ola.cc
index 738df85..fd5098e 100644
--- a/src/audio/ola.cc
+++ b/src/audio/ola.cc
@@ -21,14 +21,18 @@ void ola_encode(const float* pcm, int n_samples, float* spec, int num_frames) {
}
}
+void ola_decode_frame(const float* spec_frame, float* overlap, float* out_hop) {
+ float tmp[DCT_SIZE];
+ idct_512(spec_frame, tmp);
+ for (int j = 0; j < OLA_HOP_SIZE; ++j)
+ out_hop[j] = tmp[j] + overlap[j];
+ for (int j = 0; j < OLA_OVERLAP; ++j)
+ overlap[j] = tmp[OLA_HOP_SIZE + j];
+}
+
void ola_decode(const float* spec, int num_frames, float* pcm) {
float overlap[OLA_OVERLAP] = {};
- float tmp[DCT_SIZE];
for (int f = 0; f < num_frames; ++f) {
- idct_512(spec + f * DCT_SIZE, tmp);
- for (int j = 0; j < OLA_HOP_SIZE; ++j)
- pcm[f * OLA_HOP_SIZE + j] = tmp[j] + overlap[j];
- for (int j = 0; j < OLA_OVERLAP; ++j)
- overlap[j] = tmp[OLA_HOP_SIZE + j];
+ ola_decode_frame(spec + f * DCT_SIZE, overlap, pcm + f * OLA_HOP_SIZE);
}
}