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 2020/12/16 15:24:25 UTC

[openmeetings] branch master updated: [OPENMEETINGS-2239] less errors in SIP communications

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 e61a5cb  [OPENMEETINGS-2239] less errors in SIP communications
e61a5cb is described below

commit e61a5cbba61bdbe55eb624bc348528764f0562d4
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Wed Dec 16 22:24:10 2020 +0700

    [OPENMEETINGS-2239] less errors in SIP communications
---
 .../org/apache/openmeetings/core/remote/KRoom.java |  12 ++++++
 .../apache/openmeetings/core/remote/KStream.java   |  42 +++++++++++++++------
 .../openmeetings/core/remote/KurentoHandler.java   |   4 ++
 .../apache/openmeetings/core/sip/SipManager.java   |  19 +++++-----
 .../apache/openmeetings/web/app/TimerService.java  |   7 +++-
 openmeetings-web/src/main/webapp/css/raw-room.css  |   4 +-
 openmeetings-web/src/main/webapp/images/phone.png  | Bin 1112 -> 1725 bytes
 openmeetings-web/src/main/webapp/images/phone.svg  |   5 +++
 pom.xml                                            |  11 ++++++
 9 files changed, 79 insertions(+), 25 deletions(-)

diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
index d1f993d..8caaaae 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
@@ -67,6 +67,7 @@ public class KRoom {
 	private final AtomicBoolean recordingStarted = new AtomicBoolean(false);
 	private final AtomicBoolean sharingStarted = new AtomicBoolean(false);
 	private Long recordingId = null;
+	private int sipCount = 0;
 	private JSONObject recordingUser = new JSONObject();
 	private JSONObject sharingUser = new JSONObject();
 
@@ -247,4 +248,15 @@ public class KRoom {
 		processor.getByRoom(room.getId()).forEach(KStream::release);
 		log.debug("Room {} closed", room.getId());
 	}
+
+	public void updateSipCount(final int count) {
+		if (count != sipCount) {
+			sipCount = count;
+			processor.getByRoom(room.getId()).forEach(stream -> stream.addSipProcessor(count));
+		}
+	}
+
+	public int getSipCount() {
+		return sipCount;
+	}
 }
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 d744c18..ab8a099 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
@@ -80,13 +80,12 @@ public class KStream extends AbstractStream implements ISipCallbacks {
 	private RecorderEndpoint recorder;
 	private WebRtcEndpoint outgoingMedia = null;
 	private RtpEndpoint rtpEndpoint;
-	private Optional<SipStackProcessor> sipProcessor;
+	private Optional<SipStackProcessor> sipProcessor = Optional.empty();
 	private final ConcurrentMap<String, WebRtcEndpoint> listeners = new ConcurrentHashMap<>();
 	private Optional<CompletableFuture<Object>> flowoutFuture = Optional.empty();
 	private ListenerSubscription flowoutSubscription;
 	private Long chunkId;
 	private Type type;
-	private String sdpOffer;
 	private boolean hasAudio;
 	private boolean hasVideo;
 	private boolean hasScreen;
@@ -153,7 +152,6 @@ public class KStream extends AbstractStream implements ISipCallbacks {
 	}
 
 	private void internalStartBroadcast(final StreamDesc sd, final String sdpOffer) throws Exception {
-		this.sdpOffer = sdpOffer;
 		outgoingMedia = createEndpoint(sd.getSid(), sd.getUid());
 		outgoingMedia.addMediaSessionTerminatedListener(evt -> log.warn("Media stream terminated {}", sd));
 		flowoutSubscription = outgoingMedia.addMediaFlowOutStateChangeListener(evt -> {
@@ -174,11 +172,7 @@ public class KStream extends AbstractStream implements ISipCallbacks {
 		});
 		outgoingMedia.addMediaFlowInStateChangeListener(evt -> log.warn("Media FlowIn :: {}", evt));
 		addListener(sd.getSid(), sd.getUid(), sdpOffer);
-		sipProcessor = kHandler.getSipManager().createSipStackProcessor(
-				randomUUID().toString()
-				, kRoom.getRoom()
-				, this);
-		sipProcessor.ifPresent(SipStackProcessor::register);
+		addSipProcessor(kRoom.getSipCount());
 		if (kRoom.isRecording()) {
 			startRecord();
 		}
@@ -490,6 +484,24 @@ public class KStream extends AbstractStream implements ISipCallbacks {
 		}
 	}
 
+	void addSipProcessor(int count) {
+		if (kRoom.getSipCount() > 0) {
+			if (sipProcessor.isEmpty()) {
+				try {
+					sipProcessor = kHandler.getSipManager().createSipStackProcessor(
+							randomUUID().toString()
+							, kRoom.getRoom()
+							, this);
+					sipProcessor.ifPresent(SipStackProcessor::register);
+				} catch (Exception e) {
+					log.error("Unexpected error while creating SipProcessor", e);
+				}
+			}
+		} else {
+			releaseRtp();
+		}
+	}
+
 	private static JSONObject convert(com.google.gson.JsonObject o) {
 		return new JSONObject(o.toString());
 	}
@@ -557,14 +569,20 @@ public class KStream extends AbstractStream implements ISipCallbacks {
 
 	@Override
 	public void onRegisterOk() {
+		//TODO code for `SIP master` stream
 		rtpEndpoint = getRtpEndpoint(pipeline);
-		outgoingMedia.connect(rtpEndpoint, MediaType.AUDIO); //TODO VIDEO
-		sipProcessor.get().invite(kRoom.getRoom(), null);
+		if (hasAudio) {
+			outgoingMedia.connect(rtpEndpoint, MediaType.AUDIO);
+		}
+		if (hasVideo) {
+			outgoingMedia.connect(rtpEndpoint, MediaType.VIDEO);
+		}
+		sipProcessor.get().invite(kRoom.getRoom(), rtpEndpoint.generateOffer());
 	}
 
 	@Override
 	public void onInviteOk(String sdp) {
-		String answer = rtpEndpoint.processOffer(sdp);
-		sipProcessor.get().invite(kRoom.getRoom(), answer);
+		//TODO code for `SIP master` stream
+		rtpEndpoint.processAnswer(sdp);
 	}
 }
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 ac4fab6..4dc8a07 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
@@ -317,6 +317,10 @@ public class KurentoHandler {
 		return rooms.values();
 	}
 
+	public void updateSipCount(Room r, int count) {
+		getRoom(r.getId()).updateSipCount(count);
+	}
+
 	static JSONObject newKurentoMsg() {
 		return new JSONObject().put("type", KURENTO_TYPE);
 	}
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/sip/SipManager.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/sip/SipManager.java
index c55463b..391f551 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/sip/SipManager.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/sip/SipManager.java
@@ -194,16 +194,15 @@ public class SipManager implements ISipManager {
 		exec(da);
 	}
 
-	public Integer countUsers(String confno) {
-		if (confno == null) {
-			return null;
-		}
-		ConfbridgeListAction da = new ConfbridgeListAction(confno);
-		ResponseEvents r = execEvent(da);
-		if (r != null) {
-			log.trace("SipManager::countUsers size == {}", r.getEvents().size());
-			// "- 1" here means: ListComplete event
-			return r.getEvents().size() - 1;
+	public int countUsers(String confno) {
+		if (confno != null) {
+			ConfbridgeListAction da = new ConfbridgeListAction(confno);
+			ResponseEvents r = execEvent(da);
+			if (r != null) {
+				log.trace("SipManager::countUsers size == {}", r.getEvents().size());
+				// "- 1" here means: ListComplete event
+				return r.getEvents().size() - 1;
+			}
 		}
 		return 0;
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/TimerService.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/TimerService.java
index a8bd24b..bf9ca35 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/TimerService.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/TimerService.java
@@ -29,6 +29,7 @@ import java.util.function.Predicate;
 
 import javax.annotation.PostConstruct;
 
+import org.apache.openmeetings.core.remote.KurentoHandler;
 import org.apache.openmeetings.core.sip.SipManager;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.entity.basic.Client;
@@ -55,6 +56,8 @@ public class TimerService {
 	private ClientManager cm;
 	@Autowired
 	private SipManager sipManager;
+	@Autowired
+	private KurentoHandler kHandler;
 
 	@PostConstruct
 	private void init() {
@@ -97,7 +100,9 @@ public class TimerService {
 	}
 
 	private void updateSipLastName(Optional<Client> sipClient, Room r) {
-		final String newLastName = "(" + sipManager.countUsers(r.getConfno()) + ")";
+		int count = sipManager.countUsers(r.getConfno());
+		final String newLastName = "(" + count + ")";
+		kHandler.updateSipCount(r, count);
 		sipClient.ifPresentOrElse(c -> {
 			if (!newLastName.equals(c.getUser().getLastname())) {
 				c.getUser().setLastname(newLastName).resetDisplayName();
diff --git a/openmeetings-web/src/main/webapp/css/raw-room.css b/openmeetings-web/src/main/webapp/css/raw-room.css
index f52cf5d..4ed6934 100644
--- a/openmeetings-web/src/main/webapp/css/raw-room.css
+++ b/openmeetings-web/src/main/webapp/css/raw-room.css
@@ -77,13 +77,13 @@ html[dir="rtl"] .room-block .sb-wb .sidebar {
 	min-height: 60px;
 	padding-left: 5px;
 	padding-top: 5px;
-	background-size: 60px 60px;
+	background-size: 55px;
 	background-repeat: no-repeat;
 	background-position: 2px 2px;
 	position: relative;
 }
 .room-block .sb-wb .sidebar .user-list .user.entry:hover {
-	background-size: 80px 80px;
+	background-size: 75px;
 	min-height: 80px;
 }
 .room-block .sb-wb .sidebar .user-list .user.entry:hover .user.name {
diff --git a/openmeetings-web/src/main/webapp/images/phone.png b/openmeetings-web/src/main/webapp/images/phone.png
index 9ed6449..3bec0a3 100644
Binary files a/openmeetings-web/src/main/webapp/images/phone.png and b/openmeetings-web/src/main/webapp/images/phone.png differ
diff --git a/openmeetings-web/src/main/webapp/images/phone.svg b/openmeetings-web/src/main/webapp/images/phone.svg
new file mode 100644
index 0000000..bac9fe8
--- /dev/null
+++ b/openmeetings-web/src/main/webapp/images/phone.svg
@@ -0,0 +1,5 @@
+<!--
+  Taken from https://fontawesome.com/icons/phone-alt?style=solid
+  Icons — CC BY 4.0 License https://creativecommons.org/licenses/by/4.0/
+-->
+<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="phone-alt" class="svg-inline--fa fa-phone-alt fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M497.39 361.8l-112-48a24 24 0 0 0-28 6.9l-49.6 60.6A370.66 370.66 0 0 1 130.6 204.11l60.6-49.6a23.94 23.94 0 0 0 6.9-28l-48-112A24.16 24.16 0 0 0 122.6.61l-104 24A24 24 0 0 0 0 48c0 256.5 207.9 464 464 464a24 24 0 0 0 23.4-18.6l24-104a24.29 24.29 0 0 0-14.01-27.6z"></p [...]
diff --git a/pom.xml b/pom.xml
index c119863..f94f5ab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1012,6 +1012,14 @@
 									<pattern>BSD-style license</pattern>
 								</patterns>
 							</license>
+							<license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
+								<licenseFamilyCategory>Creative Commons Attribution</licenseFamilyCategory>
+								<licenseFamilyName>CC BY</licenseFamilyName>
+								<notes></notes>
+								<patterns>
+									<pattern>creativecommons.org/licenses/by/4.0</pattern>
+								</patterns>
+							</license>
 						</licenses>
 						<licenseFamilies>
 							<licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
@@ -1020,6 +1028,9 @@
 							<licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
 								<familyName>BSD</familyName>
 							</licenseFamily>
+							<licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
+								<familyName>CC BY</familyName>
+							</licenseFamily>
 						</licenseFamilies>
 						<excludes>
 							<exclude>**/*.mp3</exclude>