diff --git a/client/app/components.d.ts b/client/app/components.d.ts index 53f1a14..d7c3db7 100644 --- a/client/app/components.d.ts +++ b/client/app/components.d.ts @@ -21,6 +21,7 @@ declare module 'vue' { PrimePanel: typeof import('primevue/panel')['default'] PrimePassword: typeof import('primevue/password')['default'] PrimeProgressBar: typeof import('primevue/progressbar')['default'] + PrimeScrollPanel: typeof import('primevue/scrollpanel')['default'] PrimeSelect: typeof import('primevue/select')['default'] PrimeSelectButton: typeof import('primevue/selectbutton')['default'] PrimeSlider: typeof import('primevue/slider')['default'] diff --git a/client/app/composables/use-audio-context.ts b/client/app/composables/use-audio-context.ts index 9fb801f..fe12f5e 100644 --- a/client/app/composables/use-audio-context.ts +++ b/client/app/composables/use-audio-context.ts @@ -4,13 +4,12 @@ export default function useAudioContext(audioTrack: Ref() const gainNode = ctx.createGain() - let hackExecuted = false - - watch(audioTrack, (track, prevTrack) => { + watch(audioTrack, async (track, prevTrack) => { if (prevTrack) stream.removeTrack(prevTrack) @@ -19,16 +18,14 @@ export default function useAudioContext(audioTrack: Ref { @@ -36,10 +33,16 @@ export default function useAudioContext(audioTrack: Ref { + audioEl.pause() + audioEl.srcObject = null + ctx.close() + }) + + async function connect() { if (!sourceNode.value || ctx.state === 'suspended') return diff --git a/client/app/composables/use-mediasoup.ts b/client/app/composables/use-mediasoup.ts index 625c2aa..a7761f5 100644 --- a/client/app/composables/use-mediasoup.ts +++ b/client/app/composables/use-mediasoup.ts @@ -165,8 +165,6 @@ export const useMediasoup = createSharedComposable(() => { if (producerPaused) consumer.pause() - console.log('newConsumer', consumer.paused) - consumer.on('transportclose', () => { if (consumers.value.delete(consumer.id)) triggerRef(consumers) @@ -248,12 +246,13 @@ export const useMediasoup = createSharedComposable(() => { const stream = await navigator.mediaDevices.getUserMedia({ audio: { - autoGainControl: false, - noiseSuppression: true, - echoCancellation: false, - channelCount: 2, + deviceId: { exact: preferences.inputDeviceId.value }, + autoGainControl: { exact: preferences.autoGainControl.value }, + echoCancellation: { exact: preferences.echoCancellation.value }, + noiseSuppression: { exact: preferences.noiseSuppression.value }, }, }) + const track = stream.getAudioTracks()[0] if (!track) @@ -270,6 +269,7 @@ export const useMediasoup = createSharedComposable(() => { producers.value.set(micProducer.value.id, micProducer.value) triggerRef(producers) + triggerRef(micProducer) micProducer.value.on('transportclose', () => { micProducer.value = undefined @@ -297,6 +297,7 @@ export const useMediasoup = createSharedComposable(() => { } finally { triggerRef(producers) + triggerRef(micProducer) } micProducer.value = undefined @@ -370,6 +371,32 @@ export const useMediasoup = createSharedComposable(() => { } } + watch( + preferences.inputDeviceId, + async (inputDeviceId) => { + await disableMic() + + if (!inputDeviceId) + return + + await enableMic() + }, + ) + + watch([ + preferences.inputDeviceId, + preferences.echoCancellation, + preferences.autoGainControl, + preferences.noiseSuppression, + ], async ([inputDeviceId]) => { + await disableMic() + + if (!inputDeviceId) + return + + await enableMic() + }) + return { init, consumers, diff --git a/client/app/composables/use-preferences.ts b/client/app/composables/use-preferences.ts index 52edfe4..5783b7c 100644 --- a/client/app/composables/use-preferences.ts +++ b/client/app/composables/use-preferences.ts @@ -16,14 +16,24 @@ export const usePreferences = createGlobalState(() => { audioOutputs, } = useDevicesList() + const inputDeviceExist = computed(() => { + return audioInputs.value.some(device => device.deviceId === inputDeviceId.value) + }) + + const outputDeviceExist = computed(() => { + return audioOutputs.value.some(device => device.deviceId === outputDeviceId.value) + }) + return { inputDeviceId, outputDeviceId, autoGainControl, noiseSuppression, echoCancellation, - videoInputs, - audioInputs, - audioOutputs, + inputDeviceExist, + outputDeviceExist, + videoInputs: computed(() => JSON.parse(JSON.stringify(videoInputs.value))), + audioInputs: computed(() => JSON.parse(JSON.stringify(audioInputs.value))), + audioOutputs: computed(() => JSON.parse(JSON.stringify(audioOutputs.value))), } }) diff --git a/client/app/layouts/default.vue b/client/app/layouts/default.vue index 7068ae8..72e5a68 100644 --- a/client/app/layouts/default.vue +++ b/client/app/layouts/default.vue @@ -1,54 +1,54 @@ diff --git a/client/app/pages/index.vue b/client/app/pages/index.vue index db92b1d..f119f72 100644 --- a/client/app/pages/index.vue +++ b/client/app/pages/index.vue @@ -1,5 +1,5 @@