/
useMixer.ts
78 lines (62 loc) · 1.69 KB
/
useMixer.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { useState } from 'react'
export interface AudioDevice {
name: string
device: MediaDeviceInfo
enabled: boolean
}
const useMixer = (initialDevices: AudioDevice[]) => {
const [mixerDevices, setMixerDevices] = useState(initialDevices)
const removeMixerDevice = async (mixerDevice: AudioDevice, client: any) => {
if (!mixerDevice) return
try {
const { name } = mixerDevice
if (!name) return
await client.removeAudioInputDevice(name)
setMixerDevices((prevState) =>
prevState.filter((item) => item.name !== name)
)
} catch (err) {
console.error(err)
}
}
const addMixerDevice = async (mixerDevice: AudioDevice, client: any) => {
try {
const { device, name, enabled } = mixerDevice
if (client.getAudioInputDevice(name)) {
await removeMixerDevice(mixerDevice, client)
}
const audioStream = await navigator.mediaDevices.getUserMedia({
audio: { deviceId: device.deviceId },
video: false,
})
await client.addAudioInputDevice(audioStream, name)
if (!enabled) {
const [microphoneTrack] = client
.getAudioInputDevice(name)
.getAudioTracks()
microphoneTrack.enabled = false
}
setMixerDevices((prevState) => [...prevState, mixerDevice])
} catch (err: any) {
console.error(err)
}
}
const toggleMixerDeviceMute = (mixerDevice: AudioDevice, client: any) => {
const { name, enabled } = mixerDevice
const [microphoneTrack] = client
.getAudioInputDevice(name)
.getAudioTracks()
if (enabled) {
microphoneTrack.enabled = true
} else {
microphoneTrack.enabled = false
}
return !microphoneTrack.enabled
}
return {
addMixerDevice,
removeMixerDevice,
toggleMixerDeviceMute,
}
}
export default useMixer