import React from 'react'; import { invoke } from '@tauri-apps/api/core'; import { AudioLines, RotateCcw } from 'lucide-react'; import type { TFunction } from 'i18next'; import CustomSelect from '../../CustomSelect'; import SettingsSubSection from '../../SettingsSubSection'; import { useAuthStore } from '../../../store/authStore'; import { IS_MACOS } from '../../../utils/platform'; import { buildAudioDeviceSelectOptions } from '../../../utils/audio/audioDeviceLabels'; interface Props { audioDevices: string[]; osDefaultAudioDeviceId: string | null; deviceSwitching: boolean; devicesLoading: boolean; setDeviceSwitching: (v: boolean) => void; refreshAudioDevices: (opts?: { silent?: boolean }) => void; t: TFunction; } /** * Audio output device picker. macOS is hard-pinned to the system default, * so the picker collapses to a notice on that platform. * * The device switch is best-effort: if `audio_set_device` rejects (e.g. * device disappeared) we leave the previous selection in the store. */ export function AudioOutputDeviceSection({ audioDevices, osDefaultAudioDeviceId, deviceSwitching, devicesLoading, setDeviceSwitching, refreshAudioDevices, t, }: Props) { const audioOutputDevice = useAuthStore(s => s.audioOutputDevice); const setAudioOutputDevice = useAuthStore(s => s.setAudioOutputDevice); return ( } >
{IS_MACOS ? (
{t('settings.audioOutputDeviceMacNotice')}
) : ( <>
{t('settings.audioOutputDeviceDesc')}
{ const device = val || null; setDeviceSwitching(true); try { await invoke('audio_set_device', { deviceName: device }); setAudioOutputDevice(device); } catch { /* device open failed — don't persist */ } setDeviceSwitching(false); }} options={buildAudioDeviceSelectOptions( audioDevices, t('settings.audioOutputDeviceDefault'), osDefaultAudioDeviceId, t('settings.audioOutputDeviceOsDefaultNow'), audioOutputDevice, t('settings.audioOutputDeviceNotInCurrentList'), )} />
)}
); }