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/09/30 15:18:17 UTC

[openmeetings] branch master updated: [OPENMEETINGS-1649] mic level is implemented

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 8b9b190  [OPENMEETINGS-1649] mic level is implemented
8b9b190 is described below

commit 8b9b190f253fe1c8cffda1879f9a0aca8195b918
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sun Sep 30 22:18:05 2018 +0700

    [OPENMEETINGS-1649] mic level is implemented
---
 .../apache/openmeetings/core/remote/KStream.java   |  2 +-
 .../openmeetings/core/remote/KurentoHandler.java   |  2 +-
 .../openmeetings/web/common/OmWebSocketPanel.java  | 24 +++++++++++++++++----
 .../apache/openmeetings/web/room/RoomPanel.html    |  4 +++-
 .../apache/openmeetings/web/room/RoomPanel.java    |  2 +-
 .../apache/openmeetings/web/room/raw-settings.js   |  5 +++--
 .../openmeetings/web/room/raw-video-manager.js     |  5 ++---
 .../org/apache/openmeetings/web/room/raw-video.js  | 25 ++++++++++++++++++++--
 openmeetings-web/src/main/webapp/css/raw-room.css  | 17 ++++++++++++---
 9 files changed, 68 insertions(+), 18 deletions(-)

diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
index f6210ca..cc23bc3 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
@@ -82,7 +82,7 @@ public class KStream implements IKStream {
 		WebSocketHelper.sendRoom(new TextRoomMessage(c.getRoomId(), c, RoomMessage.Type.rightUpdated, c.getUid()));
 		WebSocketHelper.sendRoomOthers(roomId, uid, newKurentoMsg()
 				.put("id", "newStream")
-				.put("client", c.toJson(false)));
+				.put("client", c.toJson(false).put("type", "room"))); // FIXME TODO add multi-stream support
 		return this;
 	}
 
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
index 928700f..eac2458 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
@@ -305,7 +305,7 @@ public class KurentoHandler {
 						.put("id", "broadcast")
 						.put("uid", sd.getUid())
 						.put("stream", new JSONObject(sd))
-						.put("client", c.toJson(true)));
+						.put("client", c.toJson(true).put("type", "room"))); // FIXME TODO add multi-stream support
 				//FIXME TODO update interview buttons
 			} else {
 				//change constraints
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
index 1c7a1cf..f626da9 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
@@ -23,6 +23,7 @@ import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
 import org.apache.openmeetings.core.remote.KurentoHandler;
 import org.apache.openmeetings.core.util.WebSocketHelper;
+import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.basic.IWsClient;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
@@ -86,10 +87,25 @@ public abstract class OmWebSocketPanel extends Panel {
 				final JSONObject m;
 				try {
 					m = new JSONObject(msg.getText());
-					if (KURENTO_TYPE.equals(m.optString("type"))) {
-						kHandler.onMessage(getWsClient(), m);
-					} else {
-						OmWebSocketPanel.this.onMessage(handler, m);
+					switch(m.optString("type", "")) {
+						case KURENTO_TYPE:
+							kHandler.onMessage(getWsClient(), m);
+							break;
+						case "mic":
+						{
+							IWsClient _c = getWsClient();
+							if (!(_c instanceof Client)) {
+								break;
+							}
+							Client c = (Client)_c;
+							if (c.getRoomId() == null) {
+								break;
+							}
+							WebSocketHelper.sendRoomOthers(c.getRoomId(), c.getUid(), m.put("uid", c.getUid()));
+						}
+							break;
+						default:
+							OmWebSocketPanel.this.onMessage(handler, m);
 					}
 				} catch (Exception e) {
 					log.error("Error while processing incoming message", e);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
index d6c38c8..188dec7 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
@@ -42,7 +42,9 @@
 	</div>
 	<div style="display:none">
 		<div id="user-video">
-			<div class="video"></div>
+			<div class="video">
+				<div class="level-meter" wicket:message="title:767"></div>
+			</div>
 			<div class="footer ui-state-highlight">
 				<div class="on"><wicket:message key="video.mic.on"/></div>
 				<div class="off" style="display:none;"><wicket:message key="video.mic.off"/></div>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index 5fc37fb..4d30f1e 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@ -167,7 +167,7 @@ public class RoomPanel extends BasePanel {
 			for (Client c: cm.listByRoom(getRoom().getId())) {
 				//FIXME TODO add multiple streams support
 				if (!c.getStreams().isEmpty()) {
-					sb.append(String.format("VideoManager.play(%s);", c.toJson(false)));
+					sb.append(String.format("VideoManager.play(%s);", c.toJson(false).put("type", "room"))); // FIXME TODO add multi-stream support
 					hasStreams = true;
 				}
 			}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js
index 525a950..75bcd12 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js
@@ -230,7 +230,7 @@ var VideoSettings = (function() {
 				_close();
 			}
 		});
-		lm.progressbar({ value: 0 });
+		lm.kendoProgressBar({ value: 0, showStatus: false });
 		o.width = 300;
 		o.height = 200;
 		o.mode = 'settings';
@@ -250,6 +250,7 @@ var VideoSettings = (function() {
 		recBtn.prop('disabled', !recAllowed || (s.video.cam < 0 && s.video.mic < 0)).button('refresh');
 	}
 	//each bool OR https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints
+	// min/ideal/max/exact/mandatory can also be used
 	function _constraints(c) {
 		const cnts = {};
 		//TODO add check if constraint is supported
@@ -329,7 +330,7 @@ var VideoSettings = (function() {
 		playBtn.prop('disabled', false).button('refresh');
 	}
 	function _micActivity(level) {
-		lm.progressbar("value", Math.max(0, 140 * level)); // magic number
+		lm.getKendoProgressBar().value(140 * level); // magic number
 	}
 	function _setLoading(el) {
 		el.find('option').remove();
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js
index c132cf8..556693b 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js
@@ -96,8 +96,7 @@ var VideoManager = (function() {
 			} else if ('mic' === m.type) {
 				switch (m.id) {
 					case 'activity':
-						_micActivity(m.uid, m.active);
-						_onBroadcast(m);
+						_userSpeaks(m.uid, m.active);
 						break;
 					default:
 						//no-op
@@ -210,7 +209,7 @@ var VideoManager = (function() {
 	function _find(uid) {
 		return $(VID_SEL + ' div[data-client-uid="room' + uid + '"]');
 	}
-	function _micActivity(uid, active) {
+	function _userSpeaks(uid, active) {
 		const u = $('#user' + uid + ' .audio-activity.ui-icon')
 			, v = _find(uid).parent();
 		if (active) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js
index a5285c7..8d01743 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js
@@ -2,7 +2,8 @@
 var Video = (function() {
 	const self = {};
 	let c, v, vc, t, f, size, vol, slider, handle, video, rtcPeer
-		, lastVolume = 50, aCtx, aSrc, aDest, gainNode;
+		, lastVolume = 50, aCtx, aSrc, aDest, gainNode
+		, lm, level, userSpeaks = false;
 
 	function _getName() {
 		return c.user.firstName + ' ' + c.user.lastName;
@@ -30,8 +31,17 @@ var Video = (function() {
 	}
 	function _resize(w, h) {
 		vc.width(w).height(h);
+		lm.height(h - 10);
 		video.width(w).height(h);
 	}
+	function _micActivity(level) {
+		lm.getKendoProgressBar().value(140 * level); // magic number
+		let speaks = level > .02;
+		if (speaks !== userSpeaks) {
+			userSpeaks = speaks;
+			OmUtil.sendMessage({type: 'mic', id: 'activity', active: speaks});
+		}
+	}
 	function _createSendPeer() {
 		const constraints = VideoSettings.constraints(c);
 		navigator.mediaDevices.getUserMedia(constraints)
@@ -39,6 +49,9 @@ var Video = (function() {
 				let _stream = stream;
 				if (stream.getAudioTracks().length !== 0) {
 					vol.show();
+					lm = vc.find('.level-meter')
+						.kendoProgressBar({ value: 0, showStatus: false, orientation: 'vertical' });
+					lm.height(vc.height() - 10);
 					aCtx = new AudioContext();
 					gainNode = aCtx.createGain();
 					aSrc = aCtx.createMediaStreamSource(stream);
@@ -58,6 +71,8 @@ var Video = (function() {
 							if (error) {
 								return OmUtil.error(error);
 							}
+							level = MicLevel();
+							level.meter(rtcPeer, _micActivity, OmUtil.error);
 							this.generateOffer(function(error, offerSdp, wp) {
 								if (error) {
 									return OmUtil.error('Sender sdp offer error');
@@ -136,7 +151,7 @@ var Video = (function() {
 			contSel = '.room.box';
 		}
 		$(contSel).append(OmUtil.tmpl('#user-video', _id).attr('title', name)
-				.attr('data-client-uid', c.type + c.cuid).data(self)); //FIXME TODO c.type === 'undefined'
+				.attr('data-client-uid', c.type + c.cuid).data(self));
 		return contSel;
 	}
 	function _initDialog(v, opts) {
@@ -334,6 +349,12 @@ var Video = (function() {
 			aCtx.close();
 			aCtx = null;
 		}
+		_micActivity(0);
+		lm.hide();
+		if (!!level) {
+			level.dispose();
+			level = null;
+		}
 	}
 
 	self.update = _update;
diff --git a/openmeetings-web/src/main/webapp/css/raw-room.css b/openmeetings-web/src/main/webapp/css/raw-room.css
index 5eab122..241b952 100644
--- a/openmeetings-web/src/main/webapp/css/raw-room.css
+++ b/openmeetings-web/src/main/webapp/css/raw-room.css
@@ -282,15 +282,26 @@ ul.settings-menu {
 	min-width: 300px;
 	padding-left: 305px;
 }
-.ui-dialog.video .level-meter {
+#video-settings .level-meter {
 	height: 16px;
 }
 .ui-dialog.video .warn {
 	float: right;
 	margin-right: .3em;
 }
-.ui-dialog.video .level-meter .ui-progressbar-value {
+.level-meter.k-progressbar .k-state-selected {
 	background: greenyellow;
+	border-color: #d5d5d5;
+}
+.ui-dialog.video .level-meter {
+	background: transparent;
+}
+.ui-dialog.user-video .level-meter {
+	display: inline-block;
+	width: 10px;
+	position: absolute;
+	bottom: 5px;
+	left: 5px;
 }
 .ui-dialog.video .sett-container {
 	position: relative;
@@ -311,7 +322,7 @@ ul.settings-menu {
 	float: left;
 	padding: 2px 4px;
 }
-.ui-dialog.video .sett-row select, .ui-dialog.video .level-meter {
+.ui-dialog.video .sett-row select, #video-settings .level-meter {
 	width: 250px;
 }
 .ui-dialog.video .ui-dialog-titlebar-collapse span