import { onBeforeUnmount, watch, useCommit, } from '@renderer/utils/vueTools' import { setMediaDeviceId } from '@renderer/plugins/player' import { isPlay } from '@renderer/core/share/player' import { player as eventPlayerNames } from '@renderer/event/names' const getDevices = async() => { const devices = await navigator.mediaDevices.enumerateDevices() return devices.filter(({ kind }) => kind == 'audiooutput') } export default ({ setting }) => { let prevDeviceLabel = null const saveMediaDeviceId = useCommit('setMediaDeviceId') const setMediaDevice = async(mediaDeviceId) => { let label = prevDeviceLabel const devices = await getDevices() let device = devices.find(device => device.deviceId === mediaDeviceId) if (device) { mediaDeviceId = device.deviceId label = device.label } else { mediaDeviceId = 'default' device = devices.find(device => device.deviceId === mediaDeviceId) if (device) label = device.label } prevDeviceLabel = label // console.log(device) setMediaDeviceId(mediaDeviceId).catch(err => { console.log(err) saveMediaDeviceId('default') }) } const handleDeviceChangeStopPlay = (device, mediaDeviceId) => { // console.log(device) // console.log(this.setting.player.isMediaDeviceRemovedStopPlay, this.isPlay, device.label, this.prevDeviceLabel) if ( setting.value.player.isMediaDeviceRemovedStopPlay && isPlay.value && device.label != prevDeviceLabel ) window.eventHub.emit(eventPlayerNames.setPause) } const handleMediaListChange = async() => { let mediaDeviceId = setting.value.player.mediaDeviceId const devices = await getDevices() let device = devices.find(device => device.deviceId === mediaDeviceId) if (!device) device = devices.find(device => device.deviceId === 'default') if (!device) device = { label: null, deviceId: null } handleDeviceChangeStopPlay(device, mediaDeviceId) setMediaDeviceId(device.deviceId).catch(err => { console.log(err) saveMediaDeviceId('default') }) } watch(() => setting.value.player.mediaDeviceId, setMediaDevice) setMediaDevice(setting.value.player.mediaDeviceId) navigator.mediaDevices.addEventListener('devicechange', handleMediaListChange) onBeforeUnmount(() => { navigator.mediaDevices.removeEventListener('devicechange', handleMediaListChange) }) }