From 2172d1a767fbcc819432dbb55e3aa43fba4251d4 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 21 Aug 2022 11:20:15 +0200 Subject: [PATCH] scheduler error correction via getTime --- packages/core/clockworker.mjs | 2 +- packages/core/scheduler.mjs | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/core/clockworker.mjs b/packages/core/clockworker.mjs index 07bd45d3..c56f38a4 100644 --- a/packages/core/clockworker.mjs +++ b/packages/core/clockworker.mjs @@ -12,7 +12,7 @@ const createWorker = (func) => new Worker(urlifyFunction(func)); // this is just a setInterval with a counter, running in a worker export class ClockWorker { worker; - interval = 0.1; // query span + interval = 1 / 32; // query span, use powers of 2 to get better float accuracy tick = 0; constructor(callback, interval = this.interval) { this.interval = interval; diff --git a/packages/core/scheduler.mjs b/packages/core/scheduler.mjs index a8f6ff0f..8bcef060 100644 --- a/packages/core/scheduler.mjs +++ b/packages/core/scheduler.mjs @@ -12,9 +12,18 @@ export class Scheduler { started = false; phase = 0; cps = 1; - constructor({ interval = 0.1, onTrigger, onError, latency = 0.1 }) { + lastTime; + constructor({ interval, onTrigger, onError, latency = 0.1, getTime }) { this.worker = new ClockWorker((_, interval) => { try { + let error = 0; + // measure time between last and current callback and calculate deviation from extected interval + const time = getTime?.(); + if (time && this.lastTime) { + error = time - this.lastTime - interval; // how off is the callback? positive = too late + // console.log('ms error', error * 1000); + } + this.lastTime = time; const begin = this.phase; const end = this.phase + interval * this.cps; this.phase = end; @@ -26,7 +35,7 @@ export class Scheduler { if (!hap.part.begin.equals(hap.whole.begin)) { return; } - const deadline = (hap.whole.begin - begin) / this.cps + latency; + const deadline = (hap.whole.begin - begin) / this.cps + latency - error; // TODO: use legato / duration of objectified value const duration = hap.duration / this.cps; onTrigger?.(hap, deadline, duration);