summaryrefslogtreecommitdiff
path: root/src/buffer
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-12-14 11:13:38 -0500
committerAndrew Opalach <andrew@akon.city> 2024-12-14 11:13:38 -0500
commit692785bc9da6904cf17e986fb034730ed3d78231 (patch)
tree2f3359db61821adb06412b319600baf02ef1c2ee /src/buffer
parentb91a978fcba8d0e938549172c68a07172d63b697 (diff)
downloadcamu-692785bc9da6904cf17e986fb034730ed3d78231.tar.gz
camu-692785bc9da6904cf17e986fb034730ed3d78231.tar.bz2
camu-692785bc9da6904cf17e986fb034730ed3d78231.zip
Work on pause and seek
Signed-off-by: Andrew Opalach <andrew@akon.city>
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);