diff --git a/bbb-fsesl-client/deploy.sh b/bbb-fsesl-client/deploy.sh old mode 100644 new mode 100755 diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/CallAgent.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/CallAgent.java index 29af4ce241afe3e822e3ff9efe739faba51b6446..513c77f8e3e2ceb4294922baac24268b16d58478 100755 --- a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/CallAgent.java +++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/CallAgent.java @@ -63,7 +63,8 @@ public class CallAgent extends CallListenerAdapter implements CallStreamObserver private String _destination; private Boolean listeningToGlobal = false; private IMessagingService messagingService; - + private ForceHangupGlobalAudioUsersListener forceHangupGlobalAudioUsersListener; + private enum CallState { UA_IDLE(0), UA_INCOMING_CALL(1), UA_OUTGOING_CALL(2), UA_ONCALL(3); private final int state; @@ -404,15 +405,23 @@ public class CallAgent extends CallListenerAdapter implements CallStreamObserver /** Callback function called when arriving a BYE request */ public void onCallClosing(Call call, Message bye) { - log.info("Received a BYE from the other end telling us to hangup."); - - if (!isCurrentCall(call)) return; - closeVoiceStreams(); - notifyListenersOfOnCallClosed(); - callState = CallState.UA_IDLE; + log.info("Received a BYE from the other end telling us to hangup."); - // Reset local sdp for next call. - initSessionDescriptor(); + if (!isCurrentCall(call)) return; + closeVoiceStreams(); + notifyListenersOfOnCallClosed(); + + // FreeSWITCH initiated hangup of call. Hangup all listen only users. + // ralam jan 24, 2019 + if (forceHangupGlobalAudioUsersListener != null) { + log.info("Forcing hangup for listen only users of of voice conf {}.", getDestination()); + forceHangupGlobalAudioUsersListener.forceHangupGlobalAudioUsers(getDestination()); + } + + callState = CallState.UA_IDLE; + + // Reset local sdp for next call. + initSessionDescriptor(); } @@ -451,7 +460,11 @@ public class CallAgent extends CallListenerAdapter implements CallStreamObserver private boolean isCurrentCall(Call call) { return this.call == call; } - + + public void setForceHangupGlobalAudioUsersListener(ForceHangupGlobalAudioUsersListener listener) { + forceHangupGlobalAudioUsersListener = listener; + } + public void setCallStreamFactory(CallStreamFactory csf) { this.callStreamFactory = csf; } diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/ForceHangupGlobalAudioUsersListener.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/ForceHangupGlobalAudioUsersListener.java new file mode 100755 index 0000000000000000000000000000000000000000..a60a1c8b86ad937f011a3e0f9ee0f3039b8ce688 --- /dev/null +++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/ForceHangupGlobalAudioUsersListener.java @@ -0,0 +1,5 @@ +package org.bigbluebutton.voiceconf.sip; + +public interface ForceHangupGlobalAudioUsersListener { + void forceHangupGlobalAudioUsers(String voiceConf); +} diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/GlobalCall.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/GlobalCall.java index 84c69c3ffe348c52a0460c960fe277c8468a3fe6..aacc66bdcdee22fc58e35ae5a936ff850f3778dd 100755 --- a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/GlobalCall.java +++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/GlobalCall.java @@ -1,6 +1,7 @@ package org.bigbluebutton.voiceconf.sip; +import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.red5.app.sip.codecs.Codec; @@ -80,6 +81,13 @@ public class GlobalCall { return null; } + public static synchronized Collection<ListenOnlyUser> getAllListenOnlyUsers(String voiceConf) { + if (voiceConfToListenOnlyUsersMap.containsKey(voiceConf)) { + return voiceConfToListenOnlyUsersMap.get(voiceConf).getAllListenOnlyUsers(); + } + return null; + } + public static Codec getRoomCodec(String roomName) { return roomToCodecMap.get(roomName); } diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/SipPeer.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/SipPeer.java index faa078a910e6ecb38c93882290a2c96b5291aefc..724e384c83f8300ea1250a8daad9ab260f98367b 100755 --- a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/SipPeer.java +++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/SipPeer.java @@ -36,7 +36,7 @@ import org.red5.server.api.stream.IBroadcastStream; * @author Richard Alam * */ -public class SipPeer implements SipRegisterAgentListener { +public class SipPeer implements SipRegisterAgentListener, ForceHangupGlobalAudioUsersListener { private static Logger log = Red5LoggerFactory.getLogger(SipPeer.class, "sip"); private ClientConnectionManager clientConnManager; @@ -130,6 +130,7 @@ public class SipPeer implements SipRegisterAgentListener { SipPeerProfile callerProfile = SipPeerProfile.copy(registeredProfile); CallAgent ca = new CallAgent(this.clientRtpIp, sipProvider, callerProfile, audioconfProvider, clientId, messagingService); ca.setClientConnectionManager(clientConnManager); + ca.setForceHangupGlobalAudioUsersListener(this); ca.setCallStreamFactory(callStreamFactory); callManager.add(ca); @@ -229,6 +230,15 @@ public class SipPeer implements SipRegisterAgentListener { log.info("Successfully unregistered with Sip Server"); registered = false; } + + public void forceHangupGlobalAudioUsers(String voiceConf) { + Collection<ListenOnlyUser> listenOnlyUsers = GlobalCall.getAllListenOnlyUsers(voiceConf); + Iterator iter = listenOnlyUsers.iterator(); + while (iter.hasNext()) { + ListenOnlyUser listenOnlyUser = (ListenOnlyUser) iter.next(); + hangup(listenOnlyUser.clientId, true); + } + } public void setCallStreamFactory(CallStreamFactory csf) { callStreamFactory = csf; diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/VoiceConfToListenOnlyUsersMap.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/VoiceConfToListenOnlyUsersMap.java index 84d647cce0f7d3375f99e7586d55daad5315b461..c1e2646102c0cec49ed706690961851ecdca6213 100755 --- a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/VoiceConfToListenOnlyUsersMap.java +++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/VoiceConfToListenOnlyUsersMap.java @@ -1,5 +1,7 @@ package org.bigbluebutton.voiceconf.sip; +import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -23,4 +25,8 @@ public class VoiceConfToListenOnlyUsersMap { public int numUsers() { return listenOnlyUsers.size(); } + + public Collection<ListenOnlyUser> getAllListenOnlyUsers() { + return listenOnlyUsers.values(); + } }