diff --git a/conference.js b/conference.js
index b6b33d491..42c429a4e 100644
--- a/conference.js
+++ b/conference.js
@@ -10,6 +10,8 @@ import ConnectionQuality from './modules/connectionquality/connectionquality';
import CQEvents from './service/connectionquality/CQEvents';
import UIEvents from './service/UI/UIEvents';
+const LibraryEvents = JitsiMeetJS.events.library;
+
const ConnectionEvents = JitsiMeetJS.events.connection;
const ConnectionErrors = JitsiMeetJS.errors.connection;
@@ -340,12 +342,14 @@ export default {
JitsiMeetJS.isDesktopSharingEnabled();
// update list of available devices
- if (JitsiMeetJS.isDeviceListAvailable() &&
- JitsiMeetJS.isDeviceChangeAvailable()) {
- JitsiMeetJS.enumerateDevices(
- devices => APP.UI.onAvailableDevicesChanged(devices)
- );
- }
+ APP.UI.updateDevicesList(JitsiMeetJS.getDevicesList());
+ JitsiMeetJS.on(
+ LibraryEvents.DEVICES_LIST_CHANGED,
+ function () {
+ APP.UI.updateDevicesList(JitsiMeetJS.getDevicesList());
+ }
+ );
+
// XXX The API will take care of disconnecting from the XMPP server
// (and, thus, leaving the room) on unload.
return new Promise((resolve, reject) => {
diff --git a/modules/UI/UI.js b/modules/UI/UI.js
index 3b3a88c98..8af1548c8 100644
--- a/modules/UI/UI.js
+++ b/modules/UI/UI.js
@@ -1074,7 +1074,7 @@ UI.onStartMutedChanged = function (startAudioMuted, startVideoMuted) {
* Update list of available physical devices.
* @param {object[]} devices new list of available devices
*/
-UI.onAvailableDevicesChanged = function (devices) {
+UI.updateDevicesList = function (devices) {
SettingsMenu.changeDevicesList(devices);
};
diff --git a/modules/UI/side_pannels/settings/SettingsMenu.js b/modules/UI/side_pannels/settings/SettingsMenu.js
index ffebeaf20..f4645886c 100644
--- a/modules/UI/side_pannels/settings/SettingsMenu.js
+++ b/modules/UI/side_pannels/settings/SettingsMenu.js
@@ -33,7 +33,7 @@ function generateLanguagesOptions(items, currentLang) {
* @returns {string}
*/
function generateDevicesOptions(items, selectedId) {
- return items.map(function (item) {
+ let options = items.map(function (item) {
let attrs = {
value: item.deviceId
};
@@ -44,7 +44,10 @@ function generateDevicesOptions(items, selectedId) {
let attrsStr = UIUtil.attrsToString(attrs);
return ``;
- }).join('\n');
+ });
+ options.unshift('');
+
+ return options.join('\n');
}
@@ -111,7 +114,6 @@ export default {
// DEVICES LIST
- this.changeDevicesList([]);
$('#selectCamera').change(function () {
let cameraDeviceId = $(this).val();
if (cameraDeviceId !== Settings.getCameraDeviceId()) {
@@ -185,22 +187,24 @@ export default {
* no devices available.
* @param {{ deviceId, label, kind }[]} devices list of available devices
*/
- changeDevicesList (devices) {
- if (!devices.length) {
- $('#devicesOptions').hide();
- return;
+ changeDevicesList ({ audio = [], video = []}) {
+ let audioSelect = $('#selectMic');
+ if (audio.length) {
+ audioSelect.html(
+ generateDevicesOptions(audio, Settings.getMicDeviceId())
+ );
}
+ audioSelect.parent().toggle(!!audio.length);
- let audio = devices.filter(device => device.kind === 'audioinput');
- let video = devices.filter(device => device.kind === 'videoinput');
- $('#selectCamera').html(
- generateDevicesOptions(video, Settings.getCameraDeviceId())
- );
- $('#selectMic').html(
- generateDevicesOptions(audio, Settings.getMicDeviceId())
- );
+ let videoSelect = $('#selectCamera');
+ if (video.length) {
+ videoSelect.html(
+ generateDevicesOptions(video, Settings.getCameraDeviceId())
+ );
+ }
+ videoSelect.parent().toggle(!!video.length);
- $('#devicesOptions').show();
+ $('#devicesOptions').toggle(!!(audio.length || video.length));
}
};
diff --git a/package.json b/package.json
index 0fd97c61a..ada7aaa7f 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
"browserify": "11.1.x",
"browserify-shim": "^3.8.10",
"exorcist": "*",
- "jshint": "2.8.0",
+ "jshint": "2.9.1",
"precommit-hook": "3.0.0",
"uglify-js": "2.4.24",
"clean-css": "*",