startScreenShare method
Implementation
@override
Future<void> startScreenShare({DesktopCapturerSource? source}) async {
try {
if (_mParticipant == null || _mParticipant!.isSharingScreen) return;
if (WebRTC.platformIsAndroid) {
await _nativeService.startForegroundService();
}
_screenSharingStream = await _getDisplayMedia(source);
if (_screenSharingStream?.getVideoTracks().isEmpty ?? true) return;
if (WebRTC.platformIsMobile && _mParticipant!.isVideoEnabled) {
await toggleVideoInput(forceValue: false);
}
final screenTrack = _screenSharingStream!.getVideoTracks().first;
final sender = await _mParticipant!.peerConnection.addSimulcastTrack(
screenTrack,
vCodec: _currentCallSetting.videoConfig.preferedCodec,
stream: _screenSharingStream!,
isSingleTrack: _connectionType == ConnectionType.p2p,
);
await Future.wait([
_e2eeManager.addRtpSender(sender: sender),
_performRenegotiation(),
]);
_videoStats.addSenders(
ownerId: '$kIsMine-${TrackType.screen.toString()}',
senders: [sender],
callback: (stats) => _mParticipant?.sinkScreenStats(stats),
);
_mParticipant?.setSrcObject(_screenSharingStream!, isDisplayStream: true);
_wsEmitter.toggleScreenSharing(true, screenTrackId: screenTrack.id);
screenTrack.onEnded = () => scheduleMicrotask(stopScreenShare);
_mParticipant = await _mParticipant?.setScreenSharing(true);
_notify(CallbackEvents.shouldBeUpdateState);
} catch (e) {
stopScreenShare();
}
}