chore: update Discord-video-stream subproject to latest commit

This commit is contained in:
MythEclipse
2026-05-17 04:52:20 +07:00
parent 518577d79d
commit 71889ab689
15 changed files with 268 additions and 19 deletions
+27
View File
@@ -21,6 +21,9 @@ export interface MediaControllerDependencies {
musicPlayer?: MusicPlayer;
screenController?: ScreenShareController;
onStateChange?: (state: MediaState) => void;
initialMusicVolume?: number;
onMusicVolumeChange?: (volume: number) => void | Promise<void>;
setMusicVolume?: (volume: number) => void;
}
export class MediaController {
@@ -31,9 +34,18 @@ export class MediaController {
private skipInProgress = false;
private screenPlayback: ScreenSharePlayback | null = null;
private activeMode: MediaMode | null = null;
private musicVolume: number;
private readonly setPlayerMusicVolume: (volume: number) => void;
constructor(private readonly dependencies: MediaControllerDependencies = {}) {
this.musicPlayer = dependencies.musicPlayer ?? createMusicPlayer();
this.setPlayerMusicVolume =
dependencies.setMusicVolume ??
((volume) => {
discordPlayer.setMusicVolume(volume);
});
this.musicVolume = normalizeVolume(dependencies.initialMusicVolume, 1);
this.setPlayerMusicVolume(this.musicVolume);
}
getState(): MediaState {
@@ -42,10 +54,20 @@ export class MediaController {
playing:
this.activeMode === "screen" || snapshot.current?.status === "playing",
activeMode: this.activeMode ?? snapshot.current?.mode ?? null,
musicVolume: this.musicVolume,
...snapshot,
};
}
async setMusicVolume(volume: number): Promise<MediaState> {
const nextVolume = normalizeVolume(volume, this.musicVolume);
if (this.musicVolume === nextVolume) return this.emitState();
this.musicVolume = nextVolume;
this.setPlayerMusicVolume(nextVolume);
await this.dependencies.onMusicVolumeChange?.(nextVolume);
return this.emitState();
}
async queue(
source: string,
options: QueueMediaOptions = {},
@@ -201,3 +223,8 @@ export class MediaController {
return state;
}
}
function normalizeVolume(value: number | undefined, fallback: number): number {
if (!Number.isFinite(value)) return fallback;
return Math.max(0, Math.min(1, value as number));
}
+15 -1
View File
@@ -1,4 +1,5 @@
import type { Readable } from "node:stream";
import type { StreamType } from "@discordjs/voice";
export type MediaMode = "music" | "screen";
export type MediaSourceKind =
@@ -26,6 +27,7 @@ export interface MediaQueueItem extends ResolvedMediaSource {
export interface MediaState {
playing: boolean;
activeMode: MediaMode | null;
musicVolume: number;
current: MediaQueueItem | null;
queue: MediaQueueItem[];
}
@@ -56,11 +58,23 @@ export interface ScreenShareController {
export type DiscordPlayerOwner = "none" | "browser-bridge" | "music" | "screen";
export interface DiscordPlayOptions {
inputType?: StreamType;
inlineVolume?: boolean;
volume?: number;
}
export interface DiscordAudioPlayer {
getOwner(): DiscordPlayerOwner;
isConnected(): boolean;
playStream(stream: Readable, owner: DiscordPlayerOwner): void;
playStream(
stream: Readable,
owner: DiscordPlayerOwner,
options?: DiscordPlayOptions,
): void;
pause(owner?: DiscordPlayerOwner): void;
unpause(owner?: DiscordPlayerOwner): boolean;
stop(owner?: DiscordPlayerOwner): void;
getMusicVolume(): number;
setMusicVolume(volume: number): void;
}
+7 -3
View File
@@ -1,5 +1,6 @@
import type { ChildProcessWithoutNullStreams } from "node:child_process";
import { spawn as nodeSpawn } from "node:child_process";
import { StreamType } from "@discordjs/voice";
import { discordPlayer } from "../player";
import type {
DiscordAudioPlayer,
@@ -30,7 +31,10 @@ export function createMusicPlayer(
}) as unknown as ChildProcessWithoutNullStreams;
proc.stderr.resume();
audioPlayer.playStream(proc.stdout, "music");
audioPlayer.playStream(proc.stdout, "music", {
inputType: StreamType.Raw,
inlineVolume: true,
});
let stopped = false;
let released = false;
@@ -81,13 +85,13 @@ export function buildFfmpegArgs(source: string): string[] {
source,
"-vn",
"-acodec",
"libopus",
"pcm_s16le",
"-ar",
"48000",
"-ac",
"2",
"-f",
"ogg",
"s16le",
"pipe:1",
];
}