diff --git a/conference.js b/conference.js index ac382127a..403b90baf 100644 --- a/conference.js +++ b/conference.js @@ -493,6 +493,10 @@ export default { * on. * @param {boolean} options.startScreenSharing=false - if true * should start with screensharing instead of camera video. + * @param {boolean} options.startWithAudioMuted - will start the conference + * without any audio tracks. + * @param {boolean} options.startWithVideoMuted - will start the conference + * without any video tracks. * @returns {Promise.} */ createInitialLocalTracksAndConnect(roomName, options = {}) { @@ -500,6 +504,20 @@ export default { audioOnlyError, screenSharingError, videoOnlyError; + const initialDevices = []; + let requestedAudio = false; + let requestedVideo = false; + + if (!options.startWithAudioMuted) { + initialDevices.push('audio'); + requestedAudio = true; + } + if (!options.startWithVideoMuted + && !options.startAudioOnly + && !options.startScreenSharing) { + initialDevices.push('video'); + requestedVideo = true; + } JitsiMeetJS.mediaDevices.addEventListener( JitsiMeetJS.events.mediaDevices.PERMISSION_PROMPT_IS_SHOWN, @@ -508,26 +526,21 @@ export default { mediaPermissionPromptVisibilityChanged(true, browser)) ); - // First try to retrieve both audio and video. let tryCreateLocalTracks; - // FIXME the logic about trying to go audio only on error is duplicated - if (options.startAudioOnly) { - tryCreateLocalTracks - = createLocalTracks({ devices: ['audio'] }, true) - .catch(err => { - audioOnlyError = err; + // Enable audio only mode + if (config.startAudioOnly) { + APP.store.dispatch(toggleAudioOnly()); + } - return []; - }); - - // Enable audio only mode - if (config.startAudioOnly) { - APP.store.dispatch(toggleAudioOnly()); - } - } else if (options.startScreenSharing) { + // FIXME is there any simpler way to rewrite this spaghetti below ? + if (options.startScreenSharing) { tryCreateLocalTracks = this._createDesktopTrack() .then(desktopStream => { + if (!requestedAudio) { + return [desktopStream]; + } + return createLocalTracks({ devices: ['audio'] }, true) .then(([audioStream]) => { return [desktopStream, audioStream]; @@ -539,26 +552,53 @@ export default { }).catch(error => { logger.error('Failed to obtain desktop stream', error); screenSharingError = error; - return createLocalTracks({ devices: ['audio'] }, true); + return requestedAudio + ? createLocalTracks({ devices: ['audio'] }, true) + : []; }).catch(error => { audioOnlyError = error; return []; }); + } else if (!requestedAudio && !requestedVideo) { + // Resolve with no tracks + tryCreateLocalTracks = Promise.resolve([]); } else { tryCreateLocalTracks = createLocalTracks( - {devices: ['audio', 'video']}, true) - .catch(err => { - // If failed then try to retrieve only audio. - audioAndVideoError = err; - return createLocalTracks({devices: ['audio']}, true); - }) + { devices: initialDevices }, true) .catch(err => { + if (requestedAudio && requestedVideo) { + + // Try audio only... + audioAndVideoError = err; + + return createLocalTracks({devices: ['audio']}, true); + } else if (requestedAudio && !requestedVideo) { + audioOnlyError = err; + + return []; + } else if (requestedVideo && !requestedAudio) { + videoOnlyError = err; + + return []; + } + logger.error('Should never happen'); + }).catch(err => { + // Log this just in case... + if (!requestedAudio) { + logger.error('The impossible just happened', err); + } audioOnlyError = err; // Try video only... - return createLocalTracks({devices: ['video']}, true); + return requestedVideo + ? createLocalTracks({devices: ['video']}, true) + : []; }) .catch(err => { + // Log this just in case... + if (!requestedVideo) { + logger.error('The impossible just happened', err); + } videoOnlyError = err; return []; @@ -634,7 +674,9 @@ export default { return this.createInitialLocalTracksAndConnect( options.roomName, { startAudioOnly: config.startAudioOnly, - startScreenSharing: config.startScreenSharing + startScreenSharing: config.startScreenSharing, + startWithAudioMuted: config.startWithAudioMuted, + startWithVideoMuted: config.startWithVideoMuted, }); }).then(([tracks, con]) => { tracks.forEach(track => { diff --git a/config.js b/config.js index 644ab18cc..67fe7d84e 100644 --- a/config.js +++ b/config.js @@ -80,6 +80,8 @@ var config = { // eslint-disable-line no-unused-vars startScreenSharing: false, // Will try to start with screensharing instead of camera // startAudioMuted: 10, // every participant after the Nth will start audio muted // startVideoMuted: 10, // every participant after the Nth will start video muted + startWithAudioMuted: false, // will start with the microphone muted + startWithVideoMuted: false, // will start with the camera turned off // defaultLanguage: "en", // To enable sending statistics to callstats.io you should provide Applicaiton ID and Secret. // callStatsID: "", // Application ID for callstats.io API