fix: guard music playback process lifecycle

This commit is contained in:
MythEclipse
2026-05-15 17:23:36 +07:00
parent 9e07a0a1f3
commit 1e0a00d82d
2 changed files with 29 additions and 3 deletions

View File

@@ -21,16 +21,23 @@ export function createMusicPlayer(
return {
play(source: ResolvedMediaSource): MusicPlayback {
if (!audioPlayer.isConnected()) {
throw new Error("Discord audio player is not connected");
}
const proc = spawn("ffmpeg", buildFfmpegArgs(source.source), {
stdio: ["ignore", "pipe", "pipe"],
}) as unknown as ChildProcessWithoutNullStreams;
proc.stderr.resume();
audioPlayer.playStream(proc.stdout);
let stopped = false;
const done = new Promise<void>((resolve, reject) => {
proc.on("error", reject);
proc.stdout.on("error", reject);
proc.on("close", (code) => {
if (code === 0) {
if (code === 0 || stopped) {
resolve();
return;
}
@@ -41,6 +48,8 @@ export function createMusicPlayer(
return {
done,
stop() {
if (stopped) return;
stopped = true;
proc.kill("SIGTERM");
audioPlayer.stop();
},