From db6e7254895abaa3d6c9e4e2c51a5433e75396cd Mon Sep 17 00:00:00 2001 From: Miroslav Pejic Date: Thu, 7 Sep 2023 16:15:41 +0200 Subject: [PATCH] [mirotalksfu] - improve getMicrophoneVolumeIndicator --- public/js/Room.js | 48 +++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/public/js/Room.js b/public/js/Room.js index 902b17e6..ae9368c9 100644 --- a/public/js/Room.js +++ b/public/js/Room.js @@ -401,22 +401,24 @@ function addChild(device, els) { // #################################################### function getMicrophoneVolumeIndicator(stream) { - stopMicrophoneProcessing(); - const audioContext = new (window.AudioContext || window.webkitAudioContext)(); - const microphone = audioContext.createMediaStreamSource(stream); - scriptProcessor = audioContext.createScriptProcessor(1024, 1, 1); - scriptProcessor.onaudioprocess = function (event) { - const inputBuffer = event.inputBuffer.getChannelData(0); - let sum = 0; - for (let i = 0; i < inputBuffer.length; i++) { - sum += inputBuffer[i] * inputBuffer[i]; - } - const rms = Math.sqrt(sum / inputBuffer.length); - const volume = Math.max(0, Math.min(1, rms * 10)); - updateVolumeIndicator(volume); - }; - microphone.connect(scriptProcessor); - scriptProcessor.connect(audioContext.destination); + if (isAudioContextSupported() && hasAudioTrack(stream)) { + stopMicrophoneProcessing(); + const audioContext = new (window.AudioContext || window.webkitAudioContext)(); + const microphone = audioContext.createMediaStreamSource(stream); + scriptProcessor = audioContext.createScriptProcessor(1024, 1, 1); + scriptProcessor.onaudioprocess = function (event) { + const inputBuffer = event.inputBuffer.getChannelData(0); + let sum = 0; + for (let i = 0; i < inputBuffer.length; i++) { + sum += inputBuffer[i] * inputBuffer[i]; + } + const rms = Math.sqrt(sum / inputBuffer.length); + const volume = Math.max(0, Math.min(1, rms * 10)); + updateVolumeIndicator(volume); + }; + microphone.connect(scriptProcessor); + scriptProcessor.connect(audioContext.destination); + } } function stopMicrophoneProcessing() { @@ -436,6 +438,20 @@ function updateVolumeIndicator(volume) { }); } +function isAudioContextSupported() { + return !!(window.AudioContext || window.webkitAudioContext); +} + +function hasAudioTrack(mediaStream) { + const audioTracks = mediaStream.getAudioTracks(); + return audioTracks.length > 0; +} + +function hasVideoTrack(mediaStream) { + const videoTracks = mediaStream.getVideoTracks(); + return videoTracks.length > 0; +} + // #################################################### // API CHECK // ####################################################