Reuse single PlaybackWorker between Playback instances (#12520)

* Terminate playback worker on destroy

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Reuse single PlaybackWorker between all Playbacks

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* ...

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

---------

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
Michael Telatynski
2024-05-14 15:56:33 +01:00
committed by GitHub
parent 51f71567d7
commit 6e31f69118
2 changed files with 38 additions and 10 deletions

View File

@@ -19,17 +19,14 @@ import { SimpleObservable } from "matrix-widget-api";
import { logger } from "matrix-js-sdk/src/logger";
import { defer } from "matrix-js-sdk/src/utils";
// @ts-ignore - `.ts` is needed here to make TS happy
import { Request, Response } from "../workers/playback.worker.ts";
import { UPDATE_EVENT } from "../stores/AsyncStore";
import { arrayFastResample } from "../utils/arrays";
import { IDestroyable } from "../utils/IDestroyable";
import { PlaybackClock } from "./PlaybackClock";
import { createAudioContext, decodeOgg } from "./compat";
import { clamp } from "../utils/numbers";
import { WorkerManager } from "../WorkerManager";
import { DEFAULT_WAVEFORM, PLAYBACK_WAVEFORM_SAMPLES } from "./consts";
import playbackWorkerFactory from "../workers/playbackWorkerFactory";
import { PlaybackEncoder } from "../PlaybackEncoder";
export enum PlaybackState {
Decoding = "decoding",
@@ -64,7 +61,6 @@ export class Playback extends EventEmitter implements IDestroyable, PlaybackInte
private waveformObservable = new SimpleObservable<number[]>();
private readonly clock: PlaybackClock;
private readonly fileSize: number;
private readonly worker = new WorkerManager<Request, Response>(playbackWorkerFactory());
/**
* Creates a new playback instance from a buffer.
@@ -209,7 +205,9 @@ export class Playback extends EventEmitter implements IDestroyable, PlaybackInte
// Update the waveform to the real waveform once we have channel data to use. We don't
// exactly trust the user-provided waveform to be accurate...
this.resampledWaveform = await this.makePlaybackWaveform(this.audioBuf.getChannelData(0));
this.resampledWaveform = await PlaybackEncoder.instance.getPlaybackWaveform(
this.audioBuf.getChannelData(0),
);
}
this.waveformObservable.update(this.resampledWaveform);
@@ -222,10 +220,6 @@ export class Playback extends EventEmitter implements IDestroyable, PlaybackInte
this.emit(PlaybackState.Stopped); // signal that we're not decoding anymore
}
private makePlaybackWaveform(input: Float32Array): Promise<number[]> {
return this.worker.call({ data: Array.from(input) }).then((resp) => resp.waveform);
}
private onPlaybackEnd = async (): Promise<void> => {
await this.context.suspend();
this.emit(PlaybackState.Stopped);