From 14b741c3ddf3ac19be6dfa8eebc1ca594b5abf44 Mon Sep 17 00:00:00 2001 From: Alex P Date: Mon, 3 Nov 2025 10:49:35 +0200 Subject: [PATCH] temp: disable audio source selection while HDMI audio issues are diagnosed Temporarily remove the ability to switch between HDMI and USB audio output sources. The application now uses USB audio (hw:1,0) exclusively until HDMI audio capture issues are resolved. Changes: - Remove AudioOutputSource config field - Remove audio source switching logic and UI - Hardcode USB audio output device - Remove related RPC methods --- audio.go | 85 ++++---------------- config.go | 2 - jsonrpc.go | 49 +---------- ui/src/hooks/stores.ts | 4 - ui/src/routes/devices.$id.settings.audio.tsx | 65 +-------------- 5 files changed, 18 insertions(+), 187 deletions(-) diff --git a/audio.go b/audio.go index 2945bab3..4d616261 100644 --- a/audio.go +++ b/audio.go @@ -12,35 +12,27 @@ import ( ) var ( - audioMutex sync.Mutex - outputSource audio.AudioSource - inputSource audio.AudioSource - outputRelay *audio.OutputRelay - inputRelay *audio.InputRelay - audioInitialized bool - activeConnections atomic.Int32 - audioLogger zerolog.Logger - currentAudioTrack *webrtc.TrackLocalStaticSample - inputTrackHandling atomic.Bool - useUSBForAudioOutput atomic.Bool - audioOutputEnabled atomic.Bool - audioInputEnabled atomic.Bool + audioMutex sync.Mutex + outputSource audio.AudioSource + inputSource audio.AudioSource + outputRelay *audio.OutputRelay + inputRelay *audio.InputRelay + audioInitialized bool + activeConnections atomic.Int32 + audioLogger zerolog.Logger + currentAudioTrack *webrtc.TrackLocalStaticSample + inputTrackHandling atomic.Bool + audioOutputEnabled atomic.Bool + audioInputEnabled atomic.Bool ) func initAudio() { audioLogger = logging.GetDefaultLogger().With().Str("component", "audio-manager").Logger() - // Load audio output source from config - ensureConfigLoaded() - useUSBForAudioOutput.Store(config.AudioOutputSource == "usb") - - // Enable both by default audioOutputEnabled.Store(true) audioInputEnabled.Store(true) - audioLogger.Debug(). - Str("source", config.AudioOutputSource). - Msg("Audio subsystem initialized") + audioLogger.Debug().Msg("Audio subsystem initialized") audioInitialized = true } @@ -56,12 +48,8 @@ func startAudio() error { // Start output audio if not running and enabled if outputSource == nil && audioOutputEnabled.Load() { - alsaDevice := "hw:0,0" // HDMI - if useUSBForAudioOutput.Load() { - alsaDevice = "hw:1,0" // USB - } + alsaDevice := "hw:1,0" // USB audio - // Create CGO audio source outputSource = audio.NewCgoOutputSource(alsaDevice) if currentAudioTrack != nil { @@ -162,51 +150,6 @@ func setAudioTrack(audioTrack *webrtc.TrackLocalStaticSample) { } } -// SetAudioOutputSource switches between HDMI and USB audio output -func SetAudioOutputSource(useUSB bool) error { - audioMutex.Lock() - defer audioMutex.Unlock() - - if useUSBForAudioOutput.Load() == useUSB { - return nil - } - - audioLogger.Info(). - Bool("old_usb", useUSBForAudioOutput.Load()). - Bool("new_usb", useUSB). - Msg("Switching audio output source") - - oldValue := useUSBForAudioOutput.Load() - useUSBForAudioOutput.Store(useUSB) - - ensureConfigLoaded() - if useUSB { - config.AudioOutputSource = "usb" - } else { - config.AudioOutputSource = "hdmi" - } - if err := SaveConfig(); err != nil { - audioLogger.Error().Err(err).Msg("Failed to save config") - useUSBForAudioOutput.Store(oldValue) - return err - } - - stopOutputLocked() - - // Restart if there are active connections - if activeConnections.Load() > 0 { - audioMutex.Unlock() - err := startAudio() - audioMutex.Lock() - if err != nil { - audioLogger.Error().Err(err).Msg("Failed to restart audio output") - return err - } - } - - return nil -} - func setPendingInputTrack(track *webrtc.TrackRemote) { audioMutex.Lock() defer audioMutex.Unlock() diff --git a/config.go b/config.go index 531c2676..d1d0f5b0 100644 --- a/config.go +++ b/config.go @@ -107,7 +107,6 @@ type Config struct { DefaultLogLevel string `json:"default_log_level"` VideoSleepAfterSec int `json:"video_sleep_after_sec"` VideoQualityFactor float64 `json:"video_quality_factor"` - AudioOutputSource string `json:"audio_output_source"` // "hdmi" or "usb" } func (c *Config) GetDisplayRotation() uint16 { @@ -180,7 +179,6 @@ func getDefaultConfig() Config { return c }(), DefaultLogLevel: "INFO", - AudioOutputSource: "usb", VideoQualityFactor: 1.0, } } diff --git a/jsonrpc.go b/jsonrpc.go index 5a341b03..f8e07151 100644 --- a/jsonrpc.go +++ b/jsonrpc.go @@ -894,33 +894,9 @@ func rpcGetUsbDevices() (usbgadget.Devices, error) { func updateUsbRelatedConfig(wasAudioEnabled bool) error { ensureConfigLoaded() - audioSourceChanged := false - - // If USB audio is being disabled and audio output source is USB, switch to HDMI - if config.UsbDevices != nil && !config.UsbDevices.Audio && config.AudioOutputSource == "usb" { - audioMutex.Lock() - config.AudioOutputSource = "hdmi" - useUSBForAudioOutput.Store(false) - audioSourceChanged = true - audioMutex.Unlock() - } - - // If USB audio is being enabled (was disabled, now enabled), switch to USB - if config.UsbDevices != nil && config.UsbDevices.Audio && !wasAudioEnabled { - audioMutex.Lock() - config.AudioOutputSource = "usb" - useUSBForAudioOutput.Store(true) - audioSourceChanged = true - audioMutex.Unlock() - } - - // Stop audio before USB reconfiguration - // Input always uses USB, output depends on audioSourceChanged + // Stop input audio before USB reconfiguration (input uses USB) audioMutex.Lock() stopInputLocked() - if audioSourceChanged { - stopOutputLocked() - } audioMutex.Unlock() if err := gadget.UpdateGadgetConfig(); err != nil { @@ -931,9 +907,8 @@ func updateUsbRelatedConfig(wasAudioEnabled bool) error { return fmt.Errorf("failed to save config: %w", err) } - // Restart audio if source changed or USB audio is enabled with active connections - // The relay handles device readiness via retry logic - if activeConnections.Load() > 0 && (audioSourceChanged || (config.UsbDevices != nil && config.UsbDevices.Audio)) { + // Restart audio if USB audio is enabled with active connections + if activeConnections.Load() > 0 && config.UsbDevices != nil && config.UsbDevices.Audio { if err := startAudio(); err != nil { logger.Warn().Err(err).Msg("Failed to restart audio after USB reconfiguration") } @@ -970,22 +945,6 @@ func rpcSetUsbDeviceState(device string, enabled bool) error { return updateUsbRelatedConfig(wasAudioEnabled) } -func rpcGetAudioOutputSource() (string, error) { - if useUSBForAudioOutput.Load() { - return "usb", nil - } - return "hdmi", nil -} - -func rpcSetAudioOutputSource(source string) error { - if source != "hdmi" && source != "usb" { - return fmt.Errorf("invalid audio output source: %s (must be 'hdmi' or 'usb')", source) - } - - useUSB := source == "usb" - return SetAudioOutputSource(useUSB) -} - func rpcGetAudioOutputEnabled() (bool, error) { return audioOutputEnabled.Load(), nil } @@ -1320,8 +1279,6 @@ var rpcHandlers = map[string]RPCHandler{ "getUsbDevices": {Func: rpcGetUsbDevices}, "setUsbDevices": {Func: rpcSetUsbDevices, Params: []string{"devices"}}, "setUsbDeviceState": {Func: rpcSetUsbDeviceState, Params: []string{"device", "enabled"}}, - "getAudioOutputSource": {Func: rpcGetAudioOutputSource}, - "setAudioOutputSource": {Func: rpcSetAudioOutputSource, Params: []string{"source"}}, "getAudioOutputEnabled": {Func: rpcGetAudioOutputEnabled}, "setAudioOutputEnabled": {Func: rpcSetAudioOutputEnabled, Params: []string{"enabled"}}, "getAudioInputEnabled": {Func: rpcGetAudioInputEnabled}, diff --git a/ui/src/hooks/stores.ts b/ui/src/hooks/stores.ts index aa9ba033..fb1fd7b3 100644 --- a/ui/src/hooks/stores.ts +++ b/ui/src/hooks/stores.ts @@ -370,8 +370,6 @@ export interface SettingsState { setVideoContrast: (value: number) => void; // Audio settings - audioOutputSource: string; - setAudioOutputSource: (source: string) => void; audioOutputEnabled: boolean; setAudioOutputEnabled: (enabled: boolean) => void; audioInputEnabled: boolean; @@ -425,8 +423,6 @@ export const useSettingsStore = create( setVideoContrast: (value: number) => set({ videoContrast: value }), // Audio settings with defaults - audioOutputSource: "usb", - setAudioOutputSource: (source: string) => set({ audioOutputSource: source }), audioOutputEnabled: true, setAudioOutputEnabled: (enabled: boolean) => set({ audioOutputEnabled: enabled }), audioInputEnabled: true, diff --git a/ui/src/routes/devices.$id.settings.audio.tsx b/ui/src/routes/devices.$id.settings.audio.tsx index 22a47277..63082f2b 100644 --- a/ui/src/routes/devices.$id.settings.audio.tsx +++ b/ui/src/routes/devices.$id.settings.audio.tsx @@ -4,7 +4,7 @@ import { SettingsItem } from "@components/SettingsItem"; import { SettingsPageHeader } from "@components/SettingsPageheader"; import { useSettingsStore } from "@/hooks/stores"; import { JsonRpcResponse, useJsonRpc } from "@/hooks/useJsonRpc"; -import { SelectMenuBasic } from "@components/SelectMenuBasic"; +// import { SelectMenuBasic } from "@components/SelectMenuBasic"; import Checkbox from "@components/Checkbox"; import { m } from "@localizations/messages.js"; @@ -14,15 +14,7 @@ export default function SettingsAudioRoute() { const { send } = useJsonRpc(); const settings = useSettingsStore(); - // Fetch current audio settings on mount useEffect(() => { - send("getAudioOutputSource", {}, (resp: JsonRpcResponse) => { - if ("error" in resp) { - return; - } - settings.setAudioOutputSource(resp.result as string); - }); - send("getAudioOutputEnabled", {}, (resp: JsonRpcResponse) => { if ("error" in resp) { return; @@ -39,41 +31,6 @@ export default function SettingsAudioRoute() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [send]); - const handleAudioOutputSourceChange = (source: string) => { - // Update UI immediately for better responsiveness - settings.setAudioOutputSource(source); - - send("setAudioOutputSource", { source }, (resp: JsonRpcResponse) => { - if ("error" in resp) { - // Revert on error by fetching current value from backend - send("getAudioOutputSource", {}, (getResp: JsonRpcResponse) => { - if ("result" in getResp) { - settings.setAudioOutputSource(getResp.result as string); - } - }); - notifications.error( - m.audio_settings_output_source_failed({ error: String(resp.error.data || m.unknown_error()) }), - ); - return; - } - - // Verify the change was applied by fetching the actual value - send("getAudioOutputSource", {}, (getResp: JsonRpcResponse) => { - if ("result" in getResp) { - const actualSource = getResp.result as string; - settings.setAudioOutputSource(actualSource); - if (actualSource === source) { - notifications.success(m.audio_settings_output_source_success()); - } else { - notifications.error( - m.audio_settings_output_source_failed({ error: `Expected ${source}, got ${actualSource}` }), - ); - } - } - }); - }); - }; - const handleAudioOutputEnabledChange = (enabled: boolean) => { send("setAudioOutputEnabled", { enabled }, (resp: JsonRpcResponse) => { if ("error" in resp) { @@ -121,26 +78,6 @@ export default function SettingsAudioRoute() { /> - {settings.audioOutputEnabled && ( - - { - handleAudioOutputSourceChange(e.target.value); - }} - /> - - )} -