From a35559be65c0852225bab1c18d331dd4d1edd5da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 7 May 2021 21:33:05 +0200 Subject: [PATCH] Add a method to start screensharing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/webrtc/call.ts | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index a1dec5762..d8dd8aabf 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -815,6 +815,65 @@ export class MatrixCall extends EventEmitter { return Boolean(this.screenSharingStream); } + /** + * Starts/stops screensharing + * @param enabled the desired screensharing state + * @param selectDesktopCapturerSource callBack to select a screensharing stream on desktop + * @returns {boolean} new screensharing state + */ + public async setScreensharingEnabled( + enabled: boolean, + selectDesktopCapturerSource?: () => Promise, + ) { + if (!this.opponentSupportsSDPStreamMetadata) { + logger.warn("The other side doesn't support multiple stream, therefore we can't screenshare"); + // TODO: Use replaceTrack() + return false; + } + + logger.debug(`Set screensharing enabled? ${enabled}`); + if (enabled) { + if (this.isScreensharing()) { + logger.warn(`There is already a screensharing stream - there is nothing to do!`); + return false; + } + + try { + const screenshareConstraints = await getScreenshareContraints(selectDesktopCapturerSource); + if (!screenshareConstraints) { + logger.error("Failed to get screensharing constraints!"); + return; + } + + if (window.electron?.getDesktopCapturerSources) { + // We are using Electron + logger.debug("Getting screen stream using getUserMedia()..."); + this.screenSharingStream = await navigator.mediaDevices.getUserMedia(screenshareConstraints); + } else { + // We are not using Electron + logger.debug("Getting screen stream using getDisplayMedia()..."); + this.screenSharingStream = await navigator.mediaDevices.getDisplayMedia(screenshareConstraints); + } + + this.pushLocalFeed(this.screenSharingStream, SDPStreamMetadataPurpose.Screenshare); + return true; + } catch (err) { + this.emit(CallEvent.Error, + new CallError(CallErrorCode.NoUserMedia, "Failed to get screen-sharing stream: ", err), + ); + return false; + } + } else { + if (!this.isScreensharing()) { + logger.warn(`There already isn't a screensharing stream - there is nothing to do!`); + return false; + } + this.deleteLocalFeedByStream(this.screenSharingStream); + this.screenSharingStream = null; + return false; + } + } + /** * Set whether our outbound video should be muted or not. * @param {boolean} muted True to mute the outbound video.