David Zhao

Removed deprecated DataTrack references

... ... @@ -43,7 +43,7 @@ constructor(
url: String,
token: String,
) {
val wsUrlString = "$url/rtc?access_token=$token&protocol=$PROTOCOL_VERSION"
val wsUrlString = "$url/rtc?protocol=$PROTOCOL_VERSION&access_token=$token"
Timber.i { "connecting to $wsUrlString" }
val request = Request.Builder()
... ...
... ... @@ -111,7 +111,6 @@ constructor(
fun onICEConnected()
fun onAddTrack(track: MediaStreamTrack, streams: Array<out MediaStream>)
// fun onPublishLocalTrack(cid: String, track: LivekitModels.TrackInfo)
fun onAddDataChannel(channel: DataChannel)
fun onUpdateParticipants(updates: List<LivekitModels.ParticipantInfo>)
fun onUpdateSpeakers(speakers: List<LivekitRtc.SpeakerInfo>)
fun onDisconnect(reason: String)
... ...
... ... @@ -11,11 +11,9 @@ import io.livekit.android.room.participant.Participant
import io.livekit.android.room.participant.ParticipantListener
import io.livekit.android.room.participant.RemoteParticipant
import io.livekit.android.room.track.*
import io.livekit.android.room.util.unpackedTrackLabel
import livekit.LivekitModels
import livekit.LivekitRtc
import org.webrtc.*
import java.nio.ByteBuffer
import kotlin.coroutines.Continuation
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
... ... @@ -71,7 +69,7 @@ constructor(
handleDisconnect()
}
private fun handleParticipantDisconnect(sid: String, participant: RemoteParticipant) {
private fun handleParticipantDisconnect(sid: String) {
val removedParticipant = mutableRemoteParticipants.remove(sid) ?: return
removedParticipant.tracks.values.toList().forEach { publication ->
removedParticipant.unpublishTrack(publication.sid)
... ... @@ -214,17 +212,6 @@ constructor(
/**
* @suppress
*/
override fun onAddDataChannel(channel: DataChannel) {
val unpackedTrackLabel = channel.unpackedTrackLabel()
val (participantSid, trackSid, name) = unpackedTrackLabel
val participant = getOrCreateRemoteParticipant(participantSid)
participant.addSubscribedDataTrack(channel, trackSid, name)
}
/**
* @suppress
*/
override fun onUpdateParticipants(updates: List<LivekitModels.ParticipantInfo>) {
for (info in updates) {
val participantSid = info.sid
... ... @@ -238,7 +225,7 @@ constructor(
val participant = getOrCreateRemoteParticipant(participantSid, info)
if (info.state == LivekitModels.ParticipantInfo.State.DISCONNECTED) {
handleParticipantDisconnect(participantSid, participant)
handleParticipantDisconnect(participantSid)
} else if (isNewParticipant) {
listener?.onParticipantConnected(this, participant)
} else {
... ... @@ -349,7 +336,7 @@ constructor(
fun initVideoRenderer(viewRenderer: SurfaceViewRenderer) {
viewRenderer.init(eglBase.eglBaseContext, null)
viewRenderer.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT)
viewRenderer.setEnableHardwareScaler(false /* enabled */);
viewRenderer.setEnableHardwareScaler(false /* enabled */)
}
}
... ...
... ... @@ -33,7 +33,6 @@ class SubscriberTransportObserver(
override fun onDataChannel(channel: DataChannel) {
Timber.v { "onDataChannel" }
engine.listener?.onAddDataChannel(channel)
}
override fun onStandardizedIceConnectionChange(newState: PeerConnection.IceConnectionState?) {
... ...
... ... @@ -61,7 +61,7 @@ internal constructor(
val cid = track.rtcTrack.id()
val trackInfo =
engine.addTrack(cid = cid, name = track.name, kind = track.kind)
engine.addTrack(cid = cid, name = track.name, kind = track.kind.toProto())
val transInit = RtpTransceiver.RtpTransceiverInit(
RtpTransceiver.RtpTransceiverDirection.SEND_ONLY,
listOf(this.sid)
... ... @@ -117,15 +117,19 @@ internal constructor(
return
}
track.stop()
if (track is MediaTrack) {
unpublishMediaTrack(track, sid)
val senders = engine.publisher.peerConnection.senders ?: return
for (sender in senders) {
val t = sender.track() ?: continue
if (t == track.rtcTrack) {
engine.publisher.peerConnection.removeTrack(sender)
}
}
val sid = publication.sid
tracks.remove(sid)
when (publication.kind) {
LivekitModels.TrackType.AUDIO -> audioTracks.remove(sid)
LivekitModels.TrackType.VIDEO -> videoTracks.remove(sid)
LivekitModels.TrackType.DATA -> dataTracks.remove(sid)
Track.Kind.AUDIO -> audioTracks.remove(sid)
Track.Kind.VIDEO -> videoTracks.remove(sid)
else -> {}
}
}
... ... @@ -179,19 +183,6 @@ internal constructor(
}
}
private fun <T> unpublishMediaTrack(
track: T,
sid: String
) where T : MediaTrack {
val senders = engine.publisher.peerConnection.senders ?: return
for (sender in senders) {
val t = sender.track() ?: continue
if (t == track.rtcTrack) {
engine.publisher.peerConnection.removeTrack(sender)
}
}
}
interface PublishListener {
fun onPublishSuccess(publication: TrackPublication) {}
fun onPublishFailure(exception: Exception) {}
... ...
... ... @@ -2,7 +2,6 @@ package io.livekit.android.room.participant
import io.livekit.android.room.track.*
import livekit.LivekitModels
import java.nio.ByteBuffer
open class Participant(var sid: String, identity: String? = null) {
var participantInfo: LivekitModels.ParticipantInfo? = null
... ... @@ -48,8 +47,6 @@ open class Participant(var sid: String, identity: String? = null) {
private set
var videoTracks = mutableMapOf<String, TrackPublication>()
private set
var dataTracks = mutableMapOf<String, TrackPublication>()
private set
/**
* @suppress
... ... @@ -59,9 +56,9 @@ open class Participant(var sid: String, identity: String? = null) {
track?.sid = publication.sid
tracks[publication.sid] = publication
when (publication.kind) {
LivekitModels.TrackType.AUDIO -> audioTracks[publication.sid] = publication
LivekitModels.TrackType.VIDEO -> videoTracks[publication.sid] = publication
LivekitModels.TrackType.DATA -> dataTracks[publication.sid] = publication
Track.Kind.AUDIO -> audioTracks[publication.sid] = publication
Track.Kind.VIDEO -> videoTracks[publication.sid] = publication
else -> {}
}
}
... ...
... ... @@ -9,7 +9,6 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import livekit.LivekitModels
import org.webrtc.AudioTrack
import org.webrtc.DataChannel
import org.webrtc.MediaStreamTrack
import org.webrtc.VideoTrack
... ... @@ -108,55 +107,11 @@ class RemoteParticipant(
listener?.onTrackSubscribed(track, publication, this)
}
/**
* @suppress
*/
fun addSubscribedDataTrack(dataChannel: DataChannel, sid: String, name: String) {
val track = DataTrack(name, dataChannel)
var publication = getTrackPublication(sid)
if (publication == null) {
val trackInfo = LivekitModels.TrackInfo.newBuilder()
.setSid(sid)
.setName(name)
.setType(LivekitModels.TrackType.DATA)
.build()
publication = RemoteTrackPublication(info = trackInfo, participant = this)
addTrackPublication(publication)
if (hasInfo) {
internalListener?.onTrackPublished(publication, this)
listener?.onTrackPublished(publication, this)
}
}
publication.track = track
track.sid = publication.sid
dataChannel.registerObserver(object : DataChannel.Observer {
override fun onBufferedAmountChange(previousAmount: Long) {}
override fun onStateChange() {
val newState = dataChannel.state()
if (newState == DataChannel.State.CLOSED) {
publication.track = null
internalListener?.onTrackUnsubscribed(track, publication, this@RemoteParticipant)
listener?.onTrackUnsubscribed(track, publication, this@RemoteParticipant)
}
}
override fun onMessage(buffer: DataChannel.Buffer) {
}
})
internalListener?.onTrackSubscribed(track, publication, participant = this)
listener?.onTrackSubscribed(track, publication, this)
}
fun unpublishTrack(trackSid: String, sendUnpublish: Boolean = false) {
val publication = tracks.remove(trackSid) as? RemoteTrackPublication ?: return
when (publication.kind) {
LivekitModels.TrackType.AUDIO -> audioTracks.remove(trackSid)
LivekitModels.TrackType.VIDEO -> videoTracks.remove(trackSid)
LivekitModels.TrackType.DATA -> dataTracks.remove(trackSid)
Track.Kind.AUDIO -> audioTracks.remove(trackSid)
Track.Kind.VIDEO -> videoTracks.remove(trackSid)
else -> throw TrackException.InvalidTrackTypeException()
}
... ...
... ... @@ -4,6 +4,6 @@ import livekit.LivekitModels
import org.webrtc.AudioTrack
open class AudioTrack(name: String, override val rtcTrack: AudioTrack) :
MediaTrack(name, LivekitModels.TrackType.AUDIO, rtcTrack) {
Track(name, Kind.AUDIO, rtcTrack) {
}
\ No newline at end of file
}
... ...
package io.livekit.android.room.track
import livekit.LivekitModels
import org.webrtc.DataChannel
open class DataTrack(
name: String,
var dataChannel: DataChannel? = null
) : Track(name, LivekitModels.TrackType.DATA) {
var ordered: Boolean = TODO()
private set
var maxRetransmitTimeMs: Int = TODO()
private set
var maxRetransmits: Int = TODO()
private set
fun updateConfig(config: DataChannel.Init) {
ordered = config.ordered
maxRetransmitTimeMs = config.maxRetransmitTimeMs
maxRetransmits = config.maxRetransmits
}
override fun stop() {
dataChannel?.unregisterObserver()
}
}
package io.livekit.android.room.track
data class DataTrackOptions(
val ordered: Boolean = true,
val maxRetransmitTimeMs: Int = -1,
val maxRetransmits: Int = -1,
val name: String
)
package io.livekit.android.room.track
import org.webrtc.DataChannel
import java.nio.ByteBuffer
import java.util.*
class LocalDataTrack(
val options: DataTrackOptions
) : DataTrack(options.name) {
var cid: String = UUID.randomUUID().toString()
fun sendString(message: String) {
val byteBuffer = ByteBuffer.wrap(message.toByteArray())
val buffer = DataChannel.Buffer(byteBuffer, false)
dataChannel?.send(buffer)
}
fun sendBytes(byteBuffer: ByteBuffer) {
val buffer = DataChannel.Buffer(byteBuffer, true)
dataChannel?.send(buffer)
}
}
... ... @@ -5,7 +5,7 @@ import livekit.LivekitModels
class LocalTrackPublication(
info: LivekitModels.TrackInfo,
track: Track? = null,
track: Track,
participant: LocalParticipant
) : TrackPublication(info, track, participant) {
... ... @@ -18,13 +18,13 @@ class LocalTrackPublication(
return
}
val mediaTrack = track as? MediaTrack ?: return
val mediaTrack = track ?: return
mediaTrack.rtcTrack.setEnabled(!muted)
this.muted = muted
// send updates to server
val participant = this.participant as? LocalParticipant ?: return
val participant = this.participant.get() as? LocalParticipant ?: return
participant.engine.updateMuteStatus(sid, muted)
... ...
package io.livekit.android.room.track
import livekit.LivekitModels
import org.webrtc.MediaStreamTrack
open class MediaTrack(name: String, kind: LivekitModels.TrackType, open val rtcTrack: MediaStreamTrack) :
Track(name, kind) {
// TODO: how do we mute/disable a track
override fun stop() {
rtcTrack.setEnabled(false)
rtcTrack.dispose()
}
}
... ... @@ -27,7 +27,7 @@ class RemoteTrackPublication(
return
}
field = v
val participant = this.participant as? RemoteParticipant ?: return
val participant = this.participant.get() as? RemoteParticipant ?: return
if (v) {
participant.listener?.onTrackMuted(this, participant)
participant.internalListener?.onTrackMuted(this, participant)
... ... @@ -42,7 +42,7 @@ class RemoteTrackPublication(
*/
fun setSubscribed(subscribed: Boolean) {
unsubscribed = !subscribed
val participant = this.participant as? RemoteParticipant ?: return
val participant = this.participant.get() as? RemoteParticipant ?: return
participant.rtcClient.sendUpdateSubscription(sid, !unsubscribed, videoQuality)
}
... ... @@ -70,7 +70,7 @@ class RemoteTrackPublication(
}
private fun sendUpdateTrackSettings() {
val participant = this.participant as? RemoteParticipant ?: return
val participant = this.participant.get() as? RemoteParticipant ?: return
participant.rtcClient.sendUpdateTrackSettings(sid, disabled, videoQuality)
}
... ...
... ... @@ -6,7 +6,8 @@ import org.webrtc.MediaStreamTrack
open class Track(
name: String,
kind: LivekitModels.TrackType
kind: Kind,
open val rtcTrack: MediaStreamTrack
) {
var name = name
internal set
... ... @@ -15,8 +16,38 @@ open class Track(
var sid: String? = null
internal set
enum class Kind(val value: String) {
AUDIO("audio"),
VIDEO("video"),
// unknown
UNRECOGNIZED("unrecognized");
fun toProto(): LivekitModels.TrackType {
return when (this) {
AUDIO -> LivekitModels.TrackType.AUDIO
VIDEO -> LivekitModels.TrackType.VIDEO
UNRECOGNIZED -> LivekitModels.TrackType.UNRECOGNIZED
}
}
override fun toString(): String {
return value;
}
companion object {
fun fromProto(tt: LivekitModels.TrackType): Kind {
return when (tt) {
LivekitModels.TrackType.AUDIO -> AUDIO
LivekitModels.TrackType.VIDEO -> VIDEO
else -> UNRECOGNIZED
}
}
}
}
open fun stop() {
// subclasses override to provide stop behavior
rtcTrack.setEnabled(false)
rtcTrack.dispose()
}
}
... ...
... ... @@ -2,6 +2,7 @@ package io.livekit.android.room.track
import io.livekit.android.room.participant.Participant
import livekit.LivekitModels
import java.lang.ref.WeakReference
open class TrackPublication(
info: LivekitModels.TrackInfo,
... ... @@ -14,7 +15,7 @@ open class TrackPublication(
internal set
var sid: String
private set
var kind: LivekitModels.TrackType
var kind: Track.Kind
private set
open var muted: Boolean = false
internal set
... ... @@ -23,21 +24,20 @@ open class TrackPublication(
return track != null
}
var participant: Participant
var participant: WeakReference<Participant>
init {
sid = info.sid
name = info.name
kind = info.type
kind = Track.Kind.fromProto(info.type)
this.participant = WeakReference(participant)
muted = info.muted
this.participant = participant
}
fun updateFromInfo(info: LivekitModels.TrackInfo) {
sid = info.sid
name = info.name
kind = info.type
kind = Track.Kind.fromProto(info.type)
muted = info.muted
}
}
... ...
... ... @@ -5,7 +5,7 @@ import org.webrtc.VideoSink
import org.webrtc.VideoTrack
open class VideoTrack(name: String, override val rtcTrack: VideoTrack) :
MediaTrack(name, LivekitModels.TrackType.VIDEO, rtcTrack) {
Track(name, Kind.VIDEO, rtcTrack) {
private val sinks: MutableList<VideoSink> = ArrayList();
var enabled: Boolean
... ...