diff --git a/.changeset/resampler-flush-empty.md b/.changeset/resampler-flush-empty.md new file mode 100644 index 00000000..9b72dff8 --- /dev/null +++ b/.changeset/resampler-flush-empty.md @@ -0,0 +1,5 @@ +--- +'@livekit/rtc-node': patch +--- + +Return no frames from `AudioResampler.flush()` when nothing is buffered, instead of one empty frame. diff --git a/packages/livekit-rtc/src/audio_resampler.test.ts b/packages/livekit-rtc/src/audio_resampler.test.ts new file mode 100644 index 00000000..1b9642fa --- /dev/null +++ b/packages/livekit-rtc/src/audio_resampler.test.ts @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2026 LiveKit, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +import { describe, expect, it } from 'vitest'; +import { AudioFrame } from './audio_frame.js'; +import { AudioResampler } from './audio_resampler.js'; + +describe('AudioResampler', () => { + it('flush returns no frames when nothing is buffered', () => { + const resampler = new AudioResampler(48000, 16000); + expect(resampler.flush()).toEqual([]); + + resampler.push(new AudioFrame(new Int16Array(4800), 48000, 1, 4800)); + const tail = resampler.flush(); + expect(tail.reduce((n, f) => n + f.samplesPerChannel, 0)).toBeGreaterThan(0); + expect(resampler.flush()).toEqual([]); + }); +}); diff --git a/packages/livekit-rtc/src/audio_resampler.ts b/packages/livekit-rtc/src/audio_resampler.ts index 24bb0ec1..080e876e 100644 --- a/packages/livekit-rtc/src/audio_resampler.ts +++ b/packages/livekit-rtc/src/audio_resampler.ts @@ -174,7 +174,7 @@ export class AudioResampler { throw new Error(res.error); } - if (!res.outputPtr) { + if (!res.outputPtr || !res.size) { return []; }