diff --git a/src/client/voice/player/BasePlayer.js b/src/client/voice/player/BasePlayer.js index db5229c2f..cb2198ea5 100644 --- a/src/client/voice/player/BasePlayer.js +++ b/src/client/voice/player/BasePlayer.js @@ -69,8 +69,17 @@ class BasePlayer extends EventEmitter { playOpusStream(stream, options, streams = {}) { this.destroyDispatcher(); streams.opus = stream; + if (options.volume !== false && !streams.input) { + streams.input = stream; + const decoder = new prism.opus.Decoder({ channels: 2, rate: 48000, frameSize: 960 }); + const volume = streams.volume = new prism.VolumeTransformer16LE(null, { volume: options ? options.volume : 1 }); + streams.opus = stream + .pipe(decoder) + .pipe(volume) + .pipe(new prism.opus.Encoder({ channels: 2, rate: 48000, frameSize: 960 })); + } const dispatcher = this.createDispatcher(options, streams); - stream.pipe(dispatcher); + streams.opus.pipe(dispatcher); return dispatcher; } diff --git a/src/client/voice/util/PlayInterface.js b/src/client/voice/util/PlayInterface.js index ebcb1378e..c2285c241 100644 --- a/src/client/voice/util/PlayInterface.js +++ b/src/client/voice/util/PlayInterface.js @@ -72,10 +72,10 @@ class PlayInterface { return this.player.playOpusStream(resource, options); } else if (type === 'ogg/opus') { if (!(resource instanceof Readable)) throw new Error('VOICE_PRISM_DEMUXERS_NEED_STREAM'); - return this.player.playOpusStream(resource.pipe(new prism.OggOpusDemuxer())); + return this.player.playOpusStream(resource.pipe(new prism.OggOpusDemuxer()), options); } else if (type === 'webm/opus') { if (!(resource instanceof Readable)) throw new Error('VOICE_PRISM_DEMUXERS_NEED_STREAM'); - return this.player.playOpusStream(resource.pipe(new prism.WebmOpusDemuxer())); + return this.player.playOpusStream(resource.pipe(new prism.WebmOpusDemuxer()), options); } throw new Error('VOICE_PLAY_INTERFACE_BAD_TYPE'); }