fix output switching outside electron

This commit is contained in:
Vidocq 2021-03-04 01:16:15 +08:00
parent aaa68c5808
commit bcd05803e2
4 changed files with 32 additions and 12 deletions

View File

@ -13,6 +13,7 @@ const i18n = new VueI18n({
en, en,
"zh-CN": zhCN, "zh-CN": zhCN,
}, },
silentTranslationWarn: true,
}); });
export default i18n; export default i18n;

View File

@ -119,6 +119,8 @@ export default {
lossless: "Lossless", lossless: "Lossless",
}, },
deviceSelector: "Audio Output Device", deviceSelector: "Audio Output Device",
permissionDenied: "Microphone Permission Denied",
permissionRequired: "Microphone Permission Required",
appearance: { appearance: {
text: "Appearance", text: "Appearance",
auto: "Auto", auto: "Auto",

View File

@ -120,6 +120,8 @@ export default {
lossless: "无损", lossless: "无损",
}, },
deviceSelector: "音频输出设备", deviceSelector: "音频输出设备",
permissionDenied: "无麦克风权限",
permissionRequired: "需要麦克风权限",
appearance: { appearance: {
text: "外观", text: "外观",
auto: "自动", auto: "自动",

View File

@ -79,14 +79,14 @@
<div class="title"> {{ $t("settings.deviceSelector") }} </div> <div class="title"> {{ $t("settings.deviceSelector") }} </div>
</div> </div>
<div class="right"> <div class="right">
<select v-model="outputDevice"> <select v-model="outputDevice" :disabled="withoutAudioPriviledge">
<option <option
v-for="device in allOutputDevices" v-for="device in allOutputDevices"
:key="device.deviceId" :key="device.deviceId"
:value="device.deviceId" :value="device.deviceId"
:selected="device.deviceId == outputDevice" :selected="device.deviceId == outputDevice"
> >
{{ device.label }} {{ $t(device.label) }}
</option> </option>
</select> </select>
</div> </div>
@ -244,7 +244,11 @@ export default {
size: "0KB", size: "0KB",
length: 0, length: 0,
}, },
allOutputDevices: [], allOutputDevices: [{
deviceId: "default",
label: "settings.permissionRequired"
}],
withoutAudioPriviledge: true,
}; };
}, },
computed: { computed: {
@ -290,7 +294,7 @@ export default {
}, },
outputDevice: { outputDevice: {
get() { get() {
if (this.allOutputDevices.length == 0) this.getAllOutputDevices(); // Ensure devices loaded before get if (this.withoutAudioPriviledge === true) this.getAllOutputDevices();
const isValidDevice = this.allOutputDevices.find( const isValidDevice = this.allOutputDevices.find(
(device) => device.deviceId === this.settings.outputDevice (device) => device.deviceId === this.settings.outputDevice
); );
@ -395,7 +399,11 @@ export default {
}, },
methods: { methods: {
getAllOutputDevices() { getAllOutputDevices() {
return navigator.mediaDevices navigator.mediaDevices.
getUserMedia({ audio: true })
.then(() => {
this.withoutAudioPriviledge = false;
navigator.mediaDevices
.enumerateDevices() .enumerateDevices()
.then( .then(
(devices) => (devices) =>
@ -403,6 +411,13 @@ export default {
(device) => device.kind == "audiooutput" (device) => device.kind == "audiooutput"
)) ))
); );
})
.catch(() => {
this.allOutputDevices = [{
deviceId: "default",
label: "settings.permissionDenied",
}];
})
}, },
logout() { logout() {
doLogout(); doLogout();