From e8b81c71ff65406e0e3720afa6f8628e733590f5 Mon Sep 17 00:00:00 2001 From: wiiiii123 Date: Wed, 13 May 2026 02:41:08 +0700 Subject: [PATCH] fix(recording): keep embedded audio fallbacks safe --- electron/ipc/recording/diagnostics.ts | 3 +-- electron/ipc/recording/prune.ts | 4 ++-- src/lib/exporter/audioEncoder.test.ts | 7 ++++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/electron/ipc/recording/diagnostics.ts b/electron/ipc/recording/diagnostics.ts index 77b34c45..811e0920 100644 --- a/electron/ipc/recording/diagnostics.ts +++ b/electron/ipc/recording/diagnostics.ts @@ -512,8 +512,7 @@ export async function getCompanionAudioFallbackInfo(videoPath: string) { new Set( companionCandidates.flatMap((candidate) => candidate.usablePaths.filter( - (companionPath) => - companionPath === candidate.micPath || companionPath === candidate.systemPath, + (companionPath) => companionPath === candidate.micPath, ), ), ), diff --git a/electron/ipc/recording/prune.ts b/electron/ipc/recording/prune.ts index f7ee5e27..d8004bd1 100644 --- a/electron/ipc/recording/prune.ts +++ b/electron/ipc/recording/prune.ts @@ -82,11 +82,11 @@ async function loadSavedProjectMediaPaths() { editor?: { webcam?: { sourcePath?: unknown } }; }>(await fs.readFile(projectPath, "utf-8")); } catch (error) { - console.warn("[prune] Skipping unreadable project while pruning recordings", { + console.warn("[prune] Aborting recording prune because a saved project is unreadable", { projectPath, error, }); - return; + throw error; } const candidatePaths = [ rawProject.videoPath, diff --git a/src/lib/exporter/audioEncoder.test.ts b/src/lib/exporter/audioEncoder.test.ts index 9e9deeec..e762f63b 100644 --- a/src/lib/exporter/audioEncoder.test.ts +++ b/src/lib/exporter/audioEncoder.test.ts @@ -14,8 +14,8 @@ type OfflineRenderTestHarness = AudioProcessor & { sourceAudioFallbackPaths: string[], sourceAudioFallbackStartDelayMsByPath?: Record, ): Promise<{ - mainBuffer: AudioBuffer | null; - companionEntries: Array<{ buffer: AudioBuffer; startDelaySec: number }>; + mainBufferEntry: { buffer: AudioBuffer; gain: number } | null; + companionEntries: Array<{ buffer: AudioBuffer; startDelaySec: number; gain: number }>; }>; renderAndMuxOfflineAudio( videoUrl: string, @@ -55,7 +55,8 @@ describe("AudioProcessor offline render preparation", () => { ["/tmp/recording.mp4", "/tmp/recording.mic.wav"], ); - expect(prepared.mainBuffer).toBe(mainBuffer); + expect(prepared.mainBufferEntry?.buffer).toBe(mainBuffer); + expect(prepared.mainBufferEntry?.gain).toBe(1); expect(prepared.companionEntries).toHaveLength(1); expect(prepared.companionEntries[0]?.buffer).toBe(micBuffer); expect(decodeAudioFromUrl).toHaveBeenCalledWith("file:///tmp/recording.mp4");