From 462adfbad36f5b5456c5ee0056b8534e135f1291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Pet=C3=B6?= Date: Sat, 19 Mar 2016 21:54:25 +0100 Subject: [PATCH] Add ability to pause and resume audio thats being played --- lib/Util/TokenCacher-shim.js | 24 ++++++++++++------------ lib/Voice/VoiceConnection.js | 18 ++++++++++++++++++ lib/Voice/VolumeTransformer.js | 4 ++++ src/Voice/VoiceConnection.js | 20 +++++++++++++++++++- 4 files changed, 53 insertions(+), 13 deletions(-) diff --git a/lib/Util/TokenCacher-shim.js b/lib/Util/TokenCacher-shim.js index f483e9575..53412d365 100644 --- a/lib/Util/TokenCacher-shim.js +++ b/lib/Util/TokenCacher-shim.js @@ -6,23 +6,23 @@ exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var TokenCacher = (function () { - function TokenCacher() { - _classCallCheck(this, TokenCacher); - } + function TokenCacher() { + _classCallCheck(this, TokenCacher); + } - TokenCacher.prototype.setToken = function setToken() {}; + TokenCacher.prototype.setToken = function setToken() {}; - TokenCacher.prototype.save = function save() {}; + TokenCacher.prototype.save = function save() {}; - TokenCacher.prototype.getToken = function getToken() { - return null; - }; + TokenCacher.prototype.getToken = function getToken() { + return null; + }; - TokenCacher.prototype.init = function init(ind) { - this.done = true; - }; + TokenCacher.prototype.init = function init(ind) { + this.done = true; + }; - return TokenCacher; + return TokenCacher; })(); exports["default"] = TokenCacher; diff --git a/lib/Voice/VoiceConnection.js b/lib/Voice/VoiceConnection.js index 6ca2b2573..684ea65e1 100644 --- a/lib/Voice/VoiceConnection.js +++ b/lib/Voice/VoiceConnection.js @@ -85,6 +85,7 @@ var VoiceConnection = (function (_EventEmitter) { this.secret = null; this.volume = new _VolumeTransformer2["default"](); + this.paused = false; this.init(); } @@ -143,6 +144,11 @@ var VoiceConnection = (function (_EventEmitter) { this.playingIntent = retStream; function send() { + if (self.paused) { + startTime += Date.now() - (startTime + count * length); + setTimeout(send, length); + return; + } if (!self.playingIntent || !self.playing) { self.setSpeaking(false); retStream.emit("end"); @@ -466,6 +472,18 @@ var VoiceConnection = (function (_EventEmitter) { this.lastVolume = undefined; }; + VoiceConnection.prototype.pause = function pause() { + this.paused = true; + this.setSpeaking(false); + this.playingIntent.emit("pause"); + }; + + VoiceConnection.prototype.resume = function resume() { + this.paused = false; + this.setSpeaking(true); + this.playingIntent.emit("resume"); + }; + return VoiceConnection; })(_events2["default"]); diff --git a/lib/Voice/VolumeTransformer.js b/lib/Voice/VolumeTransformer.js index accedab11..309bb8dbd 100644 --- a/lib/Voice/VolumeTransformer.js +++ b/lib/Voice/VolumeTransformer.js @@ -8,6 +8,10 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' var Transform = require('stream').Transform; +/** + * @see https://github.com/reneraab/pcm-volume/blob/master/index.js Inspired by this script + */ + var Volume = (function (_Transform) { _inherits(Volume, _Transform); diff --git a/src/Voice/VoiceConnection.js b/src/Voice/VoiceConnection.js index 89498e8b9..9e43cfdff 100644 --- a/src/Voice/VoiceConnection.js +++ b/src/Voice/VoiceConnection.js @@ -47,6 +47,7 @@ export default class VoiceConnection extends EventEmitter { this.secret = null; this.volume = new VolumeTransformer(); + this.paused = false; this.init(); } @@ -105,6 +106,11 @@ export default class VoiceConnection extends EventEmitter { this.playingIntent = retStream; function send() { + if(self.paused) { + startTime += Date.now() - (startTime + count * length); + setTimeout(send, length); + return; + } if (!self.playingIntent || !self.playing) { self.setSpeaking(false); retStream.emit("end"); @@ -281,7 +287,7 @@ export default class VoiceConnection extends EventEmitter { } if (typeof options !== "object") { options = {}; - } + } options.volume = options.volume !== undefined ? options.volume : this.getVolume(); return new Promise((resolve, reject) => { this.encoder @@ -421,4 +427,16 @@ export default class VoiceConnection extends EventEmitter { this.setVolume(this.lastVolume); this.lastVolume = undefined; } + + pause() { + this.paused = true; + this.setSpeaking(false); + this.playingIntent.emit("pause"); + } + + resume() { + this.paused = false; + this.setSpeaking(true); + this.playingIntent.emit("resume"); + } }