diff --git a/lib/Voice/VoiceConnection.js b/lib/Voice/VoiceConnection.js index 8883372d0..ca811dcb4 100644 --- a/lib/Voice/VoiceConnection.js +++ b/lib/Voice/VoiceConnection.js @@ -5,6 +5,27 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var WebSocket = require("ws"); var dns = require("dns"); var udp = require("dgram"); +var Lame = require("lame"); +var Opus = require('node-opus'); +var Wav = require('wav'); +var fs = require("fs"); + +function VoicePacket(packet, sequence, timestamp, ssrc) { + var audioBuffer = packet; + var retBuff = new Buffer(audioBuffer.length + 12); + retBuff.fill(0); + retBuff[0] = 0x80; + retBuff[1] = 0x78; + retBuff.writeUIntBE(sequence, 2, 2); + retBuff.writeUIntBE(timestamp, 4, 4); + retBuff.writeUIntBE(ssrc, 8, 4); + + for (var i = 0; i < audioBuffer.length; i++) { + retBuff[i + 12] = audioBuffer[i]; + } + + return retBuff; +} var VoiceConnection = (function () { function VoiceConnection(channel, client, session, token, server, endpoint) { @@ -22,6 +43,68 @@ var VoiceConnection = (function () { this.init(); } + VoiceConnection.prototype.test = function test() { + var self = this; + var startTime = Date.now(); + var cnt = 0; + function sendAudio(sequence, timestamp, opusEncoder, wavOutput, udpClient, vWS) { + cnt++; + var buff = wavOutput.read(1920); + if (buff && buff.length === 1920) { + sequence + 20 < 65535 ? sequence += 1 : sequence = 0; + timestamp + 9600 < 4294967295 ? timestamp += 960 : timestamp = 0; + + var encoded = opusEncoder.encode(buff, 1920); + var audioPacket = VoicePacket(encoded, sequence, timestamp, self.vWSData.ssrc); + + var nextTime = startTime + cnt * 20; + + udpClient.send(audioPacket, 0, audioPacket.length, self.vWSData.port, self.endpoint, function (err) {}); + setTimeout(function () { + sendAudio(sequence, timestamp, opusEncoder, wavOutput, udpClient, vWS); + }, 20 + (nextTime - new Date().getTime())); + } else { + var speaking = { + "op": 5, + "d": { + "speaking": false, + "delay": 0 + } + }; + vWS.send(JSON.stringify(speaking)); + } + } + + var speaking = { + "op": 5, + "d": { + "speaking": true, + "delay": 0 + } + }; + + var vWS = self.vWS; + var stream = fs.createReadStream("c:/users/amish/desktop/audio.wav"); + + vWS.send(JSON.stringify(speaking)); + + var rate = 48000; + var opusEncoder = new Opus.OpusEncoder(48000, 1); + var wavReader = new Wav.Reader(); + wavReader.on('format', function (format) { + console.log(format); + }); + var wavOutput = stream.pipe(wavReader); + + var sequence = 0; + var timestamp = 0; + + wavOutput.on('readable', function () { + console.log("readable!"); + sendAudio(sequence, timestamp, opusEncoder, wavOutput, self.udp, vWS); + }); + }; + VoiceConnection.prototype.init = function init() { var _this = this; @@ -101,6 +184,8 @@ var VoiceConnection = (function () { self.mode = data.d.mode; console.log("ready!!!"); + self.test(); + break; } }); diff --git a/src/Voice/VoiceConnection.js b/src/Voice/VoiceConnection.js index 2ea72757b..799e7b99e 100644 --- a/src/Voice/VoiceConnection.js +++ b/src/Voice/VoiceConnection.js @@ -3,6 +3,27 @@ var WebSocket = require("ws"); var dns = require("dns"); var udp = require("dgram"); +var Lame = require("lame"); +var Opus = require('node-opus'); +var Wav = require('wav'); +var fs = require("fs"); + +function VoicePacket(packet, sequence, timestamp, ssrc) { + var audioBuffer = packet; + var retBuff = new Buffer(audioBuffer.length + 12); + retBuff.fill(0); + retBuff[0] = 0x80; + retBuff[1] = 0x78; + retBuff.writeUIntBE(sequence, 2, 2); + retBuff.writeUIntBE(timestamp, 4, 4); + retBuff.writeUIntBE(ssrc, 8, 4); + + for (var i = 0; i < audioBuffer.length; i++) { + retBuff[i + 12] = audioBuffer[i]; + } + + return retBuff; +} class VoiceConnection { constructor(channel, client, session, token, server, endpoint) { @@ -18,6 +39,70 @@ class VoiceConnection { this.init(); } + test() { + var self = this; + var startTime = Date.now(); + var cnt = 0; + function sendAudio(sequence, timestamp, opusEncoder, wavOutput, udpClient, vWS) { + cnt++; + var buff = wavOutput.read(1920); + if (buff && buff.length === 1920) { + sequence + 20 < 65535 ? sequence += 1 : sequence = 0; + timestamp + 9600 < 4294967295 ? timestamp += 960 : timestamp = 0; + + var encoded = opusEncoder.encode(buff, 1920); + var audioPacket = VoicePacket(encoded, sequence, timestamp, self.vWSData.ssrc); + + var nextTime = startTime + cnt * 20; + + udpClient.send(audioPacket, 0, audioPacket.length, self.vWSData.port, self.endpoint, function (err) { }); + setTimeout(function () { + sendAudio(sequence, timestamp, opusEncoder, wavOutput, udpClient, vWS); + }, 20 + (nextTime - new Date().getTime())); + } else { + var speaking = { + "op": 5, + "d": { + "speaking": false, + "delay": 0 + } + } + vWS.send(JSON.stringify(speaking)); + } + } + + var speaking = { + "op": 5, + "d": { + "speaking": true, + "delay": 0 + } + } + + var vWS = self.vWS; + var stream = fs.createReadStream("c:/users/amish/desktop/audio.wav"); + + vWS.send(JSON.stringify(speaking)); + + var rate = 48000; + var opusEncoder = new Opus.OpusEncoder(48000, 1); + var wavReader = new Wav.Reader(); +wavReader.on('format', function (format) { +console.log(format); +}); + var wavOutput = stream.pipe(wavReader); + + var sequence = 0; + var timestamp = 0; + + wavOutput.on('readable', function () { + console.log("readable!"); + sendAudio(sequence, timestamp, opusEncoder, wavOutput, self.udp, vWS); + }); + + + } + init() { var self = this; dns.lookup(this.endpoint, (err, address, family) => { @@ -74,26 +159,28 @@ class VoiceConnection { switch (data.op) { case 2: self.vWSData = data.d; - + KAI = setInterval(() => { vWS.send(JSON.stringify({ - op : 3, - d : null + op: 3, + d: null })); }, data.d.heartbeat_interval); - + var udpPacket = new Buffer(70); udpPacket.writeUIntBE(data.d.ssrc, 0, 4); udpClient.send(udpPacket, 0, udpPacket.length, data.d.port, self.endpoint, err => { - console.log("err", err); + console.log("err", err); }); break; case 4: - + self.ready = true; self.mode = data.d.mode; console.log("ready!!!"); - + + self.test(); + break; } });