Skip to content

Instantly share code, notes, and snippets.

@b-ma
Created June 12, 2016 14:05
Show Gist options
  • Save b-ma/4e16259328615940116a3ed053247642 to your computer and use it in GitHub Desktop.
Save b-ma/4e16259328615940116a3ed053247642 to your computer and use it in GitHub Desktop.
export default class Scheduler {
constructor(ctx, period = 0.025, lookahead = 0.1) {
this.queue = [];
this.ctx = ctx;
this.period = period;
this.lookahead = lookahead;
this.tick = this.tick.bind(this);
// @todo - launch only if there is somthing to do
this.tick();
}
tick() {
if (!this.queue.length)
return setTimeout(this.tick, this.period);
const currentTime = this.ctx.currentTime;
// time of the next event
let nextTime = this.queue[0].time;
while (nextTime < currentTime + this.lookahead) {
const queued = this.queue[0];
queued.time = queued.engine.advanceTime(nextTime);
// reorder scheduler
this.queue.sort((a, b) => a.time - b.time);
// find next engine to be played
nextTime = this.queue[0].time;
}
setTimeout(this.tick, this.period * 1000);
}
add(engine, time) {
this.queue.push({ time, engine });
this.queue.sort((a, b) => a.time - b.time);
}
reset(engine, time) {
let queued = null;
for (let i = 0; i < this.queue.length; i++) {
queued = this.queue[i];
if (queued.engine === engine)
break;
}
if (queued) {
queued.time = time;
this.queue.sort((a, b) => a.time - b.time);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment