feat: add afterglow and synchronized drive lift

This commit is contained in:
2026-09-04 16:12:14 +03:00
parent 4c7d46ba0e
commit 5172b5bc4b
3 changed files with 804 additions and 173 deletions

View File

@@ -27,6 +27,9 @@ export interface FakeAudioHarness {
readonly gainNodes: readonly GainNode[];
readonly buffers: AudioBuffer[];
readonly destination: AudioNode;
readonly resumeCount: number;
readonly suspendCount: number;
readonly closeCount: number;
setCurrentTime(seconds: number): void;
decodedBuffer(durationSeconds: number, channels?: number): AudioBuffer;
emitContextState(state: AudioContextState | 'interrupted'): void;
@@ -105,6 +108,9 @@ export function createFakeAudioHarness(): FakeAudioHarness {
const sampleRate = 48_000;
let currentTime = 0;
let state: AudioContextState | 'interrupted' = 'suspended';
let resumeCount = 0;
let suspendCount = 0;
let closeCount = 0;
const decodedBuffer = (durationSeconds: number, channels = 2): AudioBuffer => {
const length = Math.max(1, Math.round(durationSeconds * sampleRate));
@@ -232,12 +238,15 @@ export function createFakeAudioHarness(): FakeAudioHarness {
return decodedBuffer(1);
},
async resume() {
resumeCount += 1;
state = 'running';
},
async suspend() {
suspendCount += 1;
state = 'suspended';
},
async close() {
closeCount += 1;
state = 'closed';
},
addEventListener(type: string, listener: () => void) {
@@ -255,6 +264,15 @@ export function createFakeAudioHarness(): FakeAudioHarness {
gainNodes,
buffers,
destination,
get resumeCount() {
return resumeCount;
},
get suspendCount() {
return suspendCount;
},
get closeCount() {
return closeCount;
},
setCurrentTime(seconds) {
currentTime = seconds;
},