diff --git a/classes/AudioServer.js b/classes/AudioServer.js index 59e7c8c..a79b2d8 100644 --- a/classes/AudioServer.js +++ b/classes/AudioServer.js @@ -155,28 +155,24 @@ class AudioServer { return new Promise(async (resolve, reject) => { this.buffer.written = 0; while (true) { - if (this.buffer.stream.bytesRead === this.buffer.size && buffer.length === 0) { - client.audiosocket.end(() => { - logger.debug(client.getTag() + ' sent audio file \'' + this.buffer.file + '\' after ' + (Date.now() - timestamp) + 'ms...'); - }); - break; - } - if (buffer.length === 0) { - this.buffer.stream.resume(); + if (buffer[0] === undefined) { await sleep(1); continue; - } - if (!this.buffer.stream.isPaused()) { - this.buffer.stream.pause(); } const tmp = buffer[0]; buffer.shift(); + if ((client.audiosocket.bytesWritten + tmp.length) >= this.buffer.size) { + logger.debug(client.getTag() + ' sent audio file \'' + this.buffer.file + '\' after ' + (Date.now() - timestamp) + 'ms...'); + client.audiosocket.end(tmp); + break; + } client.audiosocket.write(tmp); + this.buffer.buffered -= tmp.length; + if (this.buffer.stream.isPaused() && this.buffer.buffered < this.buffer.limit) { + this.buffer.stream.resume(); + logger.debug('resuming read stream'); + } } - - // client.audiosocket.end(() => { - // logger.debug(client.getTag() + ' sent audio file \'' + this.buffer.file + '\' after ' + (Date.now() - timestamp) + 'ms...'); - // }); client.audiosocket.on('error', (error) => { logger.error(client.getTag() + ' encountered an error: ' + error); }); @@ -205,17 +201,27 @@ class AudioServer { async #bufferFile() { // const stream = fs.createReadStream(this.buffer.file); - const buffer = await new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { const timestamp = Date.now(); const buffer = []; let resolved = false; + this.buffer.buffered = 0; this.buffer.stream.on('data', (data) => { + this.buffer.buffered += data.length; buffer.push(data); if (resolved !== true && this.buffer.stream.bytesRead >= this.buffer.threshold) { resolved = true; logger.debug('buffering threshold of ' + this.buffer.threshold + ' bytes for file \'' + this.buffer.file + '\' took ' + (Date.now() - timestamp) + 'ms'); resolve(buffer); } + if (this.buffer.buffered >= this.buffer.limit) { + logger.debug('pausing read stream'); + this.buffer.stream.pause(); + if (resolved !== true) { + resolved = true; + resolve(buffer); + } + } }); this.buffer.stream.on('close', () => { // this.buffer.data = Buffer.concat(buffer); @@ -227,8 +233,6 @@ class AudioServer { reject(error); }); }); - - return buffer; } #getClientById(clientId) { diff --git a/example_config_server.json b/example_config_server.json index 8bbe359..4ede58e 100644 --- a/example_config_server.json +++ b/example_config_server.json @@ -23,6 +23,6 @@ }, "audio": { "threshold": 10, - "bufferlimit": 128 + "bufferlimit": 64 } } \ No newline at end of file