Tone.js/test/helper/Offline.ts

76 lines
1.8 KiB
TypeScript
Raw Normal View History

import { TestAudioBuffer } from "./compare/index.js";
import { OfflineContext } from "../../Tone/core/context/OfflineContext.js";
import { getContext, setContext } from "../../Tone/core/Global.js";
import { Seconds } from "../../Tone/core/type/Units.js";
import { isArray, isFunction } from "../../Tone/core/util/TypeCheck.js";
2019-05-23 18:00:49 +00:00
type ReturnFunction = (time: Seconds) => void;
2019-04-12 14:37:47 +00:00
export async function Offline(
callback: (
context: OfflineContext
) =>
| void
| ReturnFunction
| ReturnFunction[]
| Promise<void | ReturnFunction>
| void,
duration = 0.1,
channels = 1,
sampleRate = 44100
2019-06-24 17:41:38 +00:00
): Promise<TestAudioBuffer> {
const originalContext = getContext();
const offline = new OfflineContext(
channels,
duration + 1 / sampleRate,
sampleRate
);
setContext(offline);
try {
let retFunction = callback(offline);
if (retFunction instanceof Promise) {
retFunction = await retFunction;
}
if (isFunction(retFunction)) {
const fn = retFunction;
offline.on("tick", () => fn(offline.now()));
} else if (isArray(retFunction)) {
// each element in the array is a timing callback
retFunction.forEach((fn) => {
offline.on("tick", () => fn(offline.now()));
});
}
2019-11-18 20:08:12 +00:00
} catch (e) {
throw e;
} finally {
setContext(originalContext);
2019-11-18 20:08:12 +00:00
const buffer = await offline.render();
return new TestAudioBuffer(buffer.get() as AudioBuffer);
2019-05-23 18:00:49 +00:00
}
}
export function whenBetween(
value: Seconds,
start: Seconds,
stop: Seconds,
callback: () => void
): void {
2019-05-23 18:00:49 +00:00
if (value >= start && value < stop) {
callback();
}
}
// invoked only once
export function atTime(
when: Seconds,
callback: (time: Seconds) => void
): (time: Seconds) => void {
2019-05-23 18:00:49 +00:00
let wasInvoked = false;
return (time) => {
if (time >= when && !wasInvoked) {
callback(time);
wasInvoked = true;
}
};
2019-04-12 14:37:47 +00:00
}