diff options
Diffstat (limited to 'src/buffer')
| -rw-r--r-- | src/buffer/clock.c | 19 | ||||
| -rw-r--r-- | src/buffer/clock.h | 5 |
2 files changed, 22 insertions, 2 deletions
diff --git a/src/buffer/clock.c b/src/buffer/clock.c index 705a525..624c534 100644 --- a/src/buffer/clock.c +++ b/src/buffer/clock.c @@ -27,6 +27,25 @@ void camu_clock_set(struct camu_clock *clock, f64 base) clock->paused_at = 0.0; } +void camu_clock_seek(struct camu_clock *clock, f64 base, u64 target) +{ + clock->base = base; + clock->offset = 0.0; + f64 tick = aki_get_tick(); + if (clock->paused_at == -1.0) { + // We are safe to directly edit the tick here. + if (target == 0) { + al_atomic_store(f64)(&clock->tick, -1.0, AL_ATOMIC_RELAXED); + } else { + tick = calc_tick_offset(tick, aki_get_timestamp(), target); + al_atomic_store(f64)(&clock->tick, tick, AL_ATOMIC_RELAXED); + } + } else { + al_atomic_store(f64)(&clock->pause, PAUSED, AL_ATOMIC_RELAXED); + clock->paused_at = 0.0; + } +} + void camu_clock_offset(struct camu_clock *clock, f64 amount) { clock->offset += amount; diff --git a/src/buffer/clock.h b/src/buffer/clock.h index aae87cc..86eba5e 100644 --- a/src/buffer/clock.h +++ b/src/buffer/clock.h @@ -39,10 +39,11 @@ struct camu_clock { void camu_clock_init(struct camu_clock *clock, void (*callback)(void *, u8), void *userdata); void camu_clock_set(struct camu_clock *clock, f64 base); +void camu_clock_seek(struct camu_clock *clock, f64 base, u64 target); void camu_clock_offset(struct camu_clock *clock, f64 amount); -void camu_clock_pause(struct camu_clock *clock, u64 ts); -void camu_clock_resume(struct camu_clock *clock, u64 ts); +void camu_clock_pause(struct camu_clock *clock, u64 target); +void camu_clock_resume(struct camu_clock *clock, u64 target); bool camu_clock_is_armed(struct camu_clock *clock); bool camu_clock_is_paused(struct camu_clock *clock); |