diff --git a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClient.kt b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClient.kt index b10993a..5b1df05 100644 --- a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClient.kt +++ b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClient.kt @@ -12,6 +12,8 @@ import org.membraneframework.rtc.models.RTCStats import org.membraneframework.rtc.utils.Metadata import org.webrtc.Logging +typealias TrackContext = JellyfishTrackContext + data class Config( val websocketUrl: String, val token: String, diff --git a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientInternal.kt b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientInternal.kt index 07c0aa4..f6f91cc 100644 --- a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientInternal.kt +++ b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientInternal.kt @@ -117,19 +117,23 @@ internal class JellyfishClientInternal( } override fun onTrackAdded(ctx: TrackContext) { - listener.onTrackAdded(ctx) + var trackContext = TrackContext(ctx) + listener.onTrackAdded(trackContext) } override fun onTrackReady(ctx: TrackContext) { - listener.onTrackReady(ctx) + var trackContext = TrackContext(ctx) + listener.onTrackReady(trackContext) } override fun onTrackRemoved(ctx: TrackContext) { - listener.onTrackRemoved(ctx) + var trackContext = TrackContext(ctx) + listener.onTrackRemoved(trackContext) } override fun onTrackUpdated(ctx: TrackContext) { - listener.onTrackUpdated(ctx) + var trackContext = TrackContext(ctx) + listener.onTrackUpdated(trackContext) } override fun onBandwidthEstimationChanged(estimation: Long) { diff --git a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientListener.kt b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientListener.kt index c4f3188..9b5551a 100644 --- a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientListener.kt +++ b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientListener.kt @@ -1,7 +1,6 @@ package com.jellyfishdev.jellyfishclient import okhttp3.Response -import org.membraneframework.rtc.models.TrackContext import timber.log.Timber interface JellyfishClientListener { diff --git a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishTrackContext.kt b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishTrackContext.kt new file mode 100644 index 0000000..cf4db18 --- /dev/null +++ b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishTrackContext.kt @@ -0,0 +1,65 @@ +package com.jellyfishdev.jellyfishclient + +import org.membraneframework.rtc.TrackEncoding +import org.membraneframework.rtc.media.RemoteTrack +import org.membraneframework.rtc.models.EncodingReason +import org.membraneframework.rtc.models.OnEncodingChangedListener +import org.membraneframework.rtc.models.OnVoiceActivityChangedListener +import org.membraneframework.rtc.models.TrackContext +import org.membraneframework.rtc.models.VadStatus +import org.membraneframework.rtc.utils.Metadata + +fun interface JellyfishOnVoiceActivityChangedListener { + fun onVoiceActivityChanged(trackContext: JellyfishTrackContext) +} + +fun interface JellyfishOnEncodingChangedListener { + fun onEncodingChangedListener(trackContext: JellyfishTrackContext) +} + +class JellyfishTrackContext(private val trackContext: TrackContext) { + val track: RemoteTrack? + get() { + return trackContext.track + } + + val trackId: String + get() { + return trackContext.trackId + } + + val peer: Peer + get() { + return trackContext.endpoint + } + + val metadata: Metadata + get() { + return trackContext.metadata + } + + val vadStatus: VadStatus + get() { + return trackContext.vadStatus + } + + val encoding: TrackEncoding? + get() { + return trackContext.encoding + } + + val encodingReason: EncodingReason? + get() { + return trackContext.encodingReason + } + + fun setOnEncodingChangedListener(listener: JellyfishOnEncodingChangedListener) { + val rtcListener = OnEncodingChangedListener { trackContext -> listener.onEncodingChangedListener(JellyfishTrackContext(trackContext)) } + trackContext.setOnEncodingChangedListener(rtcListener) + } + + fun setOnVoiceActivityChangedListener(listener: JellyfishOnVoiceActivityChangedListener) { + val rtcListener = OnVoiceActivityChangedListener { trackContext -> listener.onVoiceActivityChanged(JellyfishTrackContext(trackContext)) } + trackContext.setOnVoiceActivityChangedListener(rtcListener) + } +} diff --git a/app/src/main/java/com/example/jellyfishandroidexample/RoomViewModel.kt b/app/src/main/java/com/example/jellyfishandroidexample/RoomViewModel.kt index dfc27eb..2ba21e5 100644 --- a/app/src/main/java/com/example/jellyfishandroidexample/RoomViewModel.kt +++ b/app/src/main/java/com/example/jellyfishandroidexample/RoomViewModel.kt @@ -7,13 +7,13 @@ import com.jellyfishdev.jellyfishclient.Config import com.jellyfishdev.jellyfishclient.JellyfishClient import com.jellyfishdev.jellyfishclient.JellyfishClientListener import com.jellyfishdev.jellyfishclient.Peer +import com.jellyfishdev.jellyfishclient.TrackContext import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import org.membraneframework.rtc.SimulcastConfig import org.membraneframework.rtc.media.LocalVideoTrack import org.membraneframework.rtc.media.RemoteVideoTrack import org.membraneframework.rtc.media.VideoParameters -import org.membraneframework.rtc.models.TrackContext class RoomViewModel(application: Application) : AndroidViewModel(application), @@ -90,14 +90,14 @@ class RoomViewModel(application: Application) : override fun onTrackReady(ctx: TrackContext) { viewModelScope.launch { - val participant = mutableParticipants[ctx.endpoint.id] ?: return@launch + val participant = mutableParticipants[ctx.peer.id] ?: return@launch val (id, newParticipant) = when (ctx.track) { is RemoteVideoTrack -> { globalToLocalTrackId[ctx.trackId] = (ctx.track as RemoteVideoTrack).id() val p = participant.copy(videoTrack = ctx.track as RemoteVideoTrack) - Pair(ctx.endpoint.id, p) + Pair(ctx.peer.id, p) } else -> @@ -112,7 +112,7 @@ class RoomViewModel(application: Application) : override fun onTrackRemoved(ctx: TrackContext) { viewModelScope.launch { - val participant = mutableParticipants[ctx.endpoint.id] ?: return@launch + val participant = mutableParticipants[ctx.peer.id] ?: return@launch val localTrackId = globalToLocalTrackId[ctx.trackId] val videoTrackId = participant.videoTrack?.id() @@ -125,7 +125,7 @@ class RoomViewModel(application: Application) : globalToLocalTrackId.remove(ctx.trackId) - mutableParticipants[ctx.endpoint.id] = newParticipant + mutableParticipants[ctx.peer.id] = newParticipant emitParticipants() }