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 2019/10/24 17:14:15 UTC
[openmeetings] branch master updated: [OPENMEETINGS-2132] turn
on/off video seems to work better
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 aa83dd5 [OPENMEETINGS-2132] turn on/off video seems to work better
aa83dd5 is described below
commit aa83dd54eb61dd3b149cf77124a47d2964c88913
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Fri Oct 25 00:13:58 2019 +0700
[OPENMEETINGS-2132] turn on/off video seems to work better
---
.../openmeetings/core/remote/StreamProcessor.java | 64 ++++++++++++----------
.../openmeetings/db/entity/basic/Client.java | 9 +++
.../openmeetings/web/room/raw-video-manager.js | 3 +
3 files changed, 48 insertions(+), 28 deletions(-)
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
index 4c33caf..d6f54aa 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
@@ -25,11 +25,12 @@ import static org.apache.openmeetings.core.remote.KurentoHandler.activityAllowed
import static org.apache.openmeetings.core.remote.KurentoHandler.newKurentoMsg;
import static org.apache.openmeetings.core.remote.KurentoHandler.sendError;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import org.apache.openmeetings.core.converter.IRecordingConverter;
@@ -57,6 +58,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Component;
+import com.github.openjson.JSONArray;
import com.github.openjson.JSONObject;
@Component
@@ -85,14 +87,17 @@ public class StreamProcessor implements IStreamProcessor {
log.debug("Incoming message from user with ID '{}': {}", c.getUserId(), msg);
switch (cmdId) {
case "devicesAltered":
- if (!msg.getBoolean("audio") && c.hasActivity(Activity.AUDIO)) {
- c.remove(Activity.AUDIO);
- }
- if (!msg.getBoolean("video") && c.hasActivity(Activity.VIDEO)) {
- c.remove(Activity.VIDEO);
+ sd = c.getStream(uid);
+ if (sd != null) {
+ if (!msg.getBoolean("audio") && c.hasActivity(Activity.AUDIO)) {
+ c.remove(Activity.AUDIO);
+ }
+ if (!msg.getBoolean("video") && c.hasActivity(Activity.VIDEO)) {
+ c.remove(Activity.VIDEO);
+ }
+ sd.setActivities();
+ WebSocketHelper.sendRoom(new TextRoomMessage(c.getRoomId(), cm.update(c), RoomMessage.Type.rightUpdated, c.getUid()));
}
- c.getStream(uid).setActivities();
- WebSocketHelper.sendRoom(new TextRoomMessage(c.getRoomId(), cm.update(c), RoomMessage.Type.rightUpdated, c.getUid()));
break;
case "toggleActivity":
toggleActivity(c, Activity.valueOf(msg.getString("activity")));
@@ -188,6 +193,21 @@ public class StreamProcessor implements IStreamProcessor {
return c.hasAnyActivity(Activity.AUDIO, Activity.VIDEO);
}
+ private Set<String> cleanWebCams(Client c, List<StreamDesc> streams) {
+ Set<String> closed = new HashSet<>();
+ streams.stream()
+ .filter(lsd -> StreamType.WEBCAM == lsd.getType())
+ .forEach(lsd -> {
+ KStream s = getByUid(lsd.getUid());
+ if (s != null) {
+ s.stopBroadcast(this);
+ }
+ c.removeStream(lsd.getUid());
+ closed.add(lsd.getUid());
+ });
+ return closed;
+ }
+
public void toggleActivity(Client c, Activity a) {
log.info("PARTICIPANT {}: trying to toggle activity {}", c, a);
@@ -211,36 +231,24 @@ public class StreamProcessor implements IStreamProcessor {
return;
}
c.toggle(a);
+ List<StreamDesc> streams = c.getStreams();
if (!isBroadcasting(c)) {
- //close
- AtomicBoolean changed = new AtomicBoolean(false);
- c.getStreams().stream()
- .filter(sd -> StreamType.WEBCAM == sd.getType())
- .forEach(sd -> {
- KStream s = getByUid(sd.getUid());
- if (s != null) {
- s.stopBroadcast(this);
- }
- c.removeStream(sd.getUid());
- changed.set(true);
- });
- if (changed.get()) {
+ Set<String> closed = cleanWebCams(c, streams);
+ if (!closed.isEmpty()) {
cm.update(c);
checkStreams(c.getRoomId());
+ WebSocketHelper.sendRoom(new TextRoomMessage(c.getRoomId(), c, RoomMessage.Type.rightUpdated, c.getUid()));
}
- WebSocketHelper.sendRoom(new TextRoomMessage(c.getRoomId(), c, RoomMessage.Type.rightUpdated, c.getUid()));
- } else if (!wasBroadcasting) {
- //join
+ } else {
StreamDesc sd = c.addStream(StreamType.WEBCAM);
- cm.update(c);
+ Set<String> closed = wasBroadcasting ? cleanWebCams(c, streams) : Set.of();
+ cm.update(c.restoreActivities(sd));
log.debug("User {}: has started broadcast", sd.getUid());
kHandler.sendClient(sd.getSid(), newKurentoMsg()
.put("id", "broadcast")
.put("stream", sd.toJson())
+ .put("cleanup", new JSONArray(closed))
.put(PARAM_ICE, kHandler.getTurnServers(false)));
- } else {
- constraintsChanged(c);
- WebSocketHelper.sendRoom(new TextRoomMessage(c.getRoomId(), c, RoomMessage.Type.rightUpdated, c.getUid()));
}
}
}
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java
index 71fa97d..b53a833 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java
@@ -243,6 +243,15 @@ public class Client implements IDataProviderEntity, IWsClient {
.findFirst();
}
+ public Client restoreActivities(StreamDesc sd) {
+ synchronized (activities) {
+ Set<Activity> aa = new HashSet<>(sd.sactivities);
+ activities.clear();
+ activities.addAll(aa);
+ }
+ return this;
+ }
+
public Date getConnectedSince() {
return connectedSince;
}
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 07317b6..f416582 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
@@ -27,6 +27,9 @@ var VideoManager = (function() {
function _onBroadcast(msg) {
const sd = msg.stream
, uid = sd.uid;
+ msg.cleanup.forEach(function(_cuid) {
+ _close(_cuid);
+ });
$('#' + VideoUtil.getVid(uid)).remove();
Video().init(msg);
OmUtil.log(uid + ' registered in room');