diff --git a/apps/stage-web/src/pages/settings/modules/hearing.vue b/apps/stage-web/src/pages/settings/modules/hearing.vue index 05c716c1f..9ecb514e2 100644 --- a/apps/stage-web/src/pages/settings/modules/hearing.vue +++ b/apps/stage-web/src/pages/settings/modules/hearing.vue @@ -2,8 +2,8 @@ import type { TranscriptionProvider } from '@xsai-ext/shared-providers' import { Alert, Button, ErrorContainer, LevelMeter, RadioCardManySelect, RadioCardSimple, TestDummyMarker, ThresholdMeter, TimeSeriesChart } from '@proj-airi/stage-ui/components' -import { useAudioAnalyzer, useAudioDevice, useAudioRecorder } from '@proj-airi/stage-ui/composables' -import { useAudioContext, useHearingStore, useProvidersStore } from '@proj-airi/stage-ui/stores' +import { useAudioAnalyzer, useAudioRecorder } from '@proj-airi/stage-ui/composables' +import { useAudioContext, useHearingStore, useProvidersStore, useSettingsAudioDevice } from '@proj-airi/stage-ui/stores' import { FieldCheckbox, FieldRange, FieldSelect } from '@proj-airi/ui' import { storeToRefs } from 'pinia' import { computed, onMounted, onUnmounted, ref, watch } from 'vue' @@ -29,7 +29,8 @@ const { const providersStore = useProvidersStore() const { configuredTranscriptionProvidersMetadata } = storeToRefs(providersStore) -const { audioInputs, selectedAudioInput, stream, stopStream, startStream } = useAudioDevice() +const { stopStream, startStream } = useSettingsAudioDevice() +const { audioInputs, selectedAudioInput, stream } = storeToRefs(useSettingsAudioDevice()) const { startRecord, stopRecord, onStopRecord } = useAudioRecorder(stream) const { startAnalyzer, stopAnalyzer, onAnalyzerUpdate, volumeLevel } = useAudioAnalyzer() const { audioContext } = storeToRefs(useAudioContext()) diff --git a/packages/stage-ui/src/stores/audio.ts b/packages/stage-ui/src/stores/audio.ts index 8e02bb24c..97a5e3a5c 100644 --- a/packages/stage-ui/src/stores/audio.ts +++ b/packages/stage-ui/src/stores/audio.ts @@ -84,13 +84,13 @@ export const useAudioContext = defineStore('audio-context', () => { export function useAudioDevice(requestPermission: boolean = false) { const devices = useDevicesList({ constraints: { audio: true }, requestPermissions: requestPermission }) const audioInputs = computed(() => devices.audioInputs.value) - const selectedAudioInput = ref(devices.audioInputs.value[0]?.deviceId || '') + const selectedAudioInput = ref(devices.audioInputs.value.find(device => device.deviceId === 'default')?.deviceId || '') const deviceConstraints = computed(() => ({ audio: { deviceId: { exact: selectedAudioInput.value }, autoGainControl: true, echoCancellation: true, noiseSuppression: true } })) const { stream, stop: stopStream, start: startStream } = useUserMedia({ constraints: deviceConstraints, enabled: false, autoSwitch: true }) watch(audioInputs, () => { if (!selectedAudioInput.value && audioInputs.value.length > 0) { - selectedAudioInput.value = audioInputs.value[0]?.deviceId + selectedAudioInput.value = audioInputs.value.find(input => input.deviceId === 'default')?.deviceId || audioInputs.value[0].deviceId } }) diff --git a/packages/stage-ui/src/stores/settings.ts b/packages/stage-ui/src/stores/settings.ts index 225ec0ad1..91e3c4f8d 100644 --- a/packages/stage-ui/src/stores/settings.ts +++ b/packages/stage-ui/src/stores/settings.ts @@ -116,8 +116,8 @@ export const useSettingsAudioDevice = defineStore('settings-audio-devices', () = const selectedAudioInputPersist = useLocalStorage('settings/audio/input', selectedAudioInputNonPersist.value) const selectedAudioInputEnabledPersist = useLocalStorage('settings/audio/input-enabled', false) - watch(selectedAudioInputNonPersist, (newValue) => { - selectedAudioInputPersist.value = newValue + watch(selectedAudioInputPersist, (newValue) => { + selectedAudioInputNonPersist.value = newValue }) watch(selectedAudioInputEnabledPersist, (val) => { @@ -130,15 +130,18 @@ export const useSettingsAudioDevice = defineStore('settings-audio-devices', () = }) onMounted(() => { - if (selectedAudioInputEnabledPersist.value && selectedAudioInputNonPersist.value) { + if (selectedAudioInputEnabledPersist.value && selectedAudioInputPersist.value) { startStream() } + if (selectedAudioInputNonPersist.value && !selectedAudioInputEnabledPersist.value) { + selectedAudioInputPersist.value = selectedAudioInputNonPersist.value + } }) return { audioInputs, deviceConstraints, - selectedAudioInput: selectedAudioInputNonPersist, + selectedAudioInput: selectedAudioInputPersist, enabled: selectedAudioInputEnabledPersist, stream, diff --git a/packages/ui/src/components/Form/Combobox/Combobox.vue b/packages/ui/src/components/Form/Combobox/Combobox.vue index a20233273..502280724 100644 --- a/packages/ui/src/components/Form/Combobox/Combobox.vue +++ b/packages/ui/src/components/Form/Combobox/Combobox.vue @@ -1,4 +1,6 @@ -