From 83a62bcc5398d4589e6b5ef55435dcca78bd9f51 Mon Sep 17 00:00:00 2001 From: ANDROIDHASSAN <84630851+ANDROIDHASSAN@users.noreply.github.com> Date: Thu, 12 Nov 2026 20:07:12 +0530 Subject: [PATCH 1/2] fix(rtc-node): return no frames from AudioResampler.flush() when nothing is buffered The FFI flush response carries a non-zero outputPtr with size 0 when the resampler has nothing left, so the pointer check never matched and flush() returned one 0-sample frame. Check the size instead. --- .changeset/resampler-flush-empty.md | 5 +++++ .../livekit-rtc/src/audio_resampler.test.ts | 18 ++++++++++++++++++ packages/livekit-rtc/src/audio_resampler.ts | 2 +- 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 .changeset/resampler-flush-empty.md create mode 100644 packages/livekit-rtc/src/audio_resampler.test.ts 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..5da7b321 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.size) { return []; } From 25a85e26ab4aace39b860c35189b255b204079b4 Mon Sep 17 00:00:00 2001 From: ANDROIDHASSAN <84630851+ANDROIDHASSAN@users.noreply.github.com> Date: Thu, 12 Nov 2026 20:14:40 +0530 Subject: [PATCH 2/2] fix(rtc-node): keep the output pointer guard so the dts build narrows it --- packages/livekit-rtc/src/audio_resampler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/livekit-rtc/src/audio_resampler.ts b/packages/livekit-rtc/src/audio_resampler.ts index 5da7b321..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.size) { + if (!res.outputPtr || !res.size) { return []; }