From 38c7109aeee5e6b6202419398c6511f7a0893566 Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Mon, 17 Jan 2022 21:16:36 +0800 Subject: [PATCH] fix: fix call breaks issue caused by aborting screen sharing. --- lib/src/voip.dart | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/lib/src/voip.dart b/lib/src/voip.dart index 217984c0..50174f9b 100644 --- a/lib/src/voip.dart +++ b/lib/src/voip.dart @@ -361,15 +361,19 @@ class CallSession { await _preparePeerConnection(); setCallState(CallState.kCreateOffer); final stream = await _getUserMedia(type); - _addLocalStream(stream, SDPStreamMetadataPurpose.Usermedia); + if (stream != null) { + _addLocalStream(stream, SDPStreamMetadataPurpose.Usermedia); + } } Future initWithInvite(CallType type, RTCSessionDescription offer, SDPStreamMetadata? metadata, int lifetime) async { await _preparePeerConnection(); - _addLocalStream( - await _getUserMedia(type), SDPStreamMetadataPurpose.Usermedia); + final stream = await _getUserMedia(type); + if (stream != null) { + _addLocalStream(stream, SDPStreamMetadataPurpose.Usermedia); + } if (metadata != null) { _updateRemoteSDPStreamMetadata(metadata); @@ -530,7 +534,7 @@ class CallSession { if (enabled) { try { - final MediaStream? stream = await _getDisplayMedia(); + final stream = await _getDisplayMedia(); if (stream == null) { return false; } @@ -972,7 +976,7 @@ class CallSession { localCandidates.clear(); } - Future _getUserMedia(CallType type) async { + Future _getUserMedia(CallType type) async { final mediaConstraints = { 'audio': true, 'video': type == CallType.kVideo @@ -992,10 +996,10 @@ class CallSession { } catch (e) { _getUserMediaFailed(e); } - return Null as MediaStream; + return null; } - Future _getDisplayMedia() async { + Future _getDisplayMedia() async { final mediaConstraints = { 'audio': false, 'video': true, @@ -1005,7 +1009,7 @@ class CallSession { } catch (e) { _getUserMediaFailed(e); } - return Null as MediaStream; + return null; } Future _createPeerConnection() async { @@ -1110,13 +1114,15 @@ class CallSession { } void _getUserMediaFailed(dynamic err) { - Logs().w('Failed to get user media - ending call ${err.toString()}'); - fireCallEvent(CallEvent.kError); - lastError = CallError( - CallErrorCode.NoUserMedia, - 'Couldn\'t start capturing media! Is your microphone set up and does this app have permission?', - err); - terminate(CallParty.kLocal, CallErrorCode.NoUserMedia, false); + if (state != CallState.kConnected) { + Logs().w('Failed to get user media - ending call ${err.toString()}'); + fireCallEvent(CallEvent.kError); + lastError = CallError( + CallErrorCode.NoUserMedia, + 'Couldn\'t start capturing media! Is your microphone set up and does this app have permission?', + err); + terminate(CallParty.kLocal, CallErrorCode.NoUserMedia, false); + } } void onSelectAnswerReceived(String? selectedPartyId) {