From 0bb75cb990f0cbe3a0dfb71ae585ec1722f509af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 16 Jul 2022 09:06:06 +0200 Subject: [PATCH 1/2] Add support for audio sharing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/webrtc/call.ts | 11 ++++++----- src/webrtc/groupCall.ts | 8 ++++---- src/webrtc/mediaHandler.ts | 24 +++++++++++++++--------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index ad97246c8ba..47fd209c876 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -51,6 +51,7 @@ import { ISendEventResponse } from "../@types/requests"; import { EventEmitterEvents, TypedEventEmitter } from "../models/typed-event-emitter"; import { DeviceInfo } from '../crypto/deviceinfo'; import { GroupCallUnknownDeviceError } from './groupCall'; +import { IScreensharingOpts } from "./mediaHandler"; // events: hangup, error(err), replaced(call), state(state, oldState) @@ -1100,7 +1101,7 @@ export class MatrixCall extends TypedEventEmitter { + public async setScreensharingEnabled(enabled: boolean, opts?: IScreensharingOpts): Promise { // Skip if there is nothing to do if (enabled && this.isScreensharing()) { logger.warn(`Call ${this.callId} There is already a screensharing stream - there is nothing to do!`); @@ -1112,13 +1113,13 @@ export class MatrixCall extends TypedEventEmitter { logger.debug(`Call ${this.callId} Set screensharing enabled? ${enabled} using replaceTrack()`); if (enabled) { try { - const stream = await this.client.getMediaHandler().getScreensharingStream(desktopCapturerSourceId); + const stream = await this.client.getMediaHandler().getScreensharingStream(opts); if (!stream) return false; const track = stream.getTracks().find((track) => { diff --git a/src/webrtc/groupCall.ts b/src/webrtc/groupCall.ts index a494447a0fc..fcc175be629 100644 --- a/src/webrtc/groupCall.ts +++ b/src/webrtc/groupCall.ts @@ -13,6 +13,7 @@ import { MatrixEvent } from "../models/event"; import { EventType } from "../@types/event"; import { CallEventHandlerEvent } from "./callEventHandler"; import { GroupCallEventHandlerEvent } from "./groupCallEventHandler"; +import { IScreensharingOpts } from "./mediaHandler"; export enum GroupCallIntent { Ring = "m.ring", @@ -527,7 +528,7 @@ export class GroupCall extends TypedEventEmitter { if (enabled === this.isScreensharing()) { return enabled; @@ -536,8 +537,7 @@ export class GroupCall extends TypedEventEmitter { @@ -550,7 +550,7 @@ export class GroupCall extends TypedEventEmitter void; }; +export interface IScreensharingOpts { + desktopCapturerSourceId?: string; + audio?: boolean; +} + export class MediaHandler extends TypedEventEmitter< MediaHandlerEvent.LocalStreamsChanged, MediaHandlerEventHandlerMap > { @@ -254,20 +259,20 @@ export class MediaHandler extends TypedEventEmitter< * @param reusable is allowed to be reused by the MediaHandler * @returns {MediaStream} based on passed parameters */ - public async getScreensharingStream(desktopCapturerSourceId: string, reusable = true): Promise { + public async getScreensharingStream(opts: IScreensharingOpts = {}, reusable = true): Promise { let stream: MediaStream; if (this.screensharingStreams.length === 0) { - const screenshareConstraints = this.getScreenshareContraints(desktopCapturerSourceId); + const screenshareConstraints = this.getScreenshareContraints(opts); if (!screenshareConstraints) return null; - if (desktopCapturerSourceId) { + if (opts.desktopCapturerSourceId) { // We are using Electron - logger.debug("Getting screensharing stream using getUserMedia()", desktopCapturerSourceId); + logger.debug("Getting screensharing stream using getUserMedia()", opts); stream = await navigator.mediaDevices.getUserMedia(screenshareConstraints); } else { // We are not using Electron - logger.debug("Getting screensharing stream using getDisplayMedia()"); + logger.debug("Getting screensharing stream using getDisplayMedia()", opts); stream = await navigator.mediaDevices.getDisplayMedia(screenshareConstraints); } } else { @@ -352,11 +357,12 @@ export class MediaHandler extends TypedEventEmitter< }; } - private getScreenshareContraints(desktopCapturerSourceId?: string): DesktopCapturerConstraints { - if (desktopCapturerSourceId) { + private getScreenshareContraints(opts: IScreensharingOpts): DesktopCapturerConstraints { + const { desktopCapturerSourceId, audio } = opts; + if (opts.desktopCapturerSourceId) { logger.debug("Using desktop capturer source", desktopCapturerSourceId); return { - audio: false, + audio, video: { mandatory: { chromeMediaSource: "desktop", @@ -367,7 +373,7 @@ export class MediaHandler extends TypedEventEmitter< } else { logger.debug("Not using desktop capturer source"); return { - audio: false, + audio, video: true, }; } From 5e5a1ac6b6bf8fb482fe9d6746d9644f04834bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 16 Jul 2022 17:51:31 +0200 Subject: [PATCH 2/2] Simplify code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/webrtc/mediaHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webrtc/mediaHandler.ts b/src/webrtc/mediaHandler.ts index 88a153baf41..1b55cfbb908 100644 --- a/src/webrtc/mediaHandler.ts +++ b/src/webrtc/mediaHandler.ts @@ -359,7 +359,7 @@ export class MediaHandler extends TypedEventEmitter< private getScreenshareContraints(opts: IScreensharingOpts): DesktopCapturerConstraints { const { desktopCapturerSourceId, audio } = opts; - if (opts.desktopCapturerSourceId) { + if (desktopCapturerSourceId) { logger.debug("Using desktop capturer source", desktopCapturerSourceId); return { audio,