diff --git a/lib/pages/videocall-webrtc-rnd/webrtc/signaling.dart b/lib/pages/videocall-webrtc-rnd/webrtc/signaling.dart index d9d2c658..0f26f39d 100644 --- a/lib/pages/videocall-webrtc-rnd/webrtc/signaling.dart +++ b/lib/pages/videocall-webrtc-rnd/webrtc/signaling.dart @@ -251,19 +251,20 @@ class Signaling { Future connect() async { if(connectToSignalR){ - final hub = "https://VCallApi.hmg.com/WebRTCHub?source=web&username=s1"; + final hub = "https://VCallApi.hmg.com/WebRTCHub?source=web&username=zik"; signalrUtil = SignalRUtil(hubName: hub); signalrUtil.setContributors(caller: "zik", receiver: "s1"); final connected = await signalrUtil.openConnection(); if(connected){ + signalrUtil.callUser("zik", "s1"); signalrUtil.listen( onIncomingCall: (user) async{ await Future.delayed(Duration(seconds: 1)); - signalrUtil.acceptCall("s1", "zik"); + signalrUtil.acceptCall("zik", "s1"); }, onAcceptCall: (user){ - print(user.toString()); + _initPeerConnection(session, media: "video", screenSharing: false); }, onDeclineCall: (str, user){ print(str); @@ -300,6 +301,17 @@ class Signaling { await session.pc?.setRemoteDescription(RTCSessionDescription(offerSdp['sdp'], offerSdp['type'])); await _createAnswer(session, "video"); + if (session.remoteCandidates.isNotEmpty) { + session.remoteCandidates.forEach((candidate) async { + await session.pc?.addCandidate(candidate); + }); + session.remoteCandidates.clear(); + } + onCallStateChange?.call(session, CallState.Calling); + }, + onAnswer: (answer_str) async{ + final answer = jsonDecode(answer_str); + await session.pc?.setRemoteDescription(RTCSessionDescription(answer['sdp'], answer['type'])); if (session.remoteCandidates.isNotEmpty) { session.remoteCandidates.forEach((candidate) async { await session.pc?.addCandidate(candidate); @@ -390,6 +402,7 @@ class Signaling { ..._iceServers, ...{'sdpSemantics': sdpSemantics} }, _config); + if (media != 'data') { switch (sdpSemantics) { case 'plan-b': @@ -456,6 +469,11 @@ class Signaling { sender.setParameters(parameters); */ } + + pc.onRenegotiationNeeded = (){ + offer("video", false); + }; + pc.onIceCandidate = (candidate) async { if (candidate == null) { print('onIceCandidate: complete!'); @@ -526,9 +544,16 @@ class Signaling { Future _createOffer(SessionOneToOne session, String media) async { try { + RTCSessionDescription s = - await session.pc .createOffer(media == 'data' ? _dcConstraints : {}); + await session.pc.createOffer(media == 'data' ? _dcConstraints : {}); await session.pc .setLocalDescription(s); + + if(connectToSignalR){ + final offer = jsonEncode(s.toMap()); + signalrUtil.offer(signalrUtil.sourceUser, signalrUtil.destinationUser, offer); + return; + } _send('offer', { 'to': session.remote_user?.id, 'from': session.local_user.id, diff --git a/lib/uitl/SignalRUtil.dart b/lib/uitl/SignalRUtil.dart index 2d4444a0..7b0504e4 100644 --- a/lib/uitl/SignalRUtil.dart +++ b/lib/uitl/SignalRUtil.dart @@ -62,7 +62,7 @@ class SignalRUtil { await connectionHub.invoke('SendMessage', args: args); //['Bob', 'Says hi!'] } - listen({Function(CallUser) onAcceptCall, Function(CallUser) onHangupCall, Function(String, CallUser) onDeclineCall, Function(CallUser) onIncomingCall, Function(String, CallUser) onOffer, Function(String) onCandidate}){ + listen({Function(CallUser) onAcceptCall, Function(CallUser) onHangupCall, Function(String, CallUser) onDeclineCall, Function(CallUser) onIncomingCall, Function(String, CallUser) onOffer, Function(String) onAnswer, Function(String) onCandidate}){ connectionHub.on('OnIncomingCallAsync', (arguments) { print('OnIncomingCallAsync: ${arguments.toString()}'); @@ -93,6 +93,11 @@ class SignalRUtil { onOffer(arguments.first, CallUser.from(arguments.last)); }); + connectionHub.on('OnAnswerOffer', (arguments) { + print('OnAnswerOffer: ${arguments.toString()}'); + onAnswer(arguments.first); + }); + } // CallUserAsync(string currentUserId, string targerUserId)