Move streams to StreamDispatcher

breaking: removed AudioPlayer#setBitrate
This commit is contained in:
Amish Shah
2017-10-26 17:53:10 +01:00
parent a79c9ac11a
commit eeed5f23e3
2 changed files with 25 additions and 33 deletions

View File

@@ -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;
} }

View File

@@ -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;
} }