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