fix(player): start frame loop only after ffmpeg spawns in jdymusic path

PR #54's playViaPowerShellDownload called startFrameLoop() right after
spawning the PowerShell downloader, before ffmpeg existed. The loop's
"no ffmpeg + empty buffer → emit trackEnd" branch fired on the very
first tick (~25ms), skipping every jdymusic song. Visible as: each
PowerShell download sessionId logged "Track ended, advancing queue"
before the download completed, so the queue burned through every
track in a few seconds.

Move startFrameLoop() into spawnFfmpegFromFile() where ffmpeg is
known to be alive and producing PCM. state = "playing" still flips
in playViaPowerShellDownload so external observers see the right
status during download.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
saopig1andClaude Opus 4.7 committed 2026-05-07 21:04:27 +08:00
1 parent 9efa818bbb
commit c562fe05b0
1 file changed
+8 -1
+8 -1
View File
@@ -279,8 +279,12 @@ export class AudioPlayer extends EventEmitter {
this.emit("error", err); this.emit("error", err);
}); });
// Mark playing but DO NOT start the frame loop here — the loop's
// "no ffmpeg + empty buffer → trackEnd" branch would fire on the very
// first tick, before the PowerShell download even completes. The
// frame loop is started inside spawnFfmpegFromFile() once ffmpeg is
// alive and producing PCM.
this.state = "playing"; this.state = "playing";
this.startFrameLoop();
} }
private spawnFfmpegFromFile(tempFile: string, seekSeconds: number, sessionId: number): void { private spawnFfmpegFromFile(tempFile: string, seekSeconds: number, sessionId: number): void {
@@ -329,6 +333,9 @@ export class AudioPlayer extends EventEmitter {
this.emit("error", err); this.emit("error", err);
} }
}); });
// Now that ffmpeg is producing PCM, run the frame loop.
this.startFrameLoop();
} }
stop(): void { stop(): void {