summaryrefslogtreecommitdiff
path: root/src/buffer
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer')
-rw-r--r--src/buffer/clock.c19
-rw-r--r--src/buffer/clock.h5
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);