Fix audio player seek bar position (#31127)

* fix(audio): stop clock when the source audio reaches the end

* test(audio): add test for playback when audio source ended
This commit is contained in:
Florian Duros
2025-10-29 17:05:04 +01:00
committed by GitHub
parent a9993aef85
commit 2ab42df0c8
2 changed files with 24 additions and 3 deletions

View File

@@ -46,6 +46,7 @@ describe("Playback", () => {
beforeEach(() => {
jest.spyOn(logger, "error").mockRestore();
mockAudioBufferSourceNode.addEventListener.mockClear();
mockAudioBuffer.getChannelData.mockClear().mockReturnValue(mockChannelData);
mockAudioContext.decodeAudioData.mockReset().mockResolvedValue(mockAudioBuffer);
mockAudioContext.resume.mockClear().mockResolvedValue(undefined);
@@ -105,6 +106,26 @@ describe("Playback", () => {
expect(playback.currentState).toEqual(PlaybackState.Stopped);
});
it("stop when audio source ended", async () => {
const buffer = new ArrayBuffer(8);
const playback = new Playback(buffer);
await playback.prepare();
await playback.play();
// Simulate the audio source ending by calling the 'ended' event listener
const endedListener = mockAudioBufferSourceNode.addEventListener.mock.calls.find(
(call) => call[0] === "ended",
)[1];
await endedListener();
// AudioContext should be suspended
expect(mockAudioContext.suspend).toHaveBeenCalled();
// Playback state should be Stopped
expect(playback.currentState).toEqual(PlaybackState.Stopped);
// Clock should be reset to 0
expect(playback.timeSeconds).toEqual(0);
});
describe("prepare()", () => {
it("decodes audio data when not greater than 5mb", async () => {
const buffer = new ArrayBuffer(8);