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');