David Liu

Use PeerConnectionTransport setRemoteDescription

@@ -3,7 +3,12 @@ package io.livekit.android.room @@ -3,7 +3,12 @@ package io.livekit.android.room
3 import dagger.assisted.Assisted 3 import dagger.assisted.Assisted
4 import dagger.assisted.AssistedFactory 4 import dagger.assisted.AssistedFactory
5 import dagger.assisted.AssistedInject 5 import dagger.assisted.AssistedInject
6 -import org.webrtc.* 6 +import io.livekit.android.room.util.CoroutineSdpObserver
  7 +import io.livekit.android.util.Either
  8 +import org.webrtc.IceCandidate
  9 +import org.webrtc.PeerConnection
  10 +import org.webrtc.PeerConnectionFactory
  11 +import org.webrtc.SessionDescription
7 12
8 /** 13 /**
9 * @suppress 14 * @suppress
@@ -30,25 +35,20 @@ constructor( @@ -30,25 +35,20 @@ constructor(
30 } 35 }
31 } 36 }
32 37
33 - fun setRemoteDescription(sd: SessionDescription) {  
34 - peerConnection.setRemoteDescription(object : SdpObserver {  
35 - override fun onCreateSuccess(p0: SessionDescription?) {  
36 - } 38 + suspend fun setRemoteDescription(sd: SessionDescription): Either<Unit, String?> {
37 39
  40 + val observer = object : CoroutineSdpObserver() {
38 override fun onSetSuccess() { 41 override fun onSetSuccess() {
39 pendingCandidates.forEach { pending -> 42 pendingCandidates.forEach { pending ->
40 peerConnection.addIceCandidate(pending) 43 peerConnection.addIceCandidate(pending)
41 } 44 }
42 pendingCandidates.clear() 45 pendingCandidates.clear()
  46 + super.onSetSuccess()
43 } 47 }
44 -  
45 - override fun onCreateFailure(p0: String?) {  
46 - }  
47 -  
48 - override fun onSetFailure(p0: String?) {  
49 - }  
50 -  
51 - }, sd) 48 + }
  49 +
  50 + peerConnection.setRemoteDescription(observer, sd)
  51 + return observer.awaitSet()
52 } 52 }
53 53
54 fun close() { 54 fun close() {
@@ -190,7 +190,7 @@ constructor( @@ -190,7 +190,7 @@ constructor(
190 Timber.v { "received server answer: ${sessionDescription.type}, ${publisher.peerConnection.signalingState()}" } 190 Timber.v { "received server answer: ${sessionDescription.type}, ${publisher.peerConnection.signalingState()}" }
191 coroutineScope.launch { 191 coroutineScope.launch {
192 Timber.i { sessionDescription.toString() } 192 Timber.i { sessionDescription.toString() }
193 - when (val outcome = publisher.peerConnection.setRemoteDescription(sessionDescription)) { 193 + when (val outcome = publisher.setRemoteDescription(sessionDescription)) {
194 is Either.Left -> { 194 is Either.Left -> {
195 if (!rtcConnected) { 195 if (!rtcConnected) {
196 onRTCConnected() 196 onRTCConnected()
@@ -208,7 +208,7 @@ constructor( @@ -208,7 +208,7 @@ constructor(
208 coroutineScope.launch { 208 coroutineScope.launch {
209 run<Unit> { 209 run<Unit> {
210 when (val outcome = 210 when (val outcome =
211 - subscriber.peerConnection.setRemoteDescription(sessionDescription)) { 211 + subscriber.setRemoteDescription(sessionDescription)) {
212 is Either.Right -> { 212 is Either.Right -> {
213 Timber.e { "error setting remote description for answer: ${outcome.value} " } 213 Timber.e { "error setting remote description for answer: ${outcome.value} " }
214 return@launch 214 return@launch
@@ -9,7 +9,7 @@ import kotlin.coroutines.Continuation @@ -9,7 +9,7 @@ import kotlin.coroutines.Continuation
9 import kotlin.coroutines.resume 9 import kotlin.coroutines.resume
10 import kotlin.coroutines.suspendCoroutine 10 import kotlin.coroutines.suspendCoroutine
11 11
12 -class CoroutineSdpObserver : SdpObserver { 12 +open class CoroutineSdpObserver : SdpObserver {
13 private var createOutcome: Either<SessionDescription, String?>? = null 13 private var createOutcome: Either<SessionDescription, String?>? = null
14 set(value) { 14 set(value) {
15 field = value 15 field = value