You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2018/03/20 15:55:59 UTC

[openmeetings] branch master updated: [OPENMEETINGS-1854] sound meter is exteacted as separate object, error handling is improved

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 1ae98b4  [OPENMEETINGS-1854] sound meter is exteacted as separate object, error handling is improved
1ae98b4 is described below

commit 1ae98b4445889253a194d1457e6dc5730e8fdc0d
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Tue Mar 20 22:55:47 2018 +0700

    [OPENMEETINGS-1854] sound meter is exteacted as separate object, error handling is improved
---
 .../apache/openmeetings/web/room/settings-base.js  | 108 ++++++++++++++-------
 1 file changed, 72 insertions(+), 36 deletions(-)

diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings-base.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings-base.js
index d0fb566..687c597 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings-base.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings-base.js
@@ -1,8 +1,65 @@
 /* Licensed under the Apache License, Version 2.0 (the "License") http://www.apache.org/licenses/LICENSE-2.0 */
+var MicLevel = (function() {
+	let ctx, analyser, mic, script;
+
+	function _meter(cnts, rtcPeer, _micActivity, _error) {
+		if (!rtcPeer || 'function' !== typeof(rtcPeer.getLocalStream)) {
+			return;
+		}
+		const stream = rtcPeer.getLocalStream();
+		if (!stream || stream.getAudioTracks().length < 1) {
+			return;
+		}
+		try {
+			ctx = new AudioContext();
+			analyser = new AnalyserNode(ctx, {
+				fftSize: 512
+				, smoothingTimeConstant: 0.5,
+			});
+			script = ctx.createScriptProcessor(2048, 1, 1);
+			mic = ctx.createMediaStreamSource(stream);
+			mic.connect(script);
+			script.connect(ctx.destination);
+			mic.connect(analyser);
+			analyser.connect(script);
+			const arr =  new Uint8Array(analyser.frequencyBinCount);
+			let t = Date.now();
+			script.onaudioprocess = function(event) {
+				if (Date.now() - t < 200) {
+					return;
+				}
+				t = Date.now();
+				analyser.getByteFrequencyData(arr);
+				let avg = 0.0;
+				for (let i = 0; i < arr.length; ++i) {
+					avg += arr[i];
+				}
+				avg /= arr.length;
+				_micActivity(100 * avg / 255);
+				console.log("avg = " + avg);
+			};
+		} catch (err) {
+			_error(err);
+		}
+	}
+	function _dispose() {
+		if (!!ctx) {
+			mic.disconnect(script);
+			script.disconnect(ctx.destination);
+			mic.disconnect(analyser);
+			analyser.disconnect(script);
+			ctx = null;
+		}
+	}
+	return {
+		meter: _meter
+		, dispose: _dispose
+	};
+});
 var VideoSettings = (function() {
 	let vs, lm, s, cam, mic, res, o, rtcPeer, offerSdp, timer
 		, vidScroll, vid, recBtn, playBtn, recAllowed = false
-		, audioCtx, levelAnalyser, levelMic, levelScript;
+		, errs, level;
 	function _load() {
 		s = Settings.load();
 		if (!s.video) {
@@ -35,12 +92,9 @@ var VideoSettings = (function() {
 		if (!!rtcPeer) {
 			rtcPeer.dispose();
 		}
-		if (!!audioCtx) {
-			levelMic.disconnect(levelScript);
-			levelScript.disconnect(audioCtx.destination);
-			levelMic.disconnect(levelAnalyser);
-			levelAnalyser.disconnect(levelScript);
-			audioCtx = null;
+		if (!!level) {
+			level.dispose();
+			level = null;
 		}
 		offerSdp = null;
 	}
@@ -50,6 +104,9 @@ var VideoSettings = (function() {
 	}
 	function _init(options) {
 		o = JSON.parse(JSON.stringify(options));
+		errs = $('#jsNotifications').kendoNotification({
+			autoHideAfter: 20000
+		}).data("kendoNotification");
 		vs = $('#video-settings');
 		lm = vs.find('.level-meter');
 		cam = vs.find('select.cam');
@@ -186,32 +243,8 @@ var VideoSettings = (function() {
 					if (error) {
 						return _error(error);
 					}
-					audioCtx = new AudioContext();
-					levelAnalyser = new AnalyserNode(audioCtx, {
-						fftSize: 512
-						, smoothingTimeConstant: 0.5,
-					});
-					levelScript = audioCtx.createScriptProcessor(2048, 1, 1);
-					levelMic = audioCtx.createMediaStreamSource(rtcPeer.getLocalStream());
-					levelMic.connect(levelScript);
-					levelScript.connect(audioCtx.destination);
-					levelMic.connect(levelAnalyser);
-					levelAnalyser.connect(levelScript);
-					const arr =  new Uint8Array(levelAnalyser.frequencyBinCount);
-					let t = Date.now();
-					levelScript.onaudioprocess = function(event) {
-						if (Date.now() - t < 200) {
-							return;
-						}
-						t = Date.now();
-						levelAnalyser.getByteFrequencyData(arr);
-						let avg = 0.0;
-						for (let i = 0; i < arr.length; ++i) {
-							avg += arr[i];
-						}
-						avg /= arr.length;
-						_micActivity(100 * avg / 255);
-					};
+					level = MicLevel();
+					level.meter(rtcPeer, _micActivity, _error);
 					rtcPeer.generateOffer(function(error, _offerSdp) {
 						if (error) {
 							return _error('Error generating the offer');
@@ -236,7 +269,10 @@ var VideoSettings = (function() {
 		lm.progressbar("value", Math.max(0, level));
 	}
 	function _error(msg) {
-		//FIXME TODO status field
+		if (typeof(msg) === 'object') {
+			msg = msg.name + ": " + msg.message;
+		}
+		errs.show(msg, "error");
 		return console.error(msg);
 	}
 	function _initDevices() {
@@ -296,7 +332,7 @@ var VideoSettings = (function() {
 				_readValues();
 			})
 			.catch(function(err) {
-				_error(err.name + ": " + err.message);
+				_error(err);
 			});
 	}
 	function _open() {
@@ -340,7 +376,7 @@ var VideoSettings = (function() {
 						timer.hide();
 						break;
 					default:
-						_error('Unrecognized message', m);
+						_error('Unrecognized message: ' + msg);
 				}
 			}
 		} catch (err) {

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.