正在显示
17 个修改的文件
包含
67 行增加
和
180 行删除
| @@ -43,7 +43,7 @@ constructor( | @@ -43,7 +43,7 @@ constructor( | ||
| 43 | url: String, | 43 | url: String, |
| 44 | token: String, | 44 | token: String, |
| 45 | ) { | 45 | ) { |
| 46 | - val wsUrlString = "$url/rtc?access_token=$token&protocol=$PROTOCOL_VERSION" | 46 | + val wsUrlString = "$url/rtc?protocol=$PROTOCOL_VERSION&access_token=$token" |
| 47 | Timber.i { "connecting to $wsUrlString" } | 47 | Timber.i { "connecting to $wsUrlString" } |
| 48 | 48 | ||
| 49 | val request = Request.Builder() | 49 | val request = Request.Builder() |
| @@ -111,7 +111,6 @@ constructor( | @@ -111,7 +111,6 @@ constructor( | ||
| 111 | fun onICEConnected() | 111 | fun onICEConnected() |
| 112 | fun onAddTrack(track: MediaStreamTrack, streams: Array<out MediaStream>) | 112 | fun onAddTrack(track: MediaStreamTrack, streams: Array<out MediaStream>) |
| 113 | // fun onPublishLocalTrack(cid: String, track: LivekitModels.TrackInfo) | 113 | // fun onPublishLocalTrack(cid: String, track: LivekitModels.TrackInfo) |
| 114 | - fun onAddDataChannel(channel: DataChannel) | ||
| 115 | fun onUpdateParticipants(updates: List<LivekitModels.ParticipantInfo>) | 114 | fun onUpdateParticipants(updates: List<LivekitModels.ParticipantInfo>) |
| 116 | fun onUpdateSpeakers(speakers: List<LivekitRtc.SpeakerInfo>) | 115 | fun onUpdateSpeakers(speakers: List<LivekitRtc.SpeakerInfo>) |
| 117 | fun onDisconnect(reason: String) | 116 | fun onDisconnect(reason: String) |
| @@ -11,11 +11,9 @@ import io.livekit.android.room.participant.Participant | @@ -11,11 +11,9 @@ import io.livekit.android.room.participant.Participant | ||
| 11 | import io.livekit.android.room.participant.ParticipantListener | 11 | import io.livekit.android.room.participant.ParticipantListener |
| 12 | import io.livekit.android.room.participant.RemoteParticipant | 12 | import io.livekit.android.room.participant.RemoteParticipant |
| 13 | import io.livekit.android.room.track.* | 13 | import io.livekit.android.room.track.* |
| 14 | -import io.livekit.android.room.util.unpackedTrackLabel | ||
| 15 | import livekit.LivekitModels | 14 | import livekit.LivekitModels |
| 16 | import livekit.LivekitRtc | 15 | import livekit.LivekitRtc |
| 17 | import org.webrtc.* | 16 | import org.webrtc.* |
| 18 | -import java.nio.ByteBuffer | ||
| 19 | import kotlin.coroutines.Continuation | 17 | import kotlin.coroutines.Continuation |
| 20 | import kotlin.coroutines.resume | 18 | import kotlin.coroutines.resume |
| 21 | import kotlin.coroutines.suspendCoroutine | 19 | import kotlin.coroutines.suspendCoroutine |
| @@ -71,7 +69,7 @@ constructor( | @@ -71,7 +69,7 @@ constructor( | ||
| 71 | handleDisconnect() | 69 | handleDisconnect() |
| 72 | } | 70 | } |
| 73 | 71 | ||
| 74 | - private fun handleParticipantDisconnect(sid: String, participant: RemoteParticipant) { | 72 | + private fun handleParticipantDisconnect(sid: String) { |
| 75 | val removedParticipant = mutableRemoteParticipants.remove(sid) ?: return | 73 | val removedParticipant = mutableRemoteParticipants.remove(sid) ?: return |
| 76 | removedParticipant.tracks.values.toList().forEach { publication -> | 74 | removedParticipant.tracks.values.toList().forEach { publication -> |
| 77 | removedParticipant.unpublishTrack(publication.sid) | 75 | removedParticipant.unpublishTrack(publication.sid) |
| @@ -214,17 +212,6 @@ constructor( | @@ -214,17 +212,6 @@ constructor( | ||
| 214 | /** | 212 | /** |
| 215 | * @suppress | 213 | * @suppress |
| 216 | */ | 214 | */ |
| 217 | - override fun onAddDataChannel(channel: DataChannel) { | ||
| 218 | - val unpackedTrackLabel = channel.unpackedTrackLabel() | ||
| 219 | - val (participantSid, trackSid, name) = unpackedTrackLabel | ||
| 220 | - val participant = getOrCreateRemoteParticipant(participantSid) | ||
| 221 | - participant.addSubscribedDataTrack(channel, trackSid, name) | ||
| 222 | - } | ||
| 223 | - | ||
| 224 | - | ||
| 225 | - /** | ||
| 226 | - * @suppress | ||
| 227 | - */ | ||
| 228 | override fun onUpdateParticipants(updates: List<LivekitModels.ParticipantInfo>) { | 215 | override fun onUpdateParticipants(updates: List<LivekitModels.ParticipantInfo>) { |
| 229 | for (info in updates) { | 216 | for (info in updates) { |
| 230 | val participantSid = info.sid | 217 | val participantSid = info.sid |
| @@ -238,7 +225,7 @@ constructor( | @@ -238,7 +225,7 @@ constructor( | ||
| 238 | val participant = getOrCreateRemoteParticipant(participantSid, info) | 225 | val participant = getOrCreateRemoteParticipant(participantSid, info) |
| 239 | 226 | ||
| 240 | if (info.state == LivekitModels.ParticipantInfo.State.DISCONNECTED) { | 227 | if (info.state == LivekitModels.ParticipantInfo.State.DISCONNECTED) { |
| 241 | - handleParticipantDisconnect(participantSid, participant) | 228 | + handleParticipantDisconnect(participantSid) |
| 242 | } else if (isNewParticipant) { | 229 | } else if (isNewParticipant) { |
| 243 | listener?.onParticipantConnected(this, participant) | 230 | listener?.onParticipantConnected(this, participant) |
| 244 | } else { | 231 | } else { |
| @@ -349,7 +336,7 @@ constructor( | @@ -349,7 +336,7 @@ constructor( | ||
| 349 | fun initVideoRenderer(viewRenderer: SurfaceViewRenderer) { | 336 | fun initVideoRenderer(viewRenderer: SurfaceViewRenderer) { |
| 350 | viewRenderer.init(eglBase.eglBaseContext, null) | 337 | viewRenderer.init(eglBase.eglBaseContext, null) |
| 351 | viewRenderer.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT) | 338 | viewRenderer.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT) |
| 352 | - viewRenderer.setEnableHardwareScaler(false /* enabled */); | 339 | + viewRenderer.setEnableHardwareScaler(false /* enabled */) |
| 353 | } | 340 | } |
| 354 | } | 341 | } |
| 355 | 342 |
| @@ -33,7 +33,6 @@ class SubscriberTransportObserver( | @@ -33,7 +33,6 @@ class SubscriberTransportObserver( | ||
| 33 | 33 | ||
| 34 | override fun onDataChannel(channel: DataChannel) { | 34 | override fun onDataChannel(channel: DataChannel) { |
| 35 | Timber.v { "onDataChannel" } | 35 | Timber.v { "onDataChannel" } |
| 36 | - engine.listener?.onAddDataChannel(channel) | ||
| 37 | } | 36 | } |
| 38 | 37 | ||
| 39 | override fun onStandardizedIceConnectionChange(newState: PeerConnection.IceConnectionState?) { | 38 | override fun onStandardizedIceConnectionChange(newState: PeerConnection.IceConnectionState?) { |
| @@ -61,7 +61,7 @@ internal constructor( | @@ -61,7 +61,7 @@ internal constructor( | ||
| 61 | 61 | ||
| 62 | val cid = track.rtcTrack.id() | 62 | val cid = track.rtcTrack.id() |
| 63 | val trackInfo = | 63 | val trackInfo = |
| 64 | - engine.addTrack(cid = cid, name = track.name, kind = track.kind) | 64 | + engine.addTrack(cid = cid, name = track.name, kind = track.kind.toProto()) |
| 65 | val transInit = RtpTransceiver.RtpTransceiverInit( | 65 | val transInit = RtpTransceiver.RtpTransceiverInit( |
| 66 | RtpTransceiver.RtpTransceiverDirection.SEND_ONLY, | 66 | RtpTransceiver.RtpTransceiverDirection.SEND_ONLY, |
| 67 | listOf(this.sid) | 67 | listOf(this.sid) |
| @@ -117,15 +117,19 @@ internal constructor( | @@ -117,15 +117,19 @@ internal constructor( | ||
| 117 | return | 117 | return |
| 118 | } | 118 | } |
| 119 | track.stop() | 119 | track.stop() |
| 120 | - if (track is MediaTrack) { | ||
| 121 | - unpublishMediaTrack(track, sid) | 120 | + val senders = engine.publisher.peerConnection.senders ?: return |
| 121 | + for (sender in senders) { | ||
| 122 | + val t = sender.track() ?: continue | ||
| 123 | + if (t == track.rtcTrack) { | ||
| 124 | + engine.publisher.peerConnection.removeTrack(sender) | ||
| 125 | + } | ||
| 122 | } | 126 | } |
| 127 | + | ||
| 123 | val sid = publication.sid | 128 | val sid = publication.sid |
| 124 | tracks.remove(sid) | 129 | tracks.remove(sid) |
| 125 | when (publication.kind) { | 130 | when (publication.kind) { |
| 126 | - LivekitModels.TrackType.AUDIO -> audioTracks.remove(sid) | ||
| 127 | - LivekitModels.TrackType.VIDEO -> videoTracks.remove(sid) | ||
| 128 | - LivekitModels.TrackType.DATA -> dataTracks.remove(sid) | 131 | + Track.Kind.AUDIO -> audioTracks.remove(sid) |
| 132 | + Track.Kind.VIDEO -> videoTracks.remove(sid) | ||
| 129 | else -> {} | 133 | else -> {} |
| 130 | } | 134 | } |
| 131 | } | 135 | } |
| @@ -179,19 +183,6 @@ internal constructor( | @@ -179,19 +183,6 @@ internal constructor( | ||
| 179 | } | 183 | } |
| 180 | } | 184 | } |
| 181 | 185 | ||
| 182 | - private fun <T> unpublishMediaTrack( | ||
| 183 | - track: T, | ||
| 184 | - sid: String | ||
| 185 | - ) where T : MediaTrack { | ||
| 186 | - val senders = engine.publisher.peerConnection.senders ?: return | ||
| 187 | - for (sender in senders) { | ||
| 188 | - val t = sender.track() ?: continue | ||
| 189 | - if (t == track.rtcTrack) { | ||
| 190 | - engine.publisher.peerConnection.removeTrack(sender) | ||
| 191 | - } | ||
| 192 | - } | ||
| 193 | - } | ||
| 194 | - | ||
| 195 | interface PublishListener { | 186 | interface PublishListener { |
| 196 | fun onPublishSuccess(publication: TrackPublication) {} | 187 | fun onPublishSuccess(publication: TrackPublication) {} |
| 197 | fun onPublishFailure(exception: Exception) {} | 188 | fun onPublishFailure(exception: Exception) {} |
| @@ -2,7 +2,6 @@ package io.livekit.android.room.participant | @@ -2,7 +2,6 @@ package io.livekit.android.room.participant | ||
| 2 | 2 | ||
| 3 | import io.livekit.android.room.track.* | 3 | import io.livekit.android.room.track.* |
| 4 | import livekit.LivekitModels | 4 | import livekit.LivekitModels |
| 5 | -import java.nio.ByteBuffer | ||
| 6 | 5 | ||
| 7 | open class Participant(var sid: String, identity: String? = null) { | 6 | open class Participant(var sid: String, identity: String? = null) { |
| 8 | var participantInfo: LivekitModels.ParticipantInfo? = null | 7 | var participantInfo: LivekitModels.ParticipantInfo? = null |
| @@ -48,8 +47,6 @@ open class Participant(var sid: String, identity: String? = null) { | @@ -48,8 +47,6 @@ open class Participant(var sid: String, identity: String? = null) { | ||
| 48 | private set | 47 | private set |
| 49 | var videoTracks = mutableMapOf<String, TrackPublication>() | 48 | var videoTracks = mutableMapOf<String, TrackPublication>() |
| 50 | private set | 49 | private set |
| 51 | - var dataTracks = mutableMapOf<String, TrackPublication>() | ||
| 52 | - private set | ||
| 53 | 50 | ||
| 54 | /** | 51 | /** |
| 55 | * @suppress | 52 | * @suppress |
| @@ -59,9 +56,9 @@ open class Participant(var sid: String, identity: String? = null) { | @@ -59,9 +56,9 @@ open class Participant(var sid: String, identity: String? = null) { | ||
| 59 | track?.sid = publication.sid | 56 | track?.sid = publication.sid |
| 60 | tracks[publication.sid] = publication | 57 | tracks[publication.sid] = publication |
| 61 | when (publication.kind) { | 58 | when (publication.kind) { |
| 62 | - LivekitModels.TrackType.AUDIO -> audioTracks[publication.sid] = publication | ||
| 63 | - LivekitModels.TrackType.VIDEO -> videoTracks[publication.sid] = publication | ||
| 64 | - LivekitModels.TrackType.DATA -> dataTracks[publication.sid] = publication | 59 | + Track.Kind.AUDIO -> audioTracks[publication.sid] = publication |
| 60 | + Track.Kind.VIDEO -> videoTracks[publication.sid] = publication | ||
| 61 | + else -> {} | ||
| 65 | } | 62 | } |
| 66 | } | 63 | } |
| 67 | 64 |
| @@ -9,7 +9,6 @@ import kotlinx.coroutines.delay | @@ -9,7 +9,6 @@ import kotlinx.coroutines.delay | ||
| 9 | import kotlinx.coroutines.launch | 9 | import kotlinx.coroutines.launch |
| 10 | import livekit.LivekitModels | 10 | import livekit.LivekitModels |
| 11 | import org.webrtc.AudioTrack | 11 | import org.webrtc.AudioTrack |
| 12 | -import org.webrtc.DataChannel | ||
| 13 | import org.webrtc.MediaStreamTrack | 12 | import org.webrtc.MediaStreamTrack |
| 14 | import org.webrtc.VideoTrack | 13 | import org.webrtc.VideoTrack |
| 15 | 14 | ||
| @@ -108,55 +107,11 @@ class RemoteParticipant( | @@ -108,55 +107,11 @@ class RemoteParticipant( | ||
| 108 | listener?.onTrackSubscribed(track, publication, this) | 107 | listener?.onTrackSubscribed(track, publication, this) |
| 109 | } | 108 | } |
| 110 | 109 | ||
| 111 | - /** | ||
| 112 | - * @suppress | ||
| 113 | - */ | ||
| 114 | - fun addSubscribedDataTrack(dataChannel: DataChannel, sid: String, name: String) { | ||
| 115 | - val track = DataTrack(name, dataChannel) | ||
| 116 | - var publication = getTrackPublication(sid) | ||
| 117 | - | ||
| 118 | - if (publication == null) { | ||
| 119 | - val trackInfo = LivekitModels.TrackInfo.newBuilder() | ||
| 120 | - .setSid(sid) | ||
| 121 | - .setName(name) | ||
| 122 | - .setType(LivekitModels.TrackType.DATA) | ||
| 123 | - .build() | ||
| 124 | - publication = RemoteTrackPublication(info = trackInfo, participant = this) | ||
| 125 | - addTrackPublication(publication) | ||
| 126 | - if (hasInfo) { | ||
| 127 | - internalListener?.onTrackPublished(publication, this) | ||
| 128 | - listener?.onTrackPublished(publication, this) | ||
| 129 | - } | ||
| 130 | - } | ||
| 131 | - publication.track = track | ||
| 132 | - track.sid = publication.sid | ||
| 133 | - | ||
| 134 | - dataChannel.registerObserver(object : DataChannel.Observer { | ||
| 135 | - override fun onBufferedAmountChange(previousAmount: Long) {} | ||
| 136 | - | ||
| 137 | - override fun onStateChange() { | ||
| 138 | - val newState = dataChannel.state() | ||
| 139 | - if (newState == DataChannel.State.CLOSED) { | ||
| 140 | - publication.track = null | ||
| 141 | - internalListener?.onTrackUnsubscribed(track, publication, this@RemoteParticipant) | ||
| 142 | - listener?.onTrackUnsubscribed(track, publication, this@RemoteParticipant) | ||
| 143 | - } | ||
| 144 | - } | ||
| 145 | - | ||
| 146 | - override fun onMessage(buffer: DataChannel.Buffer) { | ||
| 147 | - | ||
| 148 | - } | ||
| 149 | - }) | ||
| 150 | - internalListener?.onTrackSubscribed(track, publication, participant = this) | ||
| 151 | - listener?.onTrackSubscribed(track, publication, this) | ||
| 152 | - } | ||
| 153 | - | ||
| 154 | fun unpublishTrack(trackSid: String, sendUnpublish: Boolean = false) { | 110 | fun unpublishTrack(trackSid: String, sendUnpublish: Boolean = false) { |
| 155 | val publication = tracks.remove(trackSid) as? RemoteTrackPublication ?: return | 111 | val publication = tracks.remove(trackSid) as? RemoteTrackPublication ?: return |
| 156 | when (publication.kind) { | 112 | when (publication.kind) { |
| 157 | - LivekitModels.TrackType.AUDIO -> audioTracks.remove(trackSid) | ||
| 158 | - LivekitModels.TrackType.VIDEO -> videoTracks.remove(trackSid) | ||
| 159 | - LivekitModels.TrackType.DATA -> dataTracks.remove(trackSid) | 113 | + Track.Kind.AUDIO -> audioTracks.remove(trackSid) |
| 114 | + Track.Kind.VIDEO -> videoTracks.remove(trackSid) | ||
| 160 | else -> throw TrackException.InvalidTrackTypeException() | 115 | else -> throw TrackException.InvalidTrackTypeException() |
| 161 | } | 116 | } |
| 162 | 117 |
| @@ -4,6 +4,6 @@ import livekit.LivekitModels | @@ -4,6 +4,6 @@ import livekit.LivekitModels | ||
| 4 | import org.webrtc.AudioTrack | 4 | import org.webrtc.AudioTrack |
| 5 | 5 | ||
| 6 | open class AudioTrack(name: String, override val rtcTrack: AudioTrack) : | 6 | open class AudioTrack(name: String, override val rtcTrack: AudioTrack) : |
| 7 | - MediaTrack(name, LivekitModels.TrackType.AUDIO, rtcTrack) { | 7 | + Track(name, Kind.AUDIO, rtcTrack) { |
| 8 | 8 | ||
| 9 | -} | ||
| 9 | +} |
| 1 | -package io.livekit.android.room.track | ||
| 2 | - | ||
| 3 | -import livekit.LivekitModels | ||
| 4 | -import org.webrtc.DataChannel | ||
| 5 | - | ||
| 6 | -open class DataTrack( | ||
| 7 | - name: String, | ||
| 8 | - var dataChannel: DataChannel? = null | ||
| 9 | -) : Track(name, LivekitModels.TrackType.DATA) { | ||
| 10 | - var ordered: Boolean = TODO() | ||
| 11 | - private set | ||
| 12 | - var maxRetransmitTimeMs: Int = TODO() | ||
| 13 | - private set | ||
| 14 | - var maxRetransmits: Int = TODO() | ||
| 15 | - private set | ||
| 16 | - | ||
| 17 | - fun updateConfig(config: DataChannel.Init) { | ||
| 18 | - ordered = config.ordered | ||
| 19 | - maxRetransmitTimeMs = config.maxRetransmitTimeMs | ||
| 20 | - maxRetransmits = config.maxRetransmits | ||
| 21 | - } | ||
| 22 | - | ||
| 23 | - override fun stop() { | ||
| 24 | - dataChannel?.unregisterObserver() | ||
| 25 | - } | ||
| 26 | -} |
| 1 | -package io.livekit.android.room.track | ||
| 2 | - | ||
| 3 | -import org.webrtc.DataChannel | ||
| 4 | -import java.nio.ByteBuffer | ||
| 5 | -import java.util.* | ||
| 6 | - | ||
| 7 | -class LocalDataTrack( | ||
| 8 | - val options: DataTrackOptions | ||
| 9 | -) : DataTrack(options.name) { | ||
| 10 | - var cid: String = UUID.randomUUID().toString() | ||
| 11 | - | ||
| 12 | - fun sendString(message: String) { | ||
| 13 | - val byteBuffer = ByteBuffer.wrap(message.toByteArray()) | ||
| 14 | - val buffer = DataChannel.Buffer(byteBuffer, false) | ||
| 15 | - dataChannel?.send(buffer) | ||
| 16 | - } | ||
| 17 | - | ||
| 18 | - fun sendBytes(byteBuffer: ByteBuffer) { | ||
| 19 | - val buffer = DataChannel.Buffer(byteBuffer, true) | ||
| 20 | - dataChannel?.send(buffer) | ||
| 21 | - } | ||
| 22 | -} |
| @@ -5,7 +5,7 @@ import livekit.LivekitModels | @@ -5,7 +5,7 @@ import livekit.LivekitModels | ||
| 5 | 5 | ||
| 6 | class LocalTrackPublication( | 6 | class LocalTrackPublication( |
| 7 | info: LivekitModels.TrackInfo, | 7 | info: LivekitModels.TrackInfo, |
| 8 | - track: Track? = null, | 8 | + track: Track, |
| 9 | participant: LocalParticipant | 9 | participant: LocalParticipant |
| 10 | ) : TrackPublication(info, track, participant) { | 10 | ) : TrackPublication(info, track, participant) { |
| 11 | 11 | ||
| @@ -18,13 +18,13 @@ class LocalTrackPublication( | @@ -18,13 +18,13 @@ class LocalTrackPublication( | ||
| 18 | return | 18 | return |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | - val mediaTrack = track as? MediaTrack ?: return | 21 | + val mediaTrack = track ?: return |
| 22 | 22 | ||
| 23 | mediaTrack.rtcTrack.setEnabled(!muted) | 23 | mediaTrack.rtcTrack.setEnabled(!muted) |
| 24 | this.muted = muted | 24 | this.muted = muted |
| 25 | 25 | ||
| 26 | // send updates to server | 26 | // send updates to server |
| 27 | - val participant = this.participant as? LocalParticipant ?: return | 27 | + val participant = this.participant.get() as? LocalParticipant ?: return |
| 28 | 28 | ||
| 29 | participant.engine.updateMuteStatus(sid, muted) | 29 | participant.engine.updateMuteStatus(sid, muted) |
| 30 | 30 |
| 1 | -package io.livekit.android.room.track | ||
| 2 | - | ||
| 3 | -import livekit.LivekitModels | ||
| 4 | -import org.webrtc.MediaStreamTrack | ||
| 5 | - | ||
| 6 | - | ||
| 7 | -open class MediaTrack(name: String, kind: LivekitModels.TrackType, open val rtcTrack: MediaStreamTrack) : | ||
| 8 | - Track(name, kind) { | ||
| 9 | - | ||
| 10 | - // TODO: how do we mute/disable a track | ||
| 11 | - | ||
| 12 | - override fun stop() { | ||
| 13 | - rtcTrack.setEnabled(false) | ||
| 14 | - rtcTrack.dispose() | ||
| 15 | - } | ||
| 16 | -} |
| @@ -27,7 +27,7 @@ class RemoteTrackPublication( | @@ -27,7 +27,7 @@ class RemoteTrackPublication( | ||
| 27 | return | 27 | return |
| 28 | } | 28 | } |
| 29 | field = v | 29 | field = v |
| 30 | - val participant = this.participant as? RemoteParticipant ?: return | 30 | + val participant = this.participant.get() as? RemoteParticipant ?: return |
| 31 | if (v) { | 31 | if (v) { |
| 32 | participant.listener?.onTrackMuted(this, participant) | 32 | participant.listener?.onTrackMuted(this, participant) |
| 33 | participant.internalListener?.onTrackMuted(this, participant) | 33 | participant.internalListener?.onTrackMuted(this, participant) |
| @@ -42,7 +42,7 @@ class RemoteTrackPublication( | @@ -42,7 +42,7 @@ class RemoteTrackPublication( | ||
| 42 | */ | 42 | */ |
| 43 | fun setSubscribed(subscribed: Boolean) { | 43 | fun setSubscribed(subscribed: Boolean) { |
| 44 | unsubscribed = !subscribed | 44 | unsubscribed = !subscribed |
| 45 | - val participant = this.participant as? RemoteParticipant ?: return | 45 | + val participant = this.participant.get() as? RemoteParticipant ?: return |
| 46 | 46 | ||
| 47 | participant.rtcClient.sendUpdateSubscription(sid, !unsubscribed, videoQuality) | 47 | participant.rtcClient.sendUpdateSubscription(sid, !unsubscribed, videoQuality) |
| 48 | } | 48 | } |
| @@ -70,7 +70,7 @@ class RemoteTrackPublication( | @@ -70,7 +70,7 @@ class RemoteTrackPublication( | ||
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | private fun sendUpdateTrackSettings() { | 72 | private fun sendUpdateTrackSettings() { |
| 73 | - val participant = this.participant as? RemoteParticipant ?: return | 73 | + val participant = this.participant.get() as? RemoteParticipant ?: return |
| 74 | 74 | ||
| 75 | participant.rtcClient.sendUpdateTrackSettings(sid, disabled, videoQuality) | 75 | participant.rtcClient.sendUpdateTrackSettings(sid, disabled, videoQuality) |
| 76 | } | 76 | } |
| @@ -6,7 +6,8 @@ import org.webrtc.MediaStreamTrack | @@ -6,7 +6,8 @@ import org.webrtc.MediaStreamTrack | ||
| 6 | 6 | ||
| 7 | open class Track( | 7 | open class Track( |
| 8 | name: String, | 8 | name: String, |
| 9 | - kind: LivekitModels.TrackType | 9 | + kind: Kind, |
| 10 | + open val rtcTrack: MediaStreamTrack | ||
| 10 | ) { | 11 | ) { |
| 11 | var name = name | 12 | var name = name |
| 12 | internal set | 13 | internal set |
| @@ -15,8 +16,38 @@ open class Track( | @@ -15,8 +16,38 @@ open class Track( | ||
| 15 | var sid: String? = null | 16 | var sid: String? = null |
| 16 | internal set | 17 | internal set |
| 17 | 18 | ||
| 19 | + enum class Kind(val value: String) { | ||
| 20 | + AUDIO("audio"), | ||
| 21 | + VIDEO("video"), | ||
| 22 | + // unknown | ||
| 23 | + UNRECOGNIZED("unrecognized"); | ||
| 24 | + | ||
| 25 | + fun toProto(): LivekitModels.TrackType { | ||
| 26 | + return when (this) { | ||
| 27 | + AUDIO -> LivekitModels.TrackType.AUDIO | ||
| 28 | + VIDEO -> LivekitModels.TrackType.VIDEO | ||
| 29 | + UNRECOGNIZED -> LivekitModels.TrackType.UNRECOGNIZED | ||
| 30 | + } | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + override fun toString(): String { | ||
| 34 | + return value; | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + companion object { | ||
| 38 | + fun fromProto(tt: LivekitModels.TrackType): Kind { | ||
| 39 | + return when (tt) { | ||
| 40 | + LivekitModels.TrackType.AUDIO -> AUDIO | ||
| 41 | + LivekitModels.TrackType.VIDEO -> VIDEO | ||
| 42 | + else -> UNRECOGNIZED | ||
| 43 | + } | ||
| 44 | + } | ||
| 45 | + } | ||
| 46 | + } | ||
| 47 | + | ||
| 18 | open fun stop() { | 48 | open fun stop() { |
| 19 | - // subclasses override to provide stop behavior | 49 | + rtcTrack.setEnabled(false) |
| 50 | + rtcTrack.dispose() | ||
| 20 | } | 51 | } |
| 21 | } | 52 | } |
| 22 | 53 |
| @@ -2,6 +2,7 @@ package io.livekit.android.room.track | @@ -2,6 +2,7 @@ package io.livekit.android.room.track | ||
| 2 | 2 | ||
| 3 | import io.livekit.android.room.participant.Participant | 3 | import io.livekit.android.room.participant.Participant |
| 4 | import livekit.LivekitModels | 4 | import livekit.LivekitModels |
| 5 | +import java.lang.ref.WeakReference | ||
| 5 | 6 | ||
| 6 | open class TrackPublication( | 7 | open class TrackPublication( |
| 7 | info: LivekitModels.TrackInfo, | 8 | info: LivekitModels.TrackInfo, |
| @@ -14,7 +15,7 @@ open class TrackPublication( | @@ -14,7 +15,7 @@ open class TrackPublication( | ||
| 14 | internal set | 15 | internal set |
| 15 | var sid: String | 16 | var sid: String |
| 16 | private set | 17 | private set |
| 17 | - var kind: LivekitModels.TrackType | 18 | + var kind: Track.Kind |
| 18 | private set | 19 | private set |
| 19 | open var muted: Boolean = false | 20 | open var muted: Boolean = false |
| 20 | internal set | 21 | internal set |
| @@ -23,21 +24,20 @@ open class TrackPublication( | @@ -23,21 +24,20 @@ open class TrackPublication( | ||
| 23 | return track != null | 24 | return track != null |
| 24 | } | 25 | } |
| 25 | 26 | ||
| 26 | - var participant: Participant | 27 | + var participant: WeakReference<Participant> |
| 27 | 28 | ||
| 28 | init { | 29 | init { |
| 29 | sid = info.sid | 30 | sid = info.sid |
| 30 | name = info.name | 31 | name = info.name |
| 31 | - kind = info.type | 32 | + kind = Track.Kind.fromProto(info.type) |
| 33 | + this.participant = WeakReference(participant) | ||
| 32 | muted = info.muted | 34 | muted = info.muted |
| 33 | - this.participant = participant | ||
| 34 | } | 35 | } |
| 35 | 36 | ||
| 36 | fun updateFromInfo(info: LivekitModels.TrackInfo) { | 37 | fun updateFromInfo(info: LivekitModels.TrackInfo) { |
| 37 | sid = info.sid | 38 | sid = info.sid |
| 38 | name = info.name | 39 | name = info.name |
| 39 | - kind = info.type | ||
| 40 | - | 40 | + kind = Track.Kind.fromProto(info.type) |
| 41 | muted = info.muted | 41 | muted = info.muted |
| 42 | } | 42 | } |
| 43 | } | 43 | } |
| @@ -5,7 +5,7 @@ import org.webrtc.VideoSink | @@ -5,7 +5,7 @@ import org.webrtc.VideoSink | ||
| 5 | import org.webrtc.VideoTrack | 5 | import org.webrtc.VideoTrack |
| 6 | 6 | ||
| 7 | open class VideoTrack(name: String, override val rtcTrack: VideoTrack) : | 7 | open class VideoTrack(name: String, override val rtcTrack: VideoTrack) : |
| 8 | - MediaTrack(name, LivekitModels.TrackType.VIDEO, rtcTrack) { | 8 | + Track(name, Kind.VIDEO, rtcTrack) { |
| 9 | private val sinks: MutableList<VideoSink> = ArrayList(); | 9 | private val sinks: MutableList<VideoSink> = ArrayList(); |
| 10 | 10 | ||
| 11 | var enabled: Boolean | 11 | var enabled: Boolean |
-
请 注册 或 登录 后发表评论