/
ActiveSpeakerHandler.kt
69 lines (57 loc) · 2.28 KB
/
ActiveSpeakerHandler.kt
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
package live.hms.app2.ui.meeting.activespeaker
import live.hms.app2.ui.meeting.MeetingTrack
import live.hms.video.sdk.models.HMSSpeaker
import live.hms.video.utils.HMSLogger
class ActiveSpeakerHandler(private val getTracks: () -> List<MeetingTrack>) {
private val TAG = ActiveSpeakerHandler::class.java.simpleName
private val speakerCache = ActiveSpeakerCache<SpeakerItem>(4)
fun trackUpdateTrigger(tracks: List<MeetingTrack>): List<MeetingTrack> {
synchronized(tracks) {
// Update lru just to keep it as much filled as possible
val all = tracks
.sortedByDescending {
if (it.audio == null || it.audio?.isMute == true || it.isScreen) {
it.peer.name.hashCode() * -1 // Drop these ids really low.
} else
it.peer.name.hashCode()
}
.map {
SpeakerItem(it.peer.peerID, it.peer.name)
}
speakerCache.update(all, false)
return update()
}
}
fun speakerUpdate(speakers: Array<HMSSpeaker>): Pair<List<MeetingTrack>, Array<HMSSpeaker>> {
HMSLogger.v(
TAG,
"speakers update received 🎙 [size=${speakers.size}, names=${speakers.map { it.peer?.name }}] "
)
speakerCache.update(
speakers.filter { it.peer != null } // Sometimes the peer which the server says is speaking, might be missing.
.map { SpeakerItem(it.peer!!.peerID, it.peer!!.name) },
true
)
return Pair(update(), speakers)
}
private fun update(): List<MeetingTrack> {
// Update all the videos which aren't screenshares
val order = speakerCache.getAllItems()
val videos = order.mapNotNull { orderedItem ->
getTracks().find { givenTrack ->
givenTrack.peer.peerID == orderedItem.peerId && givenTrack.isScreen.not()
}
}
return videos
// Always bind videos after this function is called
// updateVideos(binding.container, videos)
}
data class SpeakerItem(
val peerId: String,
val peerName: String
) {
override fun toString(): String {
return peerName
}
}
}