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
David Liu
2021-03-20 10:56:06 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
d421b47b606024fc8b86d136fdf3c568e5fb5bc8
d421b47b
1 parent
4afefe56
fool proof coroutinesdpobserver a little better
隐藏空白字符变更
内嵌
并排对比
正在显示
4 个修改的文件
包含
56 行增加
和
45 行删除
livekit-android-sdk/src/main/java/io/livekit/android/room/RTCEngine.kt
livekit-android-sdk/src/main/java/io/livekit/android/room/util/CoroutineSdpObserver.kt
sample-app/src/main/java/io/livekit/android/sample/CallActivity.kt
sample-app/src/main/java/io/livekit/android/sample/ParticipantItem.kt
livekit-android-sdk/src/main/java/io/livekit/android/room/RTCEngine.kt
查看文件 @
d421b47
...
...
@@ -5,7 +5,7 @@ import com.github.ajalt.timberkt.Timber
import io.livekit.android.dagger.InjectionNames
import io.livekit.android.room.track.Track
import io.livekit.android.room.track.TrackException
import io.livekit.android.room.util.
CoroutineSdpObserver
import io.livekit.android.room.util.
*
import io.livekit.android.util.CloseableCoroutineScope
import io.livekit.android.util.Either
import kotlinx.coroutines.CoroutineDispatcher
...
...
@@ -101,22 +101,23 @@ constructor(
return
}
coroutineScope.launch {
val offerObserver = CoroutineSdpObserver()
publisher.peerConnection.createOffer(offerObserver, OFFER_CONSTRAINTS)
val sdpOffer = when (val outcome = offerObserver.awaitCreate()) {
is Either.Left -> outcome.value
val sdpOffer =
when (val outcome = publisher.peerConnection.createOffer(OFFER_CONSTRAINTS)) {
is Either.Left -> outcome.value
is Either.Right -> {
Timber.d { "error creating offer: ${outcome.value}" }
return@launch
}
}
when (val outcome = publisher.peerConnection.setLocalDescription(sdpOffer)) {
is Either.Right -> {
Timber.d { "error
creating offer
: ${outcome.value}" }
Timber.d { "error
setting local description
: ${outcome.value}" }
return@launch
}
}
val setObserver = CoroutineSdpObserver()
publisher.peerConnection.setLocalDescription(setObserver, sdpOffer)
when (val outcome = setObserver.awaitSet()) {
is Either.Left -> client.sendOffer(sdpOffer)
is Either.Right -> Timber.d { "error setting local description: ${outcome.value}" }
}
client.sendOffer(sdpOffer)
}
}
...
...
@@ -163,31 +164,29 @@ constructor(
joinResponse = info
coroutineScope.launch {
val offerObserver = CoroutineSdpObserver()
publisher.peerConnection.createOffer(offerObserver, OFFER_CONSTRAINTS)
val sdpOffer = when (val outcome = offerObserver.awaitCreate()) {
is Either.Left -> outcome.value
val sdpOffer =
when (val outcome = publisher.peerConnection.createOffer(OFFER_CONSTRAINTS)) {
is Either.Left -> outcome.value
is Either.Right -> {
Timber.d { "error creating offer: ${outcome.value}" }
return@launch
}
}
when (val outcome = publisher.peerConnection.setLocalDescription(sdpOffer)) {
is Either.Right -> {
Timber.d { "error creating offer: ${outcome.value}" }
return@launch
Timber.d { "error setting local description: ${outcome.value}" }
}
}
val setObserver = CoroutineSdpObserver()
publisher.peerConnection.setLocalDescription(setObserver, sdpOffer)
when (val outcome = setObserver.awaitSet()) {
is Either.Left -> client.sendOffer(sdpOffer)
is Either.Right -> Timber.d { "error setting local description: ${outcome.value}" }
}
client.sendOffer(sdpOffer)
}
}
override fun onAnswer(sessionDescription: SessionDescription) {
Timber.v { "received server answer: ${sessionDescription.type}, ${publisher.peerConnection.signalingState()}" }
val observer = CoroutineSdpObserver()
publisher.peerConnection.setRemoteDescription(observer, sessionDescription)
coroutineScope.launch {
when (val outcome =
observer.awaitSet(
)) {
when (val outcome =
publisher.peerConnection.setRemoteDescription(sessionDescription
)) {
is Either.Left -> {
if (!rtcConnected) {
onRTCConnected()
...
...
@@ -204,9 +203,8 @@ constructor(
Timber.v { "received server offer: ${sessionDescription.type}, ${subscriber.peerConnection.signalingState()}" }
coroutineScope.launch {
run<Unit> {
val observer = CoroutineSdpObserver()
subscriber.peerConnection.setRemoteDescription(observer, sessionDescription)
when (val outcome = observer.awaitSet()) {
when (val outcome =
subscriber.peerConnection.setRemoteDescription(sessionDescription)) {
is Either.Right -> {
Timber.e { "error setting remote description for answer: ${outcome.value} " }
return@launch
...
...
@@ -215,9 +213,7 @@ constructor(
}
val answer = run {
val observer = CoroutineSdpObserver()
subscriber.peerConnection.createAnswer(observer, OFFER_CONSTRAINTS)
when (val outcome = observer.awaitCreate()) {
when (val outcome = subscriber.peerConnection.createAnswer(OFFER_CONSTRAINTS)) {
is Either.Left -> outcome.value
is Either.Right -> {
Timber.e { "error creating answer: ${outcome.value}" }
...
...
@@ -227,9 +223,7 @@ constructor(
}
run<Unit> {
val observer = CoroutineSdpObserver()
subscriber.peerConnection.setLocalDescription(observer, answer)
when (val outcome = observer.awaitSet()) {
when (val outcome = subscriber.peerConnection.setLocalDescription(answer)) {
is Either.Right -> {
Timber.e { "error setting local description for answer: ${outcome.value}" }
return@launch
...
...
livekit-android-sdk/src/main/java/io/livekit/android/room/util/CoroutineSdpObserver.kt
查看文件 @
d421b47
package io.livekit.android.room.util
import io.livekit.android.util.Either
import org.webrtc.MediaConstraints
import org.webrtc.PeerConnection
import org.webrtc.SdpObserver
import org.webrtc.SessionDescription
import kotlin.coroutines.Continuation
...
...
@@ -71,4 +73,28 @@ class CoroutineSdpObserver : SdpObserver {
pendingSets.add(cont)
}
}
}
suspend fun PeerConnection.createOffer(constraints: MediaConstraints): Either<SessionDescription, String?> {
val observer = CoroutineSdpObserver()
this.createOffer(observer, constraints)
return observer.awaitCreate()
}
suspend fun PeerConnection.createAnswer(constraints: MediaConstraints): Either<SessionDescription, String?> {
val observer = CoroutineSdpObserver()
this.createAnswer(observer, constraints)
return observer.awaitCreate()
}
suspend fun PeerConnection.setRemoteDescription(description: SessionDescription): Either<Unit, String?> {
val observer = CoroutineSdpObserver()
this.setRemoteDescription(observer, description)
return observer.awaitSet()
}
suspend fun PeerConnection.setLocalDescription(description: SessionDescription): Either<Unit, String?> {
val observer = CoroutineSdpObserver()
this.setLocalDescription(observer, description)
return observer.awaitSet()
}
\ No newline at end of file
...
...
sample-app/src/main/java/io/livekit/android/sample/CallActivity.kt
查看文件 @
d421b47
...
...
@@ -14,7 +14,6 @@ import kotlinx.parcelize.Parcelize
class CallActivity : AppCompatActivity() {
val viewModel: CallViewModel by viewModelByFactory {
val args = intent.getParcelableExtra<BundleArgs>(KEY_ARGS)
?: throw NullPointerException("args is null!")
CallViewModel(args.url, args.token, application)
...
...
sample-app/src/main/java/io/livekit/android/sample/ParticipantItem.kt
查看文件 @
d421b47
...
...
@@ -10,8 +10,6 @@ import io.livekit.android.room.track.RemoteVideoTrackPublication
import io.livekit.android.room.track.VideoTrack
import io.livekit.android.room.track.VideoTrackPublication
import io.livekit.android.sample.databinding.ParticipantItemBinding
import org.webrtc.VideoFrame
import org.webrtc.VideoSink
class ParticipantItem(
val room: Room,
...
...
@@ -63,12 +61,6 @@ class ParticipantItem(
videoBound = true
Timber.v { "adding renderer to $videoTrack" }
videoTrack.addRenderer(object : VideoSink {
override fun onFrame(frame: VideoFrame?) {
Timber.v { "$frame" }
}
})
videoTrack.addRenderer(viewBinding.renderer)
}
...
...
请
注册
或
登录
后发表评论