From ec09085a501f7039258ed015a2554d2df6cc5303 Mon Sep 17 00:00:00 2001 From: virtuacoplenny Date: Thu, 4 Apr 2019 08:10:01 -0700 Subject: [PATCH] fix(device-selection): set audio output device on initial configuration When the iFrame api is used to set a preferred audio output using options passed into the JitsiMeetExternalAPI constructor, no logic fires to actually change the audio output destination. --- react/features/base/devices/actions.js | 27 +++++++++++++++++-------- react/features/base/settings/reducer.js | 13 +----------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/react/features/base/devices/actions.js b/react/features/base/devices/actions.js index 6fb9b0062..76b4fdc5c 100644 --- a/react/features/base/devices/actions.js +++ b/react/features/base/devices/actions.js @@ -11,9 +11,12 @@ import { import { areDeviceLabelsInitialized, getDeviceIdByLabel, - getDevicesFromURL + getDevicesFromURL, + setAudioOutputDeviceId } from './functions'; +const logger = require('jitsi-meet-logger').getLogger(__filename); + /** * Adds a pending device request. * @@ -36,11 +39,12 @@ export function addPendingDeviceRequest(request) { * @returns {Function} */ export function configureInitialDevices() { - return (dispatch, getState) => new Promise(resolve => { + return (dispatch, getState) => { const deviceLabels = getDevicesFromURL(getState()); + let updateSettingsPromise; if (deviceLabels) { - dispatch(getAvailableDevices()).then(() => { + updateSettingsPromise = dispatch(getAvailableDevices()).then(() => { const state = getState(); if (!areDeviceLabelsInitialized(state)) { @@ -59,7 +63,6 @@ export function configureInitialDevices() { responseCallback() {} })); }); - resolve(); return; } @@ -80,13 +83,21 @@ export function configureInitialDevices() { }); dispatch(updateSettings(newSettings)); - resolve(); }); - } else { - resolve(); + updateSettingsPromise = Promise.resolve(); } - }); + + return updateSettingsPromise + .then(() => { + const { audioOutputDeviceId } + = getState()['features/base/settings']; + + return setAudioOutputDeviceId(audioOutputDeviceId, dispatch) + .catch(ex => logger.warn(`Failed to set audio output device. + Default audio output device will be used instead ${ex}`)); + }); + }; } /** diff --git a/react/features/base/settings/reducer.js b/react/features/base/settings/reducer.js index 90858d9c6..eb5f28bf0 100644 --- a/react/features/base/settings/reducer.js +++ b/react/features/base/settings/reducer.js @@ -4,7 +4,7 @@ import { randomHexString } from 'js-utils/random'; import _ from 'lodash'; import { APP_WILL_MOUNT } from '../app'; -import JitsiMeetJS, { browser } from '../lib-jitsi-meet'; +import { browser } from '../lib-jitsi-meet'; import { ReducerRegistry } from '../redux'; import { PersistenceRegistry } from '../storage'; import { assignIfDefined } from '../util'; @@ -136,17 +136,6 @@ function _initSettings(featureState) { localFlipX, micDeviceId }, settings); - - if (settings.audioOutputDeviceId - !== JitsiMeetJS.mediaDevices.getAudioOutputDevice()) { - JitsiMeetJS.mediaDevices.setAudioOutputDevice( - settings.audioOutputDeviceId - ).catch(ex => { - logger.warn('Failed to set audio output device from local ' - + 'storage. Default audio output device will be used' - + 'instead.', ex); - }); - } } // Things we stored in profile earlier