Require turn server before creating PeerConnection.
This commit is contained in:
parent
24cea5110e
commit
4d288ddd55
@ -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)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user