src/renderer/windows/GPMWebView/playback/audioSelection.js
import _ from 'lodash';
Emitter.on('audiooutput:fetch', () => {
navigator.mediaDevices.enumerateDevices()
.then((devices) => {
Emitter.fireAtAll('audiooutput:list', _.transform(devices, (final, device) => {
final.push({
deviceId: device.deviceId,
label: device.label,
kind: device.kind,
});
}, []));
});
});
export const setAudioDevice = (audioElem, id, count = 0) =>
new Promise((resolve, reject) => {
audioElem.setSinkId(id)
.then(() => { resolve(); })
.catch((oops) => { if (count > 10000) { reject(oops); } else { setAudioDevice(id, count + 1).then(resolve).catch((err) => reject(err)); } }); // eslint-disable-line
});
Emitter.on('audiooutput:set', (event, deviceId) => {
const setForElems = (elems) => {
Array.prototype.forEach.call(elems, (audioElem) => {
let once = true;
if (audioElem.paused) {
audioElem.addEventListener('playing', () => {
if (!once) return;
once = false;
setAudioDevice(audioElem, deviceId);
});
} else {
setAudioDevice(audioElem, deviceId);
}
});
};
setForElems(document.querySelectorAll('audio:not(.offscreen)'));
setForElems(document.querySelectorAll('video'));
});