Files
Melo/src/renderer/core/useApp/usePlayer/useMediaDevice.ts
T

89 lines
2.8 KiB
TypeScript

import {
onBeforeUnmount,
watch,
} from '@common/utils/vueTools'
import { pause } from '@renderer/core/player/action'
import { setMediaDeviceId } from '@renderer/plugins/player'
import { isPlay } from '@renderer/store/player/state'
import { appSetting, saveMediaDeviceId } from '@renderer/store/setting'
const getDevices = async() => {
const devices = await navigator.mediaDevices.enumerateDevices()
return devices.filter(({ kind }) => kind == 'audiooutput')
}
export default () => {
let prevDeviceLabel: string | null = null
let prevDeviceId = ''
const setMediaDevice = async(mediaDeviceId: string) => {
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).then(() => {
prevDeviceId = mediaDeviceId
saveMediaDeviceId(mediaDeviceId)
}).catch((err: any) => {
console.log(err)
setMediaDeviceId('default').finally(() => {
prevDeviceId = 'default'
saveMediaDeviceId('default')
})
})
}
const handleDeviceChangeStopPlay = (device: MediaDeviceInfo, mediaDeviceId: string) => {
// console.log(device)
// console.log(this.appSetting.player['isMediaDeviceRemovedStopPlay,'] this.isPlay, device.label, this.prevDeviceLabel)
if (
appSetting['player.isMediaDeviceRemovedStopPlay'] &&
isPlay.value &&
device.label != prevDeviceLabel
) {
window.lx.isPlayedStop = true
pause()
}
}
const handleMediaListChange = async() => {
let mediaDeviceId = appSetting['player.mediaDeviceId']
const devices = await getDevices()
let device = devices.find(device => device.deviceId === mediaDeviceId)
device ??= devices.find(device => device.deviceId === 'default')
// @ts-expect-error
device ??= { label: '', deviceId: '' }
// @ts-expect-error
handleDeviceChangeStopPlay(device, mediaDeviceId)
void setMediaDevice(device!.deviceId)
}
watch(() => appSetting['player.mediaDeviceId'], (id) => {
if (prevDeviceId == id) return
void setMediaDevice(id)
})
void setMediaDevice(appSetting['player.mediaDeviceId'])
// eslint-disable-next-line @typescript-eslint/no-misused-promises
navigator.mediaDevices.addEventListener('devicechange', handleMediaListChange)
onBeforeUnmount(() => {
// eslint-disable-next-line @typescript-eslint/no-misused-promises
navigator.mediaDevices.removeEventListener('devicechange', handleMediaListChange)
})
}