mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-16 11:33:30 +01:00
Move streams to StreamDispatcher
breaking: removed AudioPlayer#setBitrate
This commit is contained in:
@@ -29,7 +29,7 @@ nonce.fill(0);
|
|||||||
* @extends {stream.Writable}
|
* @extends {stream.Writable}
|
||||||
*/
|
*/
|
||||||
class StreamDispatcher extends Writable {
|
class StreamDispatcher extends Writable {
|
||||||
constructor(player, streamOptions) {
|
constructor(player, streamOptions, streams) {
|
||||||
super(streamOptions);
|
super(streamOptions);
|
||||||
/**
|
/**
|
||||||
* The Audio Player that controls this dispatcher
|
* The Audio Player that controls this dispatcher
|
||||||
@@ -37,6 +37,7 @@ class StreamDispatcher extends Writable {
|
|||||||
*/
|
*/
|
||||||
this.player = player;
|
this.player = player;
|
||||||
this.streamOptions = streamOptions;
|
this.streamOptions = streamOptions;
|
||||||
|
this.streams = streams;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The time that the stream was paused at (null if not paused)
|
* The time that the stream was paused at (null if not paused)
|
||||||
@@ -67,9 +68,8 @@ class StreamDispatcher extends Writable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_destroy(err, cb) {
|
_destroy(err, cb) {
|
||||||
if (this.player.dispatcher !== this) return;
|
if (this.player.dispatcher === this) this.player.dispatcher = null;
|
||||||
this.player.dispatcher = null;
|
const { streams } = this;
|
||||||
const streams = this.player.streams;
|
|
||||||
if (streams.opus) streams.opus.unpipe(this);
|
if (streams.opus) streams.opus.unpipe(this);
|
||||||
if (streams.ffmpeg) streams.ffmpeg.destroy();
|
if (streams.ffmpeg) streams.ffmpeg.destroy();
|
||||||
super._destroy(err, cb);
|
super._destroy(err, cb);
|
||||||
@@ -123,7 +123,12 @@ class StreamDispatcher extends Writable {
|
|||||||
* If set to 'auto', the voice channel's bitrate will be used
|
* If set to 'auto', the voice channel's bitrate will be used
|
||||||
* @returns {boolean} true if the bitrate has been successfully changed.
|
* @returns {boolean} true if the bitrate has been successfully changed.
|
||||||
*/
|
*/
|
||||||
setBitrate(value) { return this.player.setBitrate(value); }
|
setBitrate(value) {
|
||||||
|
if (!value || !this.streams.opus || !this.streams.opus.setBitrate) return false;
|
||||||
|
const bitrate = value === 'auto' ? this.player.voiceConnection.channel.bitrate : value;
|
||||||
|
this.streams.opus.setBitrate(bitrate * 1000);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
_step(done) {
|
_step(done) {
|
||||||
if (this.pausedSince) {
|
if (this.pausedSince) {
|
||||||
@@ -191,7 +196,7 @@ class StreamDispatcher extends Writable {
|
|||||||
this.emit('speaking', value);
|
this.emit('speaking', value);
|
||||||
}
|
}
|
||||||
|
|
||||||
get volumeEditable() { return Boolean(this.player.streams.volume); }
|
get volumeEditable() { return Boolean(this.streams.volume); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether or not the Opus bitrate of this stream is editable
|
* Whether or not the Opus bitrate of this stream is editable
|
||||||
@@ -200,12 +205,12 @@ class StreamDispatcher extends Writable {
|
|||||||
|
|
||||||
// Volume
|
// Volume
|
||||||
get volume() {
|
get volume() {
|
||||||
return this.player.streams.volume ? this.player.streams.volume.volume : 1;
|
return this.streams.volume ? this.streams.volume.volume : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
setVolume(value) {
|
setVolume(value) {
|
||||||
if (!this.player.streams.volume) return false;
|
if (!this.streams.volume) return false;
|
||||||
this.player.streams.volume.setVolume(value);
|
this.streams.volume.setVolume(value);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ class AudioPlayer extends EventEmitter {
|
|||||||
*/
|
*/
|
||||||
this.voiceConnection = voiceConnection;
|
this.voiceConnection = voiceConnection;
|
||||||
|
|
||||||
this.streams = {};
|
|
||||||
this.dispatcher = null;
|
this.dispatcher = null;
|
||||||
|
|
||||||
this.streamingData = {
|
this.streamingData = {
|
||||||
@@ -47,45 +46,33 @@ class AudioPlayer extends EventEmitter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the bitrate of the current Opus encoder.
|
|
||||||
* @param {number} value New bitrate, in kbps
|
|
||||||
* If set to 'auto', the voice channel's bitrate will be used
|
|
||||||
* @returns {boolean} true if the bitrate has been successfully changed.
|
|
||||||
*/
|
|
||||||
setBitrate(value) {
|
|
||||||
if (!value || !this.streams.opus || !this.streams.opus.setBitrate) return false;
|
|
||||||
const bitrate = value === 'auto' ? this.voiceConnection.channel.bitrate : value;
|
|
||||||
this.streams.opus.setBitrate(bitrate * 1000);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
playUnknownStream(stream, options = {}) {
|
playUnknownStream(stream, options = {}) {
|
||||||
this.destroyDispatcher();
|
this.destroyDispatcher();
|
||||||
const ffmpeg = this.streams.ffmpeg = new prism.FFmpeg({ args: FFMPEG_ARGUMENTS });
|
const ffmpeg = new prism.FFmpeg({ args: FFMPEG_ARGUMENTS });
|
||||||
stream.pipe(ffmpeg);
|
stream.pipe(ffmpeg);
|
||||||
return this.playPCMStream(ffmpeg, options);
|
return this.playPCMStream(ffmpeg, options, { ffmpeg });
|
||||||
}
|
}
|
||||||
|
|
||||||
playPCMStream(stream, options = {}) {
|
playPCMStream(stream, options = {}, streams = {}) {
|
||||||
this.destroyDispatcher();
|
this.destroyDispatcher();
|
||||||
const volume = this.streams.volume = new prism.VolumeTransformer16LE(null, { volume: 0.2 });
|
const volume = streams.volume = new prism.VolumeTransformer16LE(null, { volume: 0.2 });
|
||||||
const opus = this.streams.opus = new prism.opus.Encoder({ channels: 2, rate: 48000, frameSize: 960 });
|
const opus = streams.opus = new prism.opus.Encoder({ channels: 2, rate: 48000, frameSize: 960 });
|
||||||
stream.pipe(volume).pipe(opus);
|
stream.pipe(volume).pipe(opus);
|
||||||
return this.playOpusStream(opus, options);
|
return this.playOpusStream(opus, options, streams);
|
||||||
}
|
}
|
||||||
|
|
||||||
playOpusStream(stream, options = {}) {
|
playOpusStream(stream, options = {}, streams = {}) {
|
||||||
this.destroyDispatcher();
|
this.destroyDispatcher();
|
||||||
const dispatcher = this.dispatcher = this.createDispatcher(options);
|
streams.opus = stream;
|
||||||
|
const dispatcher = this.dispatcher = this.createDispatcher(options, streams);
|
||||||
stream.pipe(dispatcher);
|
stream.pipe(dispatcher);
|
||||||
return dispatcher;
|
return dispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
createDispatcher({ seek = 0, volume = 1, passes = 1 } = {}) {
|
createDispatcher({ seek = 0, volume = 1, passes = 1 } = {}, streams) {
|
||||||
this.destroyDispatcher();
|
this.destroyDispatcher();
|
||||||
const options = { seek, volume, passes };
|
const options = { seek, volume, passes };
|
||||||
const dispatcher = new StreamDispatcher(this, options);
|
const dispatcher = new StreamDispatcher(this, options, streams);
|
||||||
dispatcher.on('speaking', value => this.voiceConnection.setSpeaking(value));
|
dispatcher.on('speaking', value => this.voiceConnection.setSpeaking(value));
|
||||||
return dispatcher;
|
return dispatcher;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user