feat(screenSharing): Add support for audio screen sharing on electron
This commit is contained in:
parent
08be68cda4
commit
9d6a93119b
|
@ -244,6 +244,7 @@
|
||||||
"reservationError": "Reservation system error",
|
"reservationError": "Reservation system error",
|
||||||
"reservationErrorMsg": "Error code: {{code}}, message: {{msg}}",
|
"reservationErrorMsg": "Error code: {{code}}, message: {{msg}}",
|
||||||
"retry": "Retry",
|
"retry": "Retry",
|
||||||
|
"screenSharingAudio": "Share audio",
|
||||||
"screenSharingFailedToInstall": "Oops! Your screen sharing extension failed to install.",
|
"screenSharingFailedToInstall": "Oops! Your screen sharing extension failed to install.",
|
||||||
"screenSharingFailedToInstallTitle": "Screen sharing extension failed to install",
|
"screenSharingFailedToInstallTitle": "Screen sharing extension failed to install",
|
||||||
"screenSharingFirefoxPermissionDeniedError": "Something went wrong while we were trying to share your screen. Please make sure that you have given us permission to do so. ",
|
"screenSharingFirefoxPermissionDeniedError": "Something went wrong while we were trying to share your screen. Please make sure that you have given us permission to do so. ",
|
||||||
|
|
|
@ -10883,8 +10883,8 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lib-jitsi-meet": {
|
"lib-jitsi-meet": {
|
||||||
"version": "github:jitsi/lib-jitsi-meet#4a2abb179672aebecf9d780f796fcca531bb2398",
|
"version": "github:jitsi/lib-jitsi-meet#960eea3c5087ce07e9135fad70268c7d338e0de5",
|
||||||
"from": "github:jitsi/lib-jitsi-meet#4a2abb179672aebecf9d780f796fcca531bb2398",
|
"from": "github:jitsi/lib-jitsi-meet#960eea3c5087ce07e9135fad70268c7d338e0de5",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@jitsi/sdp-interop": "0.1.14",
|
"@jitsi/sdp-interop": "0.1.14",
|
||||||
"@jitsi/sdp-simulcast": "0.2.2",
|
"@jitsi/sdp-simulcast": "0.2.2",
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
"js-utils": "github:jitsi/js-utils#0b2cef90613a74777fefd98d4ee3eda3879809ab",
|
"js-utils": "github:jitsi/js-utils#0b2cef90613a74777fefd98d4ee3eda3879809ab",
|
||||||
"jsrsasign": "8.0.12",
|
"jsrsasign": "8.0.12",
|
||||||
"jwt-decode": "2.2.0",
|
"jwt-decode": "2.2.0",
|
||||||
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#4a2abb179672aebecf9d780f796fcca531bb2398",
|
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#960eea3c5087ce07e9135fad70268c7d338e0de5",
|
||||||
"libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
|
"libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
|
||||||
"lodash": "4.17.13",
|
"lodash": "4.17.13",
|
||||||
"moment": "2.19.4",
|
"moment": "2.19.4",
|
||||||
|
|
|
@ -74,6 +74,11 @@ type Props = {
|
||||||
*/
|
*/
|
||||||
type State = {
|
type State = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The state of the audio screen share checkbox.
|
||||||
|
*/
|
||||||
|
screenShareAudio: boolean,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The currently higlighted DesktopCapturerSource.
|
* The currently higlighted DesktopCapturerSource.
|
||||||
*/
|
*/
|
||||||
|
@ -128,6 +133,7 @@ class DesktopPicker extends PureComponent<Props, State> {
|
||||||
_poller = null;
|
_poller = null;
|
||||||
|
|
||||||
state = {
|
state = {
|
||||||
|
screenShareAudio: false,
|
||||||
selectedSource: {},
|
selectedSource: {},
|
||||||
selectedTab: 0,
|
selectedTab: 0,
|
||||||
sources: {},
|
sources: {},
|
||||||
|
@ -153,6 +159,7 @@ class DesktopPicker extends PureComponent<Props, State> {
|
||||||
// Bind event handlers so they are only bound once per instance.
|
// Bind event handlers so they are only bound once per instance.
|
||||||
this._onCloseModal = this._onCloseModal.bind(this);
|
this._onCloseModal = this._onCloseModal.bind(this);
|
||||||
this._onPreviewClick = this._onPreviewClick.bind(this);
|
this._onPreviewClick = this._onPreviewClick.bind(this);
|
||||||
|
this._onShareAudioChecked = this._onShareAudioChecked.bind(this);
|
||||||
this._onSubmit = this._onSubmit.bind(this);
|
this._onSubmit = this._onSubmit.bind(this);
|
||||||
this._onTabSelected = this._onTabSelected.bind(this);
|
this._onTabSelected = this._onTabSelected.bind(this);
|
||||||
this._updateSources = this._updateSources.bind(this);
|
this._updateSources = this._updateSources.bind(this);
|
||||||
|
@ -241,7 +248,7 @@ class DesktopPicker extends PureComponent<Props, State> {
|
||||||
return selectedSource;
|
return selectedSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onCloseModal: (?string, string) => void;
|
_onCloseModal: (?string, string, ?boolean) => void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dispatches an action to hide the DesktopPicker and invokes the passed in
|
* Dispatches an action to hide the DesktopPicker and invokes the passed in
|
||||||
|
@ -251,10 +258,12 @@ class DesktopPicker extends PureComponent<Props, State> {
|
||||||
* the onSourceChoose callback.
|
* the onSourceChoose callback.
|
||||||
* @param {string} type - The type of the DesktopCapturerSource to pass into
|
* @param {string} type - The type of the DesktopCapturerSource to pass into
|
||||||
* the onSourceChoose callback.
|
* the onSourceChoose callback.
|
||||||
|
* @param {boolean} screenShareAudio - Whether or not to add system audio to
|
||||||
|
* screen sharing session.
|
||||||
* @returns {void}
|
* @returns {void}
|
||||||
*/
|
*/
|
||||||
_onCloseModal(id = '', type) {
|
_onCloseModal(id = '', type, screenShareAudio = false) {
|
||||||
this.props.onSourceChoose(id, type);
|
this.props.onSourceChoose(id, type, screenShareAudio);
|
||||||
this.props.dispatch(hideDialog());
|
this.props.dispatch(hideDialog());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -285,9 +294,9 @@ class DesktopPicker extends PureComponent<Props, State> {
|
||||||
* @returns {void}
|
* @returns {void}
|
||||||
*/
|
*/
|
||||||
_onSubmit() {
|
_onSubmit() {
|
||||||
const { id, type } = this.state.selectedSource;
|
const { selectedSource: { id, type }, screenShareAudio } = this.state;
|
||||||
|
|
||||||
this._onCloseModal(id, type);
|
this._onCloseModal(id, type, screenShareAudio);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onTabSelected: () => void;
|
_onTabSelected: () => void;
|
||||||
|
@ -306,12 +315,29 @@ class DesktopPicker extends PureComponent<Props, State> {
|
||||||
const { types, sources } = this.state;
|
const { types, sources } = this.state;
|
||||||
|
|
||||||
this._selectedTabType = types[tabIndex];
|
this._selectedTabType = types[tabIndex];
|
||||||
|
|
||||||
|
// When we change tabs also reset the screenShareAudio state so we don't
|
||||||
|
// use the option from one tab when sharing from another.
|
||||||
this.setState({
|
this.setState({
|
||||||
|
screenShareAudio: false,
|
||||||
selectedSource: this._getSelectedSource(sources),
|
selectedSource: this._getSelectedSource(sources),
|
||||||
selectedTab: tabIndex
|
selectedTab: tabIndex
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_onShareAudioChecked: (boolean) => void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the screenSharingAudio state indicating whether or not to also share
|
||||||
|
* system audio.
|
||||||
|
*
|
||||||
|
* @param {boolean} checked - Share audio or not.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
_onShareAudioChecked(checked) {
|
||||||
|
this.setState({ screenShareAudio: checked });
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures and renders the tabs for display.
|
* Configures and renders the tabs for display.
|
||||||
*
|
*
|
||||||
|
@ -328,7 +354,8 @@ class DesktopPicker extends PureComponent<Props, State> {
|
||||||
content: <DesktopPickerPane
|
content: <DesktopPickerPane
|
||||||
key = { type }
|
key = { type }
|
||||||
onClick = { this._onPreviewClick }
|
onClick = { this._onPreviewClick }
|
||||||
onDoubleClick = { this._onCloseModal }
|
onDoubleClick = { this._onSubmit }
|
||||||
|
onShareAudioChecked = { this._onShareAudioChecked }
|
||||||
selectedSourceId = { selectedSource.id }
|
selectedSourceId = { selectedSource.id }
|
||||||
sources = { sources[type] }
|
sources = { sources[type] }
|
||||||
type = { type } />,
|
type = { type } />,
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
/* @flow */
|
/* @flow */
|
||||||
|
|
||||||
|
import { Checkbox } from '@atlaskit/checkbox';
|
||||||
import Spinner from '@atlaskit/spinner';
|
import Spinner from '@atlaskit/spinner';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import { Platform } from '../../base/react';
|
||||||
|
import { translate } from '../../base/i18n';
|
||||||
|
|
||||||
import DesktopSourcePreview from './DesktopSourcePreview';
|
import DesktopSourcePreview from './DesktopSourcePreview';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -20,6 +24,11 @@ type Props = {
|
||||||
*/
|
*/
|
||||||
onDoubleClick: Function,
|
onDoubleClick: Function,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The handler to be invoked if the users checks the audio screen sharing checkbox.
|
||||||
|
*/
|
||||||
|
onShareAudioChecked: Function,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The id of the DesktopCapturerSource that is currently selected.
|
* The id of the DesktopCapturerSource that is currently selected.
|
||||||
*/
|
*/
|
||||||
|
@ -33,7 +42,12 @@ type Props = {
|
||||||
/**
|
/**
|
||||||
* The source type of the DesktopCapturerSources to display.
|
* The source type of the DesktopCapturerSources to display.
|
||||||
*/
|
*/
|
||||||
type: string
|
type: string,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to obtain translations.
|
||||||
|
*/
|
||||||
|
t: Function
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -42,6 +56,31 @@ type Props = {
|
||||||
* @extends Component
|
* @extends Component
|
||||||
*/
|
*/
|
||||||
class DesktopPickerPane extends Component<Props> {
|
class DesktopPickerPane extends Component<Props> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes a new DesktopPickerPane instance.
|
||||||
|
*
|
||||||
|
* @param {Object} props - The read-only properties with which the new
|
||||||
|
* instance is to be initialized.
|
||||||
|
*/
|
||||||
|
constructor(props: Props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this._onShareAudioCheck = this._onShareAudioCheck.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
_onShareAudioCheck: (Object) => void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to be called when the Checkbox is used.
|
||||||
|
*
|
||||||
|
* @param {boolean} checked - Checkbox status (checked or not).
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
_onShareAudioCheck({ target: { checked } }) {
|
||||||
|
this.props.onShareAudioChecked(checked);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements React's {@link Component#render()}.
|
* Implements React's {@link Component#render()}.
|
||||||
*
|
*
|
||||||
|
@ -54,7 +93,8 @@ class DesktopPickerPane extends Component<Props> {
|
||||||
onDoubleClick,
|
onDoubleClick,
|
||||||
selectedSourceId,
|
selectedSourceId,
|
||||||
sources,
|
sources,
|
||||||
type
|
type,
|
||||||
|
t
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
const classNames
|
const classNames
|
||||||
|
@ -77,12 +117,25 @@ class DesktopPickerPane extends Component<Props> {
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let checkBox;
|
||||||
|
|
||||||
|
// Only display the share audio checkbox if we're on windows and on
|
||||||
|
// desktop sharing tab.
|
||||||
|
// App window and Mac OS screen sharing doesn't work with system audio.
|
||||||
|
if (type === 'screen' && Platform.OS === 'windows') {
|
||||||
|
checkBox = (<Checkbox
|
||||||
|
label = { t('dialog.screenSharingAudio') }
|
||||||
|
name = 'share-system-audio'
|
||||||
|
onChange = { this._onShareAudioCheck } />);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className = { classNames }>
|
<div className = { classNames }>
|
||||||
{ previews }
|
{ previews }
|
||||||
|
{ checkBox }
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default DesktopPickerPane;
|
export default translate(DesktopPickerPane);
|
||||||
|
|
Loading…
Reference in New Issue