From 4b88066f26a42f3b57036b4a3945d64269689fcf Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sun, 1 May 2016 22:29:29 -0700 Subject: [PATCH] GUACAMOLE-25: Only capture as long as stream is open. --- .../src/main/webapp/modules/AudioRecorder.js | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/guacamole-common-js/src/main/webapp/modules/AudioRecorder.js b/guacamole-common-js/src/main/webapp/modules/AudioRecorder.js index a75dbe102..43394e53f 100644 --- a/guacamole-common-js/src/main/webapp/modules/AudioRecorder.js +++ b/guacamole-common-js/src/main/webapp/modules/AudioRecorder.js @@ -212,6 +212,14 @@ Guacamole.RawAudioRecorder = function RawAudioRecorder(stream, mimetype) { */ var writtenSamples = 0; + /** + * The audio stream provided by the browse, if allowed. If no stream has + * yet been received, this will be null. + * + * @type MediaStream + */ + var mediaStream = null; + /** * The source node providing access to the local audio input device. * @@ -386,9 +394,17 @@ Guacamole.RawAudioRecorder = function RawAudioRecorder(stream, mimetype) { if (processor) processor.disconnect(); + // Stop capture + if (mediaStream) { + var tracks = mediaStream.getTracks(); + for (var i = 0; i < tracks.length; i++) + tracks[i].stop(); + } + // Remove references to now-unneeded components processor = null; source = null; + mediaStream = null; writer.sendEnd(); return; @@ -396,7 +412,7 @@ Guacamole.RawAudioRecorder = function RawAudioRecorder(stream, mimetype) { } // Attempt to retrieve an audio input stream from the browser - getUserMedia({ 'audio' : true }, function streamReceived(mediaStream) { + getUserMedia({ 'audio' : true }, function streamReceived(stream) { // Create processing node which receives appropriately-sized audio buffers processor = context.createScriptProcessor(BUFFER_SIZE, format.channels, format.channels); @@ -408,9 +424,12 @@ Guacamole.RawAudioRecorder = function RawAudioRecorder(stream, mimetype) { }; // Connect processing node to user's audio input source - source = context.createMediaStreamSource(mediaStream); + source = context.createMediaStreamSource(stream); source.connect(processor); + // Save stream for later cleanup + mediaStream = stream; + }, function streamDenied() { // Simply end stream if audio access is not allowed