diff --git a/src/client/voice/VoiceConnection.js b/src/client/voice/VoiceConnection.js index 54ab5707c..5dbd9c4e4 100644 --- a/src/client/voice/VoiceConnection.js +++ b/src/client/voice/VoiceConnection.js @@ -41,6 +41,7 @@ class VoiceConnection extends EventEmitter { this.player.on('error', e => { this.emit('warn', e); + console.log('so yeah uh'+e); this.player.cleanup(); }); diff --git a/src/client/voice/VoiceWebSocket.js b/src/client/voice/VoiceWebSocket.js index e2d13be16..688951c5c 100644 --- a/src/client/voice/VoiceWebSocket.js +++ b/src/client/voice/VoiceWebSocket.js @@ -77,7 +77,6 @@ class VoiceWebSocket extends EventEmitter { send(data) { return new Promise((resolve, reject) => { if (this.ws.readyState === WebSocket.OPEN) { - console.log('sending', data); this.ws.send(data, null, error => { if (error) { reject(error); diff --git a/src/client/voice/dispatcher/StreamDispatcher.js b/src/client/voice/dispatcher/StreamDispatcher.js index 068ff4104..47832e1ae 100644 --- a/src/client/voice/dispatcher/StreamDispatcher.js +++ b/src/client/voice/dispatcher/StreamDispatcher.js @@ -132,7 +132,7 @@ class StreamDispatcher extends EventEmitter { _sendBuffer(buffer, sequence, timestamp) { let repeats = this.passes; const packet = this._createPacket(sequence, timestamp, this.player.opusEncoder.encode(buffer)); - while (repeats--) this.player.voiceConnection.sockets.udp.send(packet); + while (repeats--) this.player.voiceConnection.sockets.udp.send(packet).catch(e => console.log('so uhhh', e)); } _createPacket(sequence, timestamp, buffer) { diff --git a/src/client/voice/pcm/FfmpegConverterEngine.js b/src/client/voice/pcm/FfmpegConverterEngine.js index 21d0449c3..2d54ac23e 100644 --- a/src/client/voice/pcm/FfmpegConverterEngine.js +++ b/src/client/voice/pcm/FfmpegConverterEngine.js @@ -7,9 +7,36 @@ class PCMConversionProcess extends EventEmitter { constructor(process) { super(); this.process = process; + this.input = null; this.process.on('error', e => this.emit('error', e)); } + setInput(stream) { + this.input = stream; + stream.pipe(this.process.stdin, { end: false }); + this.input.on('error', e => this.emit('error', e)); + } + + destroy() { + this.emit('debug', 'destroying a ffmpeg process:'); + if (this.input && this.input.unpipe && this.process.stdin) { + this.input.unpipe(this.process.stdin); + this.emit('unpiped the user input stream from the process input stream'); + } + if (this.process.stdin) { + this.process.stdin.end(); + this.emit('ended the process stdin'); + } + if (this.process.stdin.destroy) { + this.process.stdin.destroy(); + this.emit('destroyed the process stdin'); + } + if (this.process.kill) { + this.process.kill(); + this.emit('killed the process'); + } + } + } class FfmpegConverterEngine extends ConverterEngine { diff --git a/src/client/voice/player/AudioPlayer.js b/src/client/voice/player/AudioPlayer.js index bb0494450..c518f307f 100644 --- a/src/client/voice/player/AudioPlayer.js +++ b/src/client/voice/player/AudioPlayer.js @@ -26,9 +26,10 @@ class AudioPlayer extends EventEmitter { stream.on('end', () => { console.log(Date.now(), 'real input stream ended'); - }) + }); + stream.on('error', e => this.emit('error', e)); const conversionProcess = this.audioToPCM.createConvertStream(0); - stream.pipe(conversionProcess.process.stdin, { end: false }); + conversionProcess.setInput(stream); return this.playPCMStream(conversionProcess.process.stdout, conversionProcess); } @@ -37,12 +38,7 @@ class AudioPlayer extends EventEmitter { console.log(Date.now(), 'clean up triggered due to', reason); const filter = checkStream && this.currentDispatcher && this.currentDispatcher.stream === checkStream; if (this.currentConverter && (checkStream ? filter : true)) { - if (this.currentConverter.process.stdin.destroy) { - this.currentConverter.process.stdin.destroy(); - } - if (this.currentConverter.process.kill) { - this.currentConverter.process.kill(); - } + this.currentConverter.destroy(); this.currentConverter = null; } } @@ -65,6 +61,7 @@ class AudioPlayer extends EventEmitter { dispatcher.on('end', () => this.cleanup(dispatcher.stream, 'disp ended')); dispatcher.on('speaking', value => this.voiceConnection.setSpeaking(value)); this.currentDispatcher = dispatcher; + return dispatcher; } } diff --git a/test/random.js b/test/random.js index 32adab2d8..b7ec51d11 100644 --- a/test/random.js +++ b/test/random.js @@ -26,7 +26,6 @@ client.on('channelCreate', channel => { console.log(`made ${channel.name}`); }); -client.on('debug', m => console.log('debug', m)); client.on('error', m => console.log('debug', m)); client.on('reconnecting', m => console.log('debug', m));