From fc31df3fcfa02908fc3d4798430c421f6cd6ddd4 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 7 Nov 2015 18:57:23 +0000 Subject: [PATCH] Tidy up of code --- lib/Voice/VoiceConnection.js | 84 ++++++++++++++++++--------- src/Voice/VoiceConnection.js | 108 +++++++++++++++++++++-------------- 2 files changed, 122 insertions(+), 70 deletions(-) diff --git a/lib/Voice/VoiceConnection.js b/lib/Voice/VoiceConnection.js index 5faf7fe12..e737cae4a 100644 --- a/lib/Voice/VoiceConnection.js +++ b/lib/Voice/VoiceConnection.js @@ -32,6 +32,7 @@ var VoiceConnection = (function () { this.udp = null; this.playingIntent = null; this.playing = false; + this.streamTime = 0; this.init(); } @@ -55,6 +56,7 @@ var VoiceConnection = (function () { } var retStream = new StreamIntent(); + var onWarning = false; self.playingIntent = retStream; function send() { @@ -70,25 +72,36 @@ var VoiceConnection = (function () { if (!buffer) { setTimeout(send, length * 10); // give chance for some data in 200ms to appear + return; } - if (buffer && buffer.length === 1920) { - count++; - sequence + 10 < 65535 ? sequence += 1 : sequence = 0; - time + 9600 < 4294967295 ? time += 960 : time = 0; - - self.sendBuffer(buffer, sequence, time, function (e) {}); - - var nextTime = startTime + count * length; - - setTimeout(function () { - send(); - }, length + (nextTime - Date.now())); - if (!self.playing) self.setSpeaking(true); - } else { - retStream.emit("end"); - self.setSpeaking(false); + if (buffer.length !== 1920) { + if (onWarning) { + retStream.emit("end"); + stream.destroy(); + self.setSpeaking(false); + return; + } else { + onWarning = true; + setTimeout(send, length * 10); // give chance for some data in 200ms to appear + return; + } } + + count++; + sequence + 10 < 65535 ? sequence += 1 : sequence = 0; + time + 9600 < 4294967295 ? time += 960 : time = 0; + + self.sendBuffer(buffer, sequence, time, function (e) {}); + + var nextTime = startTime + count * length; + + self.streamTime = count * length; + + setTimeout(send, length + (nextTime - Date.now())); + if (!self.playing) self.setSpeaking(true); + + retStream.emit("time", self.streamTime); } catch (e) { retStream.emit("error", e); } @@ -140,27 +153,42 @@ var VoiceConnection = (function () { }; VoiceConnection.prototype.test = function test() { - var self = this; - this.encoder.encodeFile("C:/users/amish/desktop/audio.mp3")["catch"](error).then(function (stream) { - - var intent = self.playRawStream(stream); - - intent.on("end", function () { - console.log("stream ended"); + this.playFile("C:/users/amish/desktop/audio.mp3").then(function (stream) { + stream.on("time", function (time) { + console.log("Time", time); }); }); - function error() { - console.log("ERROR!"); - } + }; + + VoiceConnection.prototype.playFile = function playFile(stream) { + var _this = this; + + var callback = arguments.length <= 1 || arguments[1] === undefined ? function (err, str) {} : arguments[1]; + + var self = this; + return new Promise(function (resolve, reject) { + _this.encoder.encodeFile(stream)["catch"](error).then(function (stream) { + + var intent = self.playRawStream(stream); + resolve(intent); + callback(null, intent); + }); + function error() { + var e = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; + + reject(e); + callback(e); + } + }); }; VoiceConnection.prototype.init = function init() { - var _this = this; + var _this2 = this; var self = this; dns.lookup(this.endpoint, function (err, address, family) { self.endpoint = address; - var vWS = self.vWS = new WebSocket("wss://" + _this.endpoint, null, { rejectUnauthorized: false }); + var vWS = self.vWS = new WebSocket("wss://" + _this2.endpoint, null, { rejectUnauthorized: false }); var udpClient = self.udp = udp.createSocket("udp4"); var firstPacket = true; diff --git a/src/Voice/VoiceConnection.js b/src/Voice/VoiceConnection.js index be9cdb032..f035af6ca 100644 --- a/src/Voice/VoiceConnection.js +++ b/src/Voice/VoiceConnection.js @@ -28,10 +28,11 @@ class VoiceConnection { this.udp = null; this.playingIntent = null; this.playing = false; + this.streamTime = 0; this.init(); } - - stopPlaying(){ + + stopPlaying() { this.playingIntent = null; } @@ -45,16 +46,17 @@ class VoiceConnection { var count = 0; var length = 20; - - if(self.playingIntent){ + + if (self.playingIntent) { self.stopPlaying(); } - + var retStream = new StreamIntent(); + var onWarning = false; self.playingIntent = retStream; - + function send() { - if(self.playingIntent && self.playingIntent !== retStream){ + if (self.playingIntent && self.playingIntent !== retStream) { console.log("ending it!"); self.setSpeaking(false); retStream.emit("end"); @@ -63,41 +65,53 @@ class VoiceConnection { try { var buffer = stream.read(1920); - - if(!buffer){ + + if (!buffer) { setTimeout(send, length * 10); // give chance for some data in 200ms to appear + return; } - - if (buffer && buffer.length === 1920) { - count++; - sequence + 10 < 65535 ? sequence += 1 : sequence = 0; - time + 9600 < 4294967295 ? time += 960 : time = 0; - self.sendBuffer(buffer, sequence, time, (e) => { }); - - var nextTime = startTime + (count * length); - - setTimeout(function () { - send(); - }, length + (nextTime - Date.now())); - if(!self.playing) - self.setSpeaking(true); - }else{ - retStream.emit("end"); - self.setSpeaking(false); + if (buffer.length !== 1920) { + if (onWarning) { + retStream.emit("end"); + stream.destroy(); + self.setSpeaking(false); + return; + } else { + onWarning = true; + setTimeout(send, length * 10); // give chance for some data in 200ms to appear + return; + } } + count++; + sequence + 10 < 65535 ? sequence += 1 : sequence = 0; + time + 9600 < 4294967295 ? time += 960 : time = 0; + + self.sendBuffer(buffer, sequence, time, (e) => { }); + + var nextTime = startTime + (count * length); + + self.streamTime = count * length; + + setTimeout(send, length + (nextTime - Date.now())); + if (!self.playing) + self.setSpeaking(true); + + retStream.emit("time", self.streamTime); + + } catch (e) { retStream.emit("error", e); } } self.setSpeaking(true); send(); - + return retStream; } - - setSpeaking(value){ + + setSpeaking(value) { this.playing = value; this.vWS.send(JSON.stringify({ op: 5, @@ -138,22 +152,32 @@ class VoiceConnection { } test() { - var self = this; - this.encoder - .encodeFile("C:/users/amish/desktop/audio.mp3") - .catch(error) + this.playFile("C:/users/amish/desktop/audio.mp3") .then(stream => { - - var intent = self.playRawStream(stream); + stream.on("time", time => { + console.log("Time", time); + }) + }) + } + + playFile(stream, callback = function (err, str) { }) { + var self = this; + return new Promise((resolve, reject) => { + this.encoder + .encodeFile(stream) + .catch(error) + .then(stream => { + + var intent = self.playRawStream(stream); + resolve(intent); + callback(null, intent); - intent.on("end", ()=>{ - console.log("stream ended"); }); - - }); - function error() { - console.log("ERROR!"); - } + function error(e = true) { + reject(e); + callback(e); + } + }) } init() {