Participant.kt
4.0 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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
private set
var identity: String? = identity
internal set
var audioLevel: Float = 0f
internal set
var isSpeaking: Boolean = false
internal set(v) {
val changed = v == field
field = v
if (changed) {
listener?.onSpeakingChanged(this)
internalListener?.onSpeakingChanged(this)
}
}
var metadata: String? = null
/**
* Listener for when participant properties change
*/
var listener: ParticipantListener? = null
/**
* @suppress
*/
internal var internalListener: ParticipantListener? = null
val hasInfo
get() = participantInfo != null
var tracks = mutableMapOf<String, TrackPublication>()
var audioTracks = mutableMapOf<String, TrackPublication>()
private set
var videoTracks = mutableMapOf<String, TrackPublication>()
private set
var dataTracks = mutableMapOf<String, TrackPublication>()
private set
/**
* @suppress
*/
fun addTrackPublication(publication: TrackPublication) {
val track = publication.track
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
}
}
/**
* @suppress
*/
open fun updateFromInfo(info: LivekitModels.ParticipantInfo) {
sid = info.sid
identity = info.identity
participantInfo = info
val prevMetadata = metadata
metadata = info.metadata
if (prevMetadata != metadata) {
listener?.onMetadataChanged(this, prevMetadata)
internalListener?.onMetadataChanged(this, prevMetadata)
}
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Participant
if (sid != other.sid) return false
return true
}
override fun hashCode(): Int {
return sid.hashCode()
}
}
interface ParticipantListener {
/**
* When a participant's metadata is updated, fired for all participants
*/
fun onMetadataChanged(participant: Participant, prevMetadata: String?) {}
/**
* Fired when the current participant's isSpeaking property changes. (including LocalParticipant)
*/
fun onSpeakingChanged(participant: Participant) {}
fun onTrackPublished(publication: TrackPublication, participant: RemoteParticipant) {}
fun onTrackUnpublished(publication: TrackPublication, participant: RemoteParticipant) {}
fun onEnable(publication: TrackPublication, participant: RemoteParticipant) {}
fun onDisable(publication: TrackPublication, participant: RemoteParticipant) {}
fun onTrackSubscribed(track: Track, publication: TrackPublication, participant: RemoteParticipant) {}
fun onTrackSubscriptionFailed(
sid: String,
exception: Exception,
participant: RemoteParticipant
) {
}
fun onTrackUnsubscribed(
track: Track,
publication: TrackPublication,
participant: RemoteParticipant
) {
}
fun onDataReceived(
data: ByteBuffer,
dataTrack: DataTrack,
participant: RemoteParticipant
) {
}
fun switchedOffVideo(track: VideoTrack, publication: TrackPublication, participant: RemoteParticipant) {}
fun switchedOnVideo(track: VideoTrack, publication: TrackPublication, participant: RemoteParticipant) {}
}