setScreensharingEnabled method
Future<void>
setScreensharingEnabled(
- GroupCallSession groupCall,
- bool enabled,
- String desktopCapturerSourceId
override
Implementation
@override
Future<void> setScreensharingEnabled(
GroupCallSession groupCall,
bool enabled,
String desktopCapturerSourceId,
) async {
if (enabled == (localScreenshareStream != null)) {
return;
}
if (enabled) {
try {
Logs().v('Asking for screensharing permissions...');
final stream = await _getDisplayMedia(groupCall);
for (final track in stream.getTracks()) {
// screen sharing should only have 1 video track anyway, so this only
// fires once
track.onEnded = () async {
await setScreensharingEnabled(groupCall, false, '');
};
}
Logs().v(
'Screensharing permissions granted. Setting screensharing enabled on all calls');
_localScreenshareStream = WrappedMediaStream(
stream: stream,
participant: groupCall.localParticipant!,
room: groupCall.room,
client: groupCall.client,
purpose: SDPStreamMetadataPurpose.Screenshare,
audioMuted: stream.getAudioTracks().isEmpty,
videoMuted: stream.getVideoTracks().isEmpty,
isGroupCall: true,
voip: groupCall.voip,
);
_addScreenshareStream(groupCall, localScreenshareStream!);
groupCall.onGroupCallEvent
.add(GroupCallStateChange.localScreenshareStateChanged);
for (final call in _callSessions) {
await call.addLocalStream(
await localScreenshareStream!.stream!.clone(),
localScreenshareStream!.purpose);
}
await groupCall.sendMemberStateEvent();
return;
} catch (e, s) {
Logs().e('[VOIP] Enabling screensharing error', e, s);
groupCall.onGroupCallEvent.add(GroupCallStateChange.error);
return;
}
} else {
for (final call in _callSessions) {
await call.removeLocalStream(call.localScreenSharingStream!);
}
await stopMediaStream(localScreenshareStream?.stream);
await _removeScreenshareStream(groupCall, localScreenshareStream!);
_localScreenshareStream = null;
await groupCall.sendMemberStateEvent();
groupCall.onGroupCallEvent
.add(GroupCallStateChange.localMuteStateChanged);
return;
}
}