This is an automated email from the ASF dual-hosted git repository. sebawagner pushed a commit to branch OPENMEETINGS-2573/type-audio-events-can-start-flowing-again in repository https://gitbox.apache.org/repos/asf/openmeetings.git
The following commit(s) were added to refs/heads/OPENMEETINGS-2573/type-audio-events-can-start-flowing-again by this push: new e679edd OPENMEETINGS-2573 filter out audio Type events to only stop the stream in case its audio-only room. e679edd is described below commit e679eddb9bb3eeb22c2d5d72d66860db7fd2d22f Author: Sebastian Wagner <sebawag...@apache.org> AuthorDate: Thu Feb 11 19:25:00 2021 +1300 OPENMEETINGS-2573 filter out audio Type events to only stop the stream in case its audio-only room. --- .../apache/openmeetings/core/remote/KStream.java | 44 +++++++++++++++++----- 1 file changed, 34 insertions(+), 10 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 e311981..6c03fbb 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 @@ -115,7 +115,7 @@ public class KStream extends AbstractStream implements ISipCallbacks { if ((sdpOffer.indexOf("m=audio") > -1 && !hasAudio) || (sdpOffer.indexOf("m=video") > -1 && !hasVideo && StreamType.SCREEN != streamType)) { - log.warn("Broadcast started without enough rights"); + log.warn("Broadcast started without enough rights, sid {}, uid {}", sid, uid); return; } if (StreamType.SCREEN == streamType) { @@ -162,15 +162,39 @@ public class KStream extends AbstractStream implements ISipCallbacks { }); } + /** + * Invoked in case stream stops to decide on if this stream is worth stopping. + * + * Stop broadcast in case: + * - Audio only stream and audio has been detected as not streaming anymore + * - Video or Data + * + * @param mediaType the MediaType that stopped flowing + * @return true in case this stream should be dropped + */ + private boolean checkFlowOutEventForStopping(MediaType mediaType) { + if (MediaType.AUDIO == mediaType) { + if (!hasVideo && hasAudio) { + // Only stop in case its audio-only + return true; + } else { + return false; + } + } else { + return true; + } + } + private void internalStartBroadcast(final StreamDesc sd, final String sdpOffer) { outgoingMedia.addMediaSessionTerminatedListener(evt -> log.warn("Media stream terminated {}", sd)); flowoutSubscription = outgoingMedia.addMediaFlowOutStateChangeListener(evt -> { - log.info("Media Flow OUT STATE :: {}, evt {}, source {}" - , evt.getState(), evt.getMediaType(), evt.getSource()); - if (MediaFlowState.NOT_FLOWING == evt.getState()) { - log.warn("FlowOut Future is created"); + log.info("Media Flow OUT STATE :: {}, mediaType {}, source {}, sid {}, uid {}" + , evt.getState(), evt.getMediaType(), evt.getSource(), sid, uid); + if (MediaFlowState.NOT_FLOWING == evt.getState() + && checkFlowOutEventForStopping(evt.getMediaType())) { + log.warn("FlowOut Future is created, sid {}, uid {}", sid, uid); flowoutFuture = Optional.of(new CompletableFuture<>().completeAsync(() -> { - log.warn("KStream will be dropped {}", sd); + log.warn("KStream will be dropped {}, sid {}, uid {}", sd, sid, uid); if (StreamType.SCREEN == streamType) { kHandler.getStreamProcessor().doStopSharing(sid, uid); } @@ -181,8 +205,8 @@ public class KStream extends AbstractStream implements ISipCallbacks { dropFlowoutFuture(); } }); - outgoingMedia.addMediaFlowInStateChangeListener(evt -> log.warn("Media Flow IN :: {}, {}, {}" - , evt.getState(), evt.getMediaType(), evt.getSource())); + outgoingMedia.addMediaFlowInStateChangeListener(evt -> log.warn("Media Flow IN :: {}, {}, {}, sid {}, uid {}" + , evt.getState(), evt.getMediaType(), evt.getSource(), sid, uid)); if (!sipClient) { addListener(sd.getSid(), sd.getUid(), sdpOffer); addSipProcessor(kRoom.getSipCount()); @@ -220,10 +244,10 @@ public class KStream extends AbstractStream implements ISipCallbacks { public void addListener(String sid, String uid, String sdpOffer) { final boolean self = uid.equals(this.uid); - log.info("USER {}: have started {} in kRoom {}", uid, self ? "broadcasting" : "receiving", getRoomId()); + log.info("USER {}: have started, sid {}, uid {} in kRoom {}", sid, uid, self ? "broadcasting" : "receiving", getRoomId()); log.trace("USER {}: SdpOffer is {}", uid, sdpOffer); if (!self && outgoingMedia == null) { - log.warn("Trying to add listener too early"); + log.warn("Trying to add listener too early, sid {}, uid {}", sid, uid); return; }