Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
xuning
/
livekitAndroidXuningTest
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
davidliu
2024-07-01 22:47:30 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Committed by
GitHub
2024-07-01 22:47:30 +0900
Commit
ee983c1ece78c9d452e31bd64a8bc2a65626980a
ee983c1e
1 parent
93793208
Fix race condition with videoTrack.addRenderer (#448)
隐藏空白字符变更
内嵌
并排对比
正在显示
2 个修改的文件
包含
23 行增加
和
6 行删除
livekit-android-sdk/src/main/java/io/livekit/android/room/track/Track.kt
livekit-android-sdk/src/main/java/io/livekit/android/room/track/VideoTrack.kt
livekit-android-sdk/src/main/java/io/livekit/android/room/track/Track.kt
查看文件 @
ee983c1
...
...
@@ -52,6 +52,16 @@ abstract class Track(
var statsGetter: RTCStatsGetter? = null
/**
* [MediaStreamTrack] doesn't expose a way to tell if it's disposed. Track it here.
* This can only be safely accessed on the rtc thread.
*
* Note: [MediaStreamTrack] can still be disposed if we don't own it, so this isn't necessarily safe,
* however generally all the tracks passed into this class are owned by this class.
*/
internal var isDisposed = false
private set
/**
* Return the [RTCStatsReport] for this track, or null if none is available.
*/
suspend fun getRTCStats(): RTCStatsReport? = statsGetter?.getStats()
...
...
@@ -172,6 +182,7 @@ abstract class Track(
*/
open fun dispose() {
executeBlockingOnRTCThread {
isDisposed = true
rtcTrack.dispose()
}
}
...
...
livekit-android-sdk/src/main/java/io/livekit/android/room/track/VideoTrack.kt
查看文件 @
ee983c1
...
...
@@ -35,8 +35,10 @@ abstract class VideoTrack(name: String, override val rtcTrack: VideoTrack) :
*/
open fun addRenderer(renderer: VideoSink) {
executeBlockingOnRTCThread {
sinks.add(renderer)
rtcTrack.addSink(renderer)
if (!isDisposed) {
sinks.add(renderer)
rtcTrack.addSink(renderer)
}
}
}
...
...
@@ -45,15 +47,19 @@ abstract class VideoTrack(name: String, override val rtcTrack: VideoTrack) :
*/
open fun removeRenderer(renderer: VideoSink) {
executeBlockingOnRTCThread {
rtcTrack.removeSink(renderer)
sinks.remove(renderer)
if (!isDisposed) {
rtcTrack.removeSink(renderer)
sinks.remove(renderer)
}
}
}
override fun stop() {
executeBlockingOnRTCThread {
for (sink in sinks) {
rtcTrack.removeSink(sink)
if (!isDisposed) {
for (sink in sinks) {
rtcTrack.removeSink(sink)
}
}
sinks.clear()
}
...
...
请
注册
或
登录
后发表评论