Smaller progress for websocket communication

This commit is contained in:
Mario Danic 2018-10-16 13:16:53 +02:00
parent 568db40816
commit 9f1fef7ff1
3 changed files with 75 additions and 62 deletions

View File

@ -1193,11 +1193,13 @@ public class CallController extends BaseController {
if (webSocketCommunicationEvent.getType().equals("hello")) { if (webSocketCommunicationEvent.getType().equals("hello")) {
callSession = webSocketClient.getSessionId(); callSession = webSocketClient.getSessionId();
webSocketClient.joinRoomWithRoomToken(roomToken); webSocketClient.joinRoomWithRoomToken(roomToken);
alwaysGetPeerConnectionWrapperForSessionId(callSession); alwaysGetPeerConnectionWrapperForSessionId(callSession, true);
} else if (webSocketCommunicationEvent.equals("participantsUpdate")) { } else if ("participantsUpdate".equals(webSocketCommunicationEvent.getType())) {
if (webSocketCommunicationEvent.getHashMap().get("roomId").equals(roomToken)) { if (webSocketCommunicationEvent.getHashMap().get("roomId").equals(roomToken)) {
processUsersInRoom((List<HashMap<String, Object>>) webSocketClient.getJobWithId(Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId")))); processUsersInRoom((List<HashMap<String, Object>>) webSocketClient.getJobWithId(Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId"))));
} }
} else if ("signalingMessage".equals(webSocketCommunicationEvent.getType())) {
processMessage((NCSignalingMessage) webSocketClient.getJobWithId(Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId"))));
} }
} }
@ -1235,51 +1237,55 @@ public class CallController extends BaseController {
} else if ("message".equals(messageType)) { } else if ("message".equals(messageType)) {
NCSignalingMessage ncSignalingMessage = LoganSquare.parse(signaling.getMessageWrapper().toString(), NCSignalingMessage ncSignalingMessage = LoganSquare.parse(signaling.getMessageWrapper().toString(),
NCSignalingMessage.class); NCSignalingMessage.class);
if (ncSignalingMessage.getRoomType().equals("video")) { processMessage(ncSignalingMessage);
MagicPeerConnectionWrapper magicPeerConnectionWrapper = alwaysGetPeerConnectionWrapperForSessionId } else {
(ncSignalingMessage.getFrom()); Log.d(TAG, "Something went very very wrong");
}
}
String type = null; private void processMessage(NCSignalingMessage ncSignalingMessage) {
if (ncSignalingMessage.getPayload() != null && ncSignalingMessage.getPayload().getType() != if (ncSignalingMessage.getRoomType().equals("video")) {
null) { MagicPeerConnectionWrapper magicPeerConnectionWrapper = alwaysGetPeerConnectionWrapperForSessionId
type = ncSignalingMessage.getPayload().getType(); (ncSignalingMessage.getFrom(), false);
} else if (ncSignalingMessage.getType() != null) {
type = ncSignalingMessage.getType(); String type = null;
if (ncSignalingMessage.getPayload() != null && ncSignalingMessage.getPayload().getType() !=
null) {
type = ncSignalingMessage.getPayload().getType();
} else if (ncSignalingMessage.getType() != null) {
type = ncSignalingMessage.getType();
}
if (type != null) {
switch (type) {
case "offer":
case "answer":
magicPeerConnectionWrapper.setNick(ncSignalingMessage.getPayload().getNick());
String sessionDescriptionStringWithPreferredCodec = MagicWebRTCUtils.preferCodec
(ncSignalingMessage.getPayload().getSdp(),
"VP8", false);
SessionDescription sessionDescriptionWithPreferredCodec = new SessionDescription(
SessionDescription.Type.fromCanonicalForm(type),
sessionDescriptionStringWithPreferredCodec);
if (magicPeerConnectionWrapper.getPeerConnection() != null) {
magicPeerConnectionWrapper.getPeerConnection().setRemoteDescription(magicPeerConnectionWrapper
.getMagicSdpObserver(), sessionDescriptionWithPreferredCodec);
}
break;
case "candidate":
NCIceCandidate ncIceCandidate = ncSignalingMessage.getPayload().getIceCandidate();
IceCandidate iceCandidate = new IceCandidate(ncIceCandidate.getSdpMid(),
ncIceCandidate.getSdpMLineIndex(), ncIceCandidate.getCandidate());
magicPeerConnectionWrapper.addCandidate(iceCandidate);
break;
case "endOfCandidates":
magicPeerConnectionWrapper.drainIceCandidates();
break;
default:
break;
} }
if (type != null) {
switch (type) {
case "offer":
case "answer":
magicPeerConnectionWrapper.setNick(ncSignalingMessage.getPayload().getNick());
String sessionDescriptionStringWithPreferredCodec = MagicWebRTCUtils.preferCodec
(ncSignalingMessage.getPayload().getSdp(),
"VP8", false);
SessionDescription sessionDescriptionWithPreferredCodec = new SessionDescription(
SessionDescription.Type.fromCanonicalForm(type),
sessionDescriptionStringWithPreferredCodec);
if (magicPeerConnectionWrapper.getPeerConnection() != null) {
magicPeerConnectionWrapper.getPeerConnection().setRemoteDescription(magicPeerConnectionWrapper
.getMagicSdpObserver(), sessionDescriptionWithPreferredCodec);
}
break;
case "candidate":
NCIceCandidate ncIceCandidate = ncSignalingMessage.getPayload().getIceCandidate();
IceCandidate iceCandidate = new IceCandidate(ncIceCandidate.getSdpMid(),
ncIceCandidate.getSdpMLineIndex(), ncIceCandidate.getCandidate());
magicPeerConnectionWrapper.addCandidate(iceCandidate);
break;
case "endOfCandidates":
magicPeerConnectionWrapper.drainIceCandidates();
break;
default:
break;
}
}
} else {
Log.d(TAG, "Something went very very wrong");
} }
} else { } else {
Log.d(TAG, "Something went very very wrong"); Log.d(TAG, "Something went very very wrong");
@ -1455,7 +1461,7 @@ public class CallController extends BaseController {
for (String sessionId : newSessions) { for (String sessionId : newSessions) {
if (!hasMCU) { if (!hasMCU) {
alwaysGetPeerConnectionWrapperForSessionId(sessionId); alwaysGetPeerConnectionWrapperForSessionId(sessionId, false);
} else { } else {
webSocketClient.requestOfferForSessionIdWithType(sessionId, "video"); webSocketClient.requestOfferForSessionIdWithType(sessionId, "video");
} }
@ -1503,28 +1509,22 @@ public class CallController extends BaseController {
magicPeerConnectionWrapperList.remove(magicPeerConnectionWrapper); magicPeerConnectionWrapperList.remove(magicPeerConnectionWrapper);
} }
private MagicPeerConnectionWrapper alwaysGetPeerConnectionWrapperForSessionId(String sessionId) { private MagicPeerConnectionWrapper alwaysGetPeerConnectionWrapperForSessionId(String sessionId, boolean publisher) {
MagicPeerConnectionWrapper magicPeerConnectionWrapper; MagicPeerConnectionWrapper magicPeerConnectionWrapper;
if ((magicPeerConnectionWrapper = getPeerConnectionWrapperForSessionId(sessionId)) != null) { if ((magicPeerConnectionWrapper = getPeerConnectionWrapperForSessionId(sessionId)) != null) {
return magicPeerConnectionWrapper; return magicPeerConnectionWrapper;
} else { } else {
hasMCU = webSocketClient != null && webSocketClient.hasMCU(); hasMCU = webSocketClient != null && webSocketClient.hasMCU();
MediaConstraints mediaConstraintsToUse; if (hasMCU && publisher) {
if (hasMCU) {
mediaConstraintsToUse = sdpConstraintsForMCU;
} else {
mediaConstraintsToUse = sdpConstraints;
}
if (sessionId.equals(callSession)) {
magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory, magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory,
iceServers, mediaConstraintsToUse, sessionId, callSession, localMediaStream, hasMCU); iceServers, sdpConstraintsForMCU, sessionId, callSession, localMediaStream, true);
} else if (hasMCU) {
magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory,
iceServers, sdpConstraints, sessionId, callSession, null, false);
} else { } else {
magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory, magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory,
iceServers, mediaConstraintsToUse, sessionId, callSession, null, hasMCU); iceServers, sdpConstraints, sessionId, callSession, localMediaStream, false);
} }
magicPeerConnectionWrapperList.add(magicPeerConnectionWrapper); magicPeerConnectionWrapperList.add(magicPeerConnectionWrapper);
@ -1626,6 +1626,7 @@ public class CallController extends BaseController {
ncMessageWrapper.setSessionId(callSession); ncMessageWrapper.setSessionId(callSession);
NCSignalingMessage ncSignalingMessage = new NCSignalingMessage(); NCSignalingMessage ncSignalingMessage = new NCSignalingMessage();
ncSignalingMessage.setTo(sessionDescriptionSend.getPeerId()); ncSignalingMessage.setTo(sessionDescriptionSend.getPeerId());
ncSignalingMessage.setFrom(callSession);
ncSignalingMessage.setRoomType("video"); ncSignalingMessage.setRoomType("video");
ncSignalingMessage.setType(sessionDescriptionSend.getType()); ncSignalingMessage.setType(sessionDescriptionSend.getType());
NCMessagePayload ncMessagePayload = new NCMessagePayload(); NCMessagePayload ncMessagePayload = new NCMessagePayload();

View File

@ -75,7 +75,7 @@ public class MagicPeerConnectionWrapper {
List<PeerConnection.IceServer> iceServerList, List<PeerConnection.IceServer> iceServerList,
MediaConstraints mediaConstraints, MediaConstraints mediaConstraints,
String sessionId, String localSession, @Nullable MediaStream mediaStream, String sessionId, String localSession, @Nullable MediaStream mediaStream,
boolean hasMCU) { boolean isMCUPublisher) {
this.localMediaStream = mediaStream; this.localMediaStream = mediaStream;
@ -89,11 +89,11 @@ public class MagicPeerConnectionWrapper {
new MagicPeerConnectionObserver()); new MagicPeerConnectionObserver());
if (peerConnection != null) { if (peerConnection != null) {
if (localSession != null) { if (localSession != null && localMediaStream != null) {
peerConnection.addStream(localMediaStream); peerConnection.addStream(localMediaStream);
} }
if (hasInitiated || hasMCU) { if (isMCUPublisher || hasInitiated) {
DataChannel.Init init = new DataChannel.Init(); DataChannel.Init init = new DataChannel.Init();
init.negotiated = false; init.negotiated = false;
magicDataChannel = peerConnection.createDataChannel("status", init); magicDataChannel = peerConnection.createDataChannel("status", init);

View File

@ -169,6 +169,18 @@ public class MagicWebSocketInstance extends WebSocketListener {
break; break;
case "message": case "message":
CallOverallWebSocketMessage callOverallWebSocketMessage = LoganSquare.parse(text, CallOverallWebSocketMessage.class); CallOverallWebSocketMessage callOverallWebSocketMessage = LoganSquare.parse(text, CallOverallWebSocketMessage.class);
int newId;
do {
HashMap<String, String> messageHashMap = new HashMap<>();
Random rand = new Random();
newId = rand.nextInt(1000);
if (!concurrentHashMapQueue.contains(newId)) {
concurrentHashMapQueue.put(newId, callOverallWebSocketMessage.getCallWebSocketMessage().getNcSignalingMessage());
messageHashMap.put("jobId", Integer.toString(newId));
eventBus.post(new WebSocketCommunicationEvent("signalingMessage", messageHashMap));
}
} while (!concurrentHashMapQueue.contains(newId));
break; break;
default: default:
break; break;