"yeah we need voice broadcasts cause we make big big music bots" no stop

This commit is contained in:
Amish Shah
2017-10-26 21:00:53 +01:00
parent 3696b4a810
commit bdf8955098
7 changed files with 200 additions and 371 deletions

View File

@@ -1,21 +1,13 @@
const EventEmitter = require('events').EventEmitter;
const prism = require('prism-media');
const StreamDispatcher = require('../dispatcher/StreamDispatcher');
const FFMPEG_ARGUMENTS = [
'-analyzeduration', '0',
'-loglevel', '0',
'-f', 's16le',
'-ar', '48000',
'-ac', '2',
];
const BasePlayer = require('./BasePlayer');
/**
* An Audio Player for a Voice Connection.
* @private
* @extends {EventEmitter}
*/
class AudioPlayer extends EventEmitter {
class AudioPlayer extends BasePlayer {
constructor(voiceConnection) {
super();
/**
@@ -23,60 +15,11 @@ class AudioPlayer extends EventEmitter {
* @type {VoiceConnection}
*/
this.voiceConnection = voiceConnection;
this.dispatcher = null;
this.streamingData = {
channels: 2,
sequence: 0,
timestamp: 0,
};
this.voiceConnection.once('closing', () => this.destroy());
}
destroy() {
this.destroyDispatcher();
}
destroyDispatcher() {
if (this.dispatcher) {
this.dispatcher.destroy();
this.dispatcher = null;
}
}
playUnknownStream(stream, options) {
this.destroyDispatcher();
const ffmpeg = new prism.FFmpeg({ args: FFMPEG_ARGUMENTS });
stream.pipe(ffmpeg);
return this.playPCMStream(ffmpeg, options, { ffmpeg });
}
playPCMStream(stream, options, streams = {}) {
this.destroyDispatcher();
const opus = streams.opus = new prism.opus.Encoder({ channels: 2, rate: 48000, frameSize: 960 });
if (options && options.volume === false) {
stream.pipe(opus);
return this.playOpusStream(opus, options, streams);
}
const volume = streams.volume = new prism.VolumeTransformer16LE(null, { volume: options ? options.volume : 1 });
stream.pipe(volume).pipe(opus);
return this.playOpusStream(opus, options, streams);
}
playOpusStream(stream, options, streams = {}) {
this.destroyDispatcher();
streams.opus = stream;
const dispatcher = this.dispatcher = this.createDispatcher(options, streams);
stream.pipe(dispatcher);
return dispatcher;
}
createDispatcher(options, streams) {
this.destroyDispatcher();
const dispatcher = new StreamDispatcher(this, options, streams);
dispatcher.on('speaking', value => this.voiceConnection.setSpeaking(value));
playBroadcast(broadcast, options) {
const dispatcher = this.createDispatcher(options, { broadcast });
broadcast.dispatchers.push(dispatcher);
return dispatcher;
}
}

View File

@@ -0,0 +1,76 @@
const EventEmitter = require('events').EventEmitter;
const prism = require('prism-media');
const StreamDispatcher = require('../dispatcher/StreamDispatcher');
const FFMPEG_ARGUMENTS = [
'-analyzeduration', '0',
'-loglevel', '0',
'-f', 's16le',
'-ar', '48000',
'-ac', '2',
];
/**
* An Audio Player for a Voice Connection.
* @private
* @extends {EventEmitter}
*/
class BasePlayer extends EventEmitter {
constructor(voiceConnection) {
super();
this.dispatcher = null;
this.streamingData = {
channels: 2,
sequence: 0,
timestamp: 0,
};
}
destroy() {
this.destroyDispatcher();
}
destroyDispatcher() {
if (this.dispatcher) {
this.dispatcher.destroy();
this.dispatcher = null;
}
}
playUnknownStream(stream, options) {
this.destroyDispatcher();
const ffmpeg = new prism.FFmpeg({ args: FFMPEG_ARGUMENTS });
stream.pipe(ffmpeg);
return this.playPCMStream(ffmpeg, options, { ffmpeg });
}
playPCMStream(stream, options, streams = {}) {
this.destroyDispatcher();
const opus = streams.opus = new prism.opus.Encoder({ channels: 2, rate: 48000, frameSize: 960 });
if (options && options.volume === false) {
stream.pipe(opus);
return this.playOpusStream(opus, options, streams);
}
const volume = streams.volume = new prism.VolumeTransformer16LE(null, { volume: options ? options.volume : 1 });
stream.pipe(volume).pipe(opus);
return this.playOpusStream(opus, options, streams);
}
playOpusStream(stream, options, streams = {}) {
this.destroyDispatcher();
streams.opus = stream;
const dispatcher = this.createDispatcher(options, streams);
stream.pipe(dispatcher);
return dispatcher;
}
createDispatcher(options, streams, broadcast) {
this.destroyDispatcher();
const dispatcher = this.dispatcher = new StreamDispatcher(this, options, streams, broadcast);
return dispatcher;
}
}
module.exports = BasePlayer;

View File

@@ -0,0 +1,27 @@
const prism = require('prism-media');
const BroadcastDispatcher = require('../dispatcher/BroadcastDispatcher');
const BasePlayer = require('./BasePlayer');
/**
* An Audio Player for a Voice Connection.
* @private
* @extends {EventEmitter}
*/
class AudioPlayer extends BasePlayer {
constructor(broadcast) {
super();
/**
* The broadcast that the player serves
* @type {VoiceBroadcast}
*/
this.broadcast = broadcast;
}
createDispatcher(options, streams) {
this.destroyDispatcher();
const dispatcher = new BroadcastDispatcher(this, options, streams);
return dispatcher;
}
}
module.exports = AudioPlayer;