startScreenShare method

  1. @override
Future<void> startScreenShare({
  1. DesktopCapturerSource? source,
})
override

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();
  }
}