From 8288b8b793028ef01970c9542452223429e83c72 Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Tue, 2 Jun 2026 11:10:45 +1000 Subject: [PATCH] fix: keep embedded audio in legacy mac mic sidecar exports --- src/lib/exporter/audioEncoder.test.ts | 22 ++++++++++++++++++++++ src/lib/exporter/audioEncoder.ts | 6 ++++++ 2 files changed, 28 insertions(+) diff --git a/src/lib/exporter/audioEncoder.test.ts b/src/lib/exporter/audioEncoder.test.ts index 6047b548..92a1a887 100644 --- a/src/lib/exporter/audioEncoder.test.ts +++ b/src/lib/exporter/audioEncoder.test.ts @@ -161,6 +161,28 @@ describe("AudioProcessor offline render preparation", () => { expect(renderAndMuxOfflineAudio).toHaveBeenCalled(); }); + it("avoids the single-sidecar fast path for legacy mac mic sidecars that still need embedded audio", async () => { + const processor = new AudioProcessor() as unknown as OfflineRenderTestHarness; + const loadAudioFileDemuxer = vi.spyOn(processor, "loadAudioFileDemuxer"); + const renderAndMuxOfflineAudio = vi + .spyOn(processor, "renderAndMuxOfflineAudio") + .mockResolvedValue(); + + await processor.process( + {} as never, + {} as never, + "file:///tmp/recording.mp4", + [], + [], + undefined, + [], + ["/tmp/recording.mic.m4a"], + ); + + expect(loadAudioFileDemuxer).not.toHaveBeenCalled(); + expect(renderAndMuxOfflineAudio).toHaveBeenCalled(); + }); + it("soft-limits mixed peaks before encoding or WAV conversion", () => { const samples = new Float32Array([ -1.6, diff --git a/src/lib/exporter/audioEncoder.ts b/src/lib/exporter/audioEncoder.ts index d66e0bea..6f1ca075 100644 --- a/src/lib/exporter/audioEncoder.ts +++ b/src/lib/exporter/audioEncoder.ts @@ -263,12 +263,18 @@ export class AudioProcessor { videoUrl, sortedSourceAudioFallbackPaths, ); + const requiresLegacyMacMicSidecarMix = + routingPolicy.includeEmbeddedInExport && + !routingPolicy.hasEmbeddedSourceAudio && + routingPolicy.playbackPaths.length === 1 && + routingPolicy.playbackPaths[0]?.toLowerCase().endsWith(".mic.m4a") === true; const hasTimedCompanionAudio = routingPolicy.playbackPaths.some( (audioPath) => (sourceAudioFallbackStartDelayMsByPath?.[audioPath] ?? 0) > 0, ); const needsSourceAudioMixing = routingPolicy.playbackPaths.length > 1 || (routingPolicy.hasEmbeddedSourceAudio && routingPolicy.playbackPaths.length > 0) || + requiresLegacyMacMicSidecarMix || hasTimedCompanionAudio; // When speed edits, audio regions, or multiple audio sources need mixing, use offline AudioContext pipeline.