From 6fe6b52dcfb01ecb8831a576140205922aebab20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0t=C4=9Bp=C3=A1n=20=C5=A0korpil?= Date: Mon, 18 Dec 2017 19:28:12 +0100 Subject: [PATCH] Events MediaFlowInChange and MediaFlowOutChange are now sent to clients --- .../client/internal/ProtocolElements.java | 10 ++++++ .../openvidu/server/core/api/RoomHandler.java | 25 +++++++++++++++ .../DefaultNotificationRoomHandler.java | 32 +++++++++++++++++-- .../server/core/internal/Participant.java | 21 +++++++----- .../openvidu/server/core/internal/Room.java | 17 ++++++---- 5 files changed, 88 insertions(+), 17 deletions(-) diff --git a/openvidu-client/src/main/java/io/openvidu/client/internal/ProtocolElements.java b/openvidu-client/src/main/java/io/openvidu/client/internal/ProtocolElements.java index e33621fa..6cf613f8 100644 --- a/openvidu-client/src/main/java/io/openvidu/client/internal/ProtocolElements.java +++ b/openvidu-client/src/main/java/io/openvidu/client/internal/ProtocolElements.java @@ -112,5 +112,15 @@ public class ProtocolElements { public static final String ICECANDIDATE_SDPMID_PARAM = "sdpMid"; public static final String ICECANDIDATE_SDPMLINEINDEX_PARAM = "sdpMLineIndex"; + public static final String MEDIAFLOWINCHANGE_METHOD = "onMediaFlowInChange"; + public static final String MEDIAFLOWINCHANGE_MEDIATYPE_PARAM = "mediaType"; + public static final String MEDIAFLOWINCHANGE_NEWSTATE_PARAM = "newState"; + public static final String MEDIAFLOWINCHANGE_USER_PARAM = "id"; + + public static final String MEDIAFLOWOUTCHANGE_METHOD = "onMediaFlowOutChange"; + public static final String MEDIAFLOWOUTCHANGE_MEDIATYPE_PARAM = "mediaType"; + public static final String MEDIAFLOWOUTCHANGE_NEWSTATE_PARAM = "newState"; + public static final String MEDIAFLOWOUTCHANGE_USER_PARAM = "id"; + public static final String CUSTOM_NOTIFICATION = "custonNotification"; } diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/api/RoomHandler.java b/openvidu-server/src/main/java/io/openvidu/server/core/api/RoomHandler.java index 589fbd9a..1b63e293 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/api/RoomHandler.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/api/RoomHandler.java @@ -16,12 +16,17 @@ package io.openvidu.server.core.api; +import java.util.Collection; +import java.util.HashMap; import java.util.Set; +import io.openvidu.server.core.api.pojo.UserParticipant; import org.kurento.client.IceCandidate; import io.openvidu.server.InfoHandler; import io.openvidu.server.core.internal.Participant; +import org.kurento.client.MediaFlowState; +import org.kurento.client.MediaType; /** * Handler for events triggered from media objects. @@ -73,6 +78,26 @@ public interface RoomHandler { */ void updateFilter(String roomName, Participant participant, String filterId, String state); + /** + * Called as a result of started or interrupted media flow. All participants should be notified. + * @param participantId + * @param mediaType + * @param newState + * @param participants + */ + void onMediaFlowInChange(String roomName, String participantId, MediaType mediaType, + MediaFlowState newState, Collection participants); + + /** + * Called as a result of started or interrupted media flow. All participants should be notified. + * @param participantId + * @param mediaType + * @param newState + * @param participants + */ + void onMediaFlowOutChange(String roomName, String participantId, MediaType mediaType, + MediaFlowState newState, Collection participants); + /** * Called to get the next state of a filter when requested by a call to updateFilter * diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/internal/DefaultNotificationRoomHandler.java b/openvidu-server/src/main/java/io/openvidu/server/core/internal/DefaultNotificationRoomHandler.java index 1a7e8b76..a8c23774 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/internal/DefaultNotificationRoomHandler.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/internal/DefaultNotificationRoomHandler.java @@ -16,12 +16,12 @@ package io.openvidu.server.core.internal; -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import org.kurento.client.IceCandidate; +import org.kurento.client.MediaFlowState; +import org.kurento.client.MediaType; import org.springframework.beans.factory.annotation.Autowired; import com.google.gson.JsonArray; @@ -306,6 +306,32 @@ public class DefaultNotificationRoomHandler implements NotificationRoomHandler { ProtocolElements.PARTICIPANTEVICTED_METHOD, new JsonObject()); } + @Override + public void onMediaFlowInChange(String roomName, String participantId, MediaType mediaType, + MediaFlowState newState, Collection participants) { + JsonObject notifParams = new JsonObject(); + notifParams.addProperty(ProtocolElements.MEDIAFLOWINCHANGE_USER_PARAM, participantId); + notifParams.addProperty(ProtocolElements.MEDIAFLOWINCHANGE_MEDIATYPE_PARAM, mediaType.toString()); + notifParams.addProperty(ProtocolElements.MEDIAFLOWINCHANGE_NEWSTATE_PARAM, newState.toString()); + for (Participant participant : participants) { + notifService.sendNotification(participant.getId(), + ProtocolElements.MEDIAFLOWINCHANGE_METHOD, notifParams); + } + } + + @Override + public void onMediaFlowOutChange(String roomName, String participantId, MediaType mediaType, + MediaFlowState newState, Collection participants) { + JsonObject notifParams = new JsonObject(); + notifParams.addProperty(ProtocolElements.MEDIAFLOWOUTCHANGE_USER_PARAM, participantId); + notifParams.addProperty(ProtocolElements.MEDIAFLOWOUTCHANGE_MEDIATYPE_PARAM, mediaType.toString()); + notifParams.addProperty(ProtocolElements.MEDIAFLOWOUTCHANGE_NEWSTATE_PARAM, newState.toString()); + for (Participant participant : participants) { + notifService.sendNotification(participant.getId(), + ProtocolElements.MEDIAFLOWOUTCHANGE_METHOD, notifParams); + } + } + // ------------ EVENTS FROM ROOM HANDLER ----- @Override diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/internal/Participant.java b/openvidu-server/src/main/java/io/openvidu/server/core/internal/Participant.java index 89452f5c..76f0c81f 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/internal/Participant.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/internal/Participant.java @@ -23,14 +23,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import org.kurento.client.Continuation; -import org.kurento.client.ErrorEvent; -import org.kurento.client.Filter; -import org.kurento.client.IceCandidate; -import org.kurento.client.MediaElement; -import org.kurento.client.MediaPipeline; -import org.kurento.client.MediaType; -import org.kurento.client.SdpEndpoint; +import org.kurento.client.*; import org.kurento.client.internal.server.KurentoServerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -498,6 +491,16 @@ public class Participant { room.sendMediaError(id, desc); } + public void sendMediaFlowInChange(MediaFlowInStateChangeEvent event) { + log.warn("PARTICIPANT {}: Media flow in: {}", name, event.getState()); + room.sendMediaFlowInChange(name, event.getMediaType(),event.getState()); + } + + public void sendMediaFlowOutChange(MediaFlowOutStateChangeEvent event) { + log.warn("PARTICIPANT {}: Media flow out: {}", name, event.getState()); + room.sendMediaFlowOutChange(name, event.getMediaType(),event.getState()); + } + private void releasePublisherEndpoint() { if (publisher != null && publisher.getEndpoint() != null) { this.streaming = false; @@ -638,6 +641,7 @@ public class Participant { System.out.println(msg2); this.infoHandler.sendInfo(msg1); this.infoHandler.sendInfo(msg2); + this.sendMediaFlowInChange(event); }); endpoint.getWebEndpoint().addMediaFlowOutStateChangeListener((event) -> { @@ -662,6 +666,7 @@ public class Participant { System.out.println(msg2); this.infoHandler.sendInfo(msg1); this.infoHandler.sendInfo(msg2); + this.sendMediaFlowOutChange(event); }); endpoint.getWebEndpoint().addMediaSessionStartedListener((event) -> { diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/internal/Room.java b/openvidu-server/src/main/java/io/openvidu/server/core/internal/Room.java index d5a1b807..0bccc50f 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/internal/Room.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/internal/Room.java @@ -24,12 +24,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import org.kurento.client.Continuation; -import org.kurento.client.ErrorEvent; -import org.kurento.client.EventListener; -import org.kurento.client.IceCandidate; -import org.kurento.client.KurentoClient; -import org.kurento.client.MediaPipeline; +import org.kurento.client.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -236,6 +231,16 @@ public class Room { this.roomHandler.onIceCandidate(name, participantId, endpointName, candidate); } + public void sendMediaFlowInChange(String participantId, MediaType mediaType, + MediaFlowState newState){ + this.roomHandler.onMediaFlowInChange(name,participantId, mediaType, newState, participants.values()); + } + + public void sendMediaFlowOutChange(String participantId, MediaType mediaType, + MediaFlowState newState){ + this.roomHandler.onMediaFlowOutChange(name,participantId, mediaType, newState, participants.values()); + } + public void sendMediaError(String participantId, String description) { this.roomHandler.onMediaElementError(name, participantId, description); }