Require turn server before creating PeerConnection.

This commit is contained in:
onurays 2020-06-04 12:03:35 +03:00 committed by Valere
parent 24cea5110e
commit 4d288ddd55

View File

@ -142,6 +142,8 @@ class WebRtcPeerConnectionManager @Inject constructor(
.setVideoEncoderFactory(defaultVideoEncoderFactory)
.setVideoDecoderFactory(defaultVideoDecoderFactory)
.createPeerConnectionFactory()
attachViewRenderersInternal()
}
private fun createPeerConnection(turnServer: TurnServer?) {
@ -159,23 +161,11 @@ class WebRtcPeerConnectionManager @Inject constructor(
}
}
}
/*
val iceServers = ArrayList<PeerConnection.IceServer>().apply {
listOf("turn:turn.matrix.org:3478?transport=udp", "turn:turn.matrix.org:3478?transport=tcp", "turns:turn.matrix.org:443?transport=tcp").forEach {
add(
PeerConnection.IceServer.builder(it)
.setUsername("xxxxx")
.setPassword("xxxxx")
.createIceServer()
)
}
}
*/
Timber.v("## VOIP creating peer connection... ")
peerConnection = peerConnectionFactory?.createPeerConnection(iceServers, streamObserver)
}
private fun startCall() {
private fun startCall(turnServer: TurnServer?) {
iceCandidateDisposable = iceCandidateSource
.buffer(400, TimeUnit.MILLISECONDS)
.subscribe {
@ -187,12 +177,8 @@ class WebRtcPeerConnectionManager @Inject constructor(
}
executor.execute {
sessionHolder.getActiveSession().callService().getTurnServer(object : MatrixCallback<TurnServer?> {
override fun onSuccess(data: TurnServer?) {
createPeerConnectionFactory()
createPeerConnection(data)
}
})
createPeerConnection(turnServer)
}
}
@ -208,16 +194,25 @@ class WebRtcPeerConnectionManager @Inject constructor(
}
fun attachViewRenderers(localViewRenderer: SurfaceViewRenderer, remoteViewRenderer: SurfaceViewRenderer) {
executor.execute {
this.localViewRenderer = localViewRenderer
this.remoteViewRenderer = remoteViewRenderer
this.localSurfaceRenderer = WeakReference(localViewRenderer)
this.remoteSurfaceRenderer = WeakReference(remoteViewRenderer)
if (peerConnection != null) {
attachViewRenderersInternal()
}
}
}
private fun attachViewRenderersInternal() {
executor.execute {
audioSource = peerConnectionFactory?.createAudioSource(DEFAULT_AUDIO_CONSTRAINTS)
localAudioTrack = peerConnectionFactory?.createAudioTrack(AUDIO_TRACK_ID, audioSource)
localAudioTrack?.setEnabled(true)
localViewRenderer.setMirror(true)
localViewRenderer?.setMirror(true)
localVideoTrack?.addSink(localViewRenderer)
localMediaStream = peerConnectionFactory?.createLocalMediaStream("ARDAMS") // magic value?
@ -255,6 +250,7 @@ class WebRtcPeerConnectionManager @Inject constructor(
Timber.v("## VOIP add local stream to peer connection")
peerConnection?.addStream(localMediaStream)
}
}
fun detachRenderers() {
localSurfaceRenderer?.get()?.let {
@ -314,9 +310,13 @@ class WebRtcPeerConnectionManager @Inject constructor(
startHeadsUpService(createdCall)
context.startActivity(VectorCallActivity.newIntent(context, createdCall))
startCall()
sessionHolder.getActiveSession().callService().getTurnServer(object : MatrixCallback<TurnServer?> {
override fun onSuccess(data: TurnServer?) {
startCall(data)
sendSdpOffer()
}
})
}
override fun onCallInviteReceived(mxCall: MxCall, callInviteContent: CallInviteContent) {
// TODO What if a call is currently active?
@ -328,10 +328,18 @@ class WebRtcPeerConnectionManager @Inject constructor(
currentCall = mxCall
startHeadsUpService(mxCall)
startCall()
sessionHolder.getActiveSession().callService().getTurnServer(object : MatrixCallback<TurnServer?> {
override fun onSuccess(data: TurnServer?) {
startCall(data)
setInviteRemoteDescription(callInviteContent.offer?.sdp)
}
})
}
private fun setInviteRemoteDescription(description: String?) {
executor.execute {
val sdp = SessionDescription(SessionDescription.Type.OFFER, callInviteContent.offer?.sdp)
val sdp = SessionDescription(SessionDescription.Type.OFFER, description)
peerConnection?.setRemoteDescription(sdpObserver, sdp)
}
}