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>