|
|
|
@ -28,7 +28,7 @@ export function getDeviceSelectionDialogProps(stateful: Object | Function) { |
|
|
|
|
const settings = state['features/base/settings']; |
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
availableDevices: state['features/base/devices'].devices, |
|
|
|
|
availableDevices: state['features/base/devices'].availableDevices, |
|
|
|
|
disableAudioInputChange: |
|
|
|
|
!JitsiMeetJS.isMultipleAudioInputSupported(), |
|
|
|
|
disableDeviceChange: |
|
|
|
@ -52,133 +52,132 @@ export function getDeviceSelectionDialogProps(stateful: Object | Function) { |
|
|
|
|
* @param {Object} request - The request to be processed. |
|
|
|
|
* @param {Function} responseCallback - The callback that will send the |
|
|
|
|
* response. |
|
|
|
|
* @returns {boolean} |
|
|
|
|
* @returns {boolean} - True if the request has been processed and false otherwise. |
|
|
|
|
*/ |
|
|
|
|
export function processRequest( // eslint-disable-line max-params
|
|
|
|
|
export function processExternalDeviceRequest( // eslint-disable-line max-params
|
|
|
|
|
dispatch: Dispatch<any>, |
|
|
|
|
getState: Function, |
|
|
|
|
request: Object, |
|
|
|
|
responseCallback: Function) { |
|
|
|
|
if (request.type === 'devices') { |
|
|
|
|
const state = getState(); |
|
|
|
|
const settings = state['features/base/settings']; |
|
|
|
|
const { conference } = state['features/base/conference']; |
|
|
|
|
let result = true; |
|
|
|
|
|
|
|
|
|
switch (request.name) { |
|
|
|
|
case 'isDeviceListAvailable': |
|
|
|
|
responseCallback(JitsiMeetJS.mediaDevices.isDeviceListAvailable()); |
|
|
|
|
break; |
|
|
|
|
case 'isDeviceChangeAvailable': |
|
|
|
|
responseCallback( |
|
|
|
|
JitsiMeetJS.mediaDevices.isDeviceChangeAvailable( |
|
|
|
|
request.deviceType)); |
|
|
|
|
break; |
|
|
|
|
case 'isMultipleAudioInputSupported': |
|
|
|
|
responseCallback(JitsiMeetJS.isMultipleAudioInputSupported()); |
|
|
|
|
break; |
|
|
|
|
case 'getCurrentDevices': |
|
|
|
|
dispatch(getAvailableDevices()).then(devices => { |
|
|
|
|
if (areDeviceLabelsInitialized(state)) { |
|
|
|
|
let audioInput, audioOutput, videoInput; |
|
|
|
|
const audioOutputDeviceId = getAudioOutputDeviceId(); |
|
|
|
|
const { cameraDeviceId, micDeviceId } = settings; |
|
|
|
|
|
|
|
|
|
devices.forEach(device => { |
|
|
|
|
const { deviceId } = device; |
|
|
|
|
|
|
|
|
|
switch (deviceId) { |
|
|
|
|
case micDeviceId: |
|
|
|
|
audioInput = device; |
|
|
|
|
break; |
|
|
|
|
case audioOutputDeviceId: |
|
|
|
|
audioOutput = device; |
|
|
|
|
break; |
|
|
|
|
case cameraDeviceId: |
|
|
|
|
videoInput = device; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
responseCallback({ |
|
|
|
|
audioInput, |
|
|
|
|
audioOutput, |
|
|
|
|
videoInput |
|
|
|
|
}); |
|
|
|
|
} else { |
|
|
|
|
// The labels are not available if the A/V permissions are
|
|
|
|
|
// not yet granted.
|
|
|
|
|
dispatch(addPendingDeviceRequest({ |
|
|
|
|
type: 'devices', |
|
|
|
|
name: 'getCurrentDevices', |
|
|
|
|
responseCallback |
|
|
|
|
})); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
break; |
|
|
|
|
case 'getAvailableDevices': |
|
|
|
|
dispatch(getAvailableDevices()).then(devices => { |
|
|
|
|
if (areDeviceLabelsInitialized(state)) { |
|
|
|
|
responseCallback(groupDevicesByKind(devices)); |
|
|
|
|
} else { |
|
|
|
|
// The labels are not available if the A/V permissions are
|
|
|
|
|
// not yet granted.
|
|
|
|
|
dispatch(addPendingDeviceRequest({ |
|
|
|
|
type: 'devices', |
|
|
|
|
name: 'getAvailableDevices', |
|
|
|
|
responseCallback |
|
|
|
|
})); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
break; |
|
|
|
|
case 'setDevice': { |
|
|
|
|
const { device } = request; |
|
|
|
|
|
|
|
|
|
if (!conference) { |
|
|
|
|
if (request.type !== 'devices') { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
const state = getState(); |
|
|
|
|
const settings = state['features/base/settings']; |
|
|
|
|
const { conference } = state['features/base/conference']; |
|
|
|
|
let result = true; |
|
|
|
|
|
|
|
|
|
switch (request.name) { |
|
|
|
|
case 'isDeviceListAvailable': |
|
|
|
|
responseCallback(JitsiMeetJS.mediaDevices.isDeviceListAvailable()); |
|
|
|
|
break; |
|
|
|
|
case 'isDeviceChangeAvailable': |
|
|
|
|
responseCallback( |
|
|
|
|
JitsiMeetJS.mediaDevices.isDeviceChangeAvailable( |
|
|
|
|
request.deviceType)); |
|
|
|
|
break; |
|
|
|
|
case 'isMultipleAudioInputSupported': |
|
|
|
|
responseCallback(JitsiMeetJS.isMultipleAudioInputSupported()); |
|
|
|
|
break; |
|
|
|
|
case 'getCurrentDevices': |
|
|
|
|
dispatch(getAvailableDevices()).then(devices => { |
|
|
|
|
if (areDeviceLabelsInitialized(state)) { |
|
|
|
|
let audioInput, audioOutput, videoInput; |
|
|
|
|
const audioOutputDeviceId = getAudioOutputDeviceId(); |
|
|
|
|
const { cameraDeviceId, micDeviceId } = settings; |
|
|
|
|
|
|
|
|
|
devices.forEach(device => { |
|
|
|
|
const { deviceId } = device; |
|
|
|
|
|
|
|
|
|
switch (deviceId) { |
|
|
|
|
case micDeviceId: |
|
|
|
|
audioInput = device; |
|
|
|
|
break; |
|
|
|
|
case audioOutputDeviceId: |
|
|
|
|
audioOutput = device; |
|
|
|
|
break; |
|
|
|
|
case cameraDeviceId: |
|
|
|
|
videoInput = device; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
responseCallback({ |
|
|
|
|
audioInput, |
|
|
|
|
audioOutput, |
|
|
|
|
videoInput |
|
|
|
|
}); |
|
|
|
|
} else { |
|
|
|
|
// The labels are not available if the A/V permissions are
|
|
|
|
|
// not yet granted.
|
|
|
|
|
dispatch(addPendingDeviceRequest({ |
|
|
|
|
type: 'devices', |
|
|
|
|
name: 'setDevice', |
|
|
|
|
device, |
|
|
|
|
name: 'getCurrentDevices', |
|
|
|
|
responseCallback |
|
|
|
|
})); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
const { label, id } = device; |
|
|
|
|
const deviceId = label ? getDeviceIdByLabel(state, device.label) : id; |
|
|
|
|
|
|
|
|
|
if (deviceId) { |
|
|
|
|
switch (device.kind) { |
|
|
|
|
case 'audioinput': { |
|
|
|
|
dispatch(setAudioInputDevice(deviceId)); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case 'audiooutput': |
|
|
|
|
setAudioOutputDeviceId(deviceId, dispatch); |
|
|
|
|
break; |
|
|
|
|
case 'videoinput': |
|
|
|
|
dispatch(setVideoInputDevice(deviceId)); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
result = false; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 'getAvailableDevices': |
|
|
|
|
dispatch(getAvailableDevices()).then(devices => { |
|
|
|
|
if (areDeviceLabelsInitialized(state)) { |
|
|
|
|
responseCallback(groupDevicesByKind(devices)); |
|
|
|
|
} else { |
|
|
|
|
result = false; |
|
|
|
|
// The labels are not available if the A/V permissions are
|
|
|
|
|
// not yet granted.
|
|
|
|
|
dispatch(addPendingDeviceRequest({ |
|
|
|
|
type: 'devices', |
|
|
|
|
name: 'getAvailableDevices', |
|
|
|
|
responseCallback |
|
|
|
|
})); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
responseCallback(result); |
|
|
|
|
break; |
|
|
|
|
break; |
|
|
|
|
case 'setDevice': { |
|
|
|
|
const { device } = request; |
|
|
|
|
|
|
|
|
|
if (!conference) { |
|
|
|
|
dispatch(addPendingDeviceRequest({ |
|
|
|
|
type: 'devices', |
|
|
|
|
name: 'setDevice', |
|
|
|
|
device, |
|
|
|
|
responseCallback |
|
|
|
|
})); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
default: |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
const { label, id } = device; |
|
|
|
|
const deviceId = label ? getDeviceIdByLabel(state, device.label) : id; |
|
|
|
|
|
|
|
|
|
if (deviceId) { |
|
|
|
|
switch (device.kind) { |
|
|
|
|
case 'audioinput': { |
|
|
|
|
dispatch(setAudioInputDevice(deviceId)); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case 'audiooutput': |
|
|
|
|
setAudioOutputDeviceId(deviceId, dispatch); |
|
|
|
|
break; |
|
|
|
|
case 'videoinput': |
|
|
|
|
dispatch(setVideoInputDevice(deviceId)); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
result = false; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
result = false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
responseCallback(result); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
default: |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|