diff --git a/jsonrpc.go b/jsonrpc.go index 8b771bb5..9c8cfd04 100644 --- a/jsonrpc.go +++ b/jsonrpc.go @@ -18,6 +18,7 @@ import ( "github.com/rs/zerolog" "go.bug.st/serial" + "github.com/jetkvm/kvm/internal/audio" "github.com/jetkvm/kvm/internal/hidrpc" "github.com/jetkvm/kvm/internal/usbgadget" "github.com/jetkvm/kvm/internal/utils" @@ -910,7 +911,6 @@ func updateUsbRelatedConfig(wasAudioEnabled bool) error { inputRelay = nil audioMutex.Unlock() - // Atomically swap input source inSource := inputSource.Swap(nil) if inRelay != nil { @@ -920,6 +920,27 @@ func updateUsbRelatedConfig(wasAudioEnabled bool) error { (*inSource).Disconnect() } + // Auto-switch to HDMI audio output when USB audio is disabled + audioNowEnabled := config.UsbDevices != nil && config.UsbDevices.Audio + if wasAudioEnabled && !audioNowEnabled && config.AudioOutputSource == "usb" { + config.AudioOutputSource = "hdmi" + stopOutputAudio() + if audioOutputEnabled.Load() && activeConnections.Load() > 0 && currentAudioTrack != nil { + newSource := audio.NewCgoOutputSource("hw:0,0") + newSource.SetConfig(getAudioConfig()) + newRelay := audio.NewOutputRelay(newSource, currentAudioTrack) + + audioMutex.Lock() + outputSource = newSource + outputRelay = newRelay + audioMutex.Unlock() + + if err := newRelay.Start(); err != nil { + logger.Warn().Err(err).Msg("Failed to start HDMI audio after USB audio disabled") + } + } + } + if err := gadget.UpdateGadgetConfig(); err != nil { return fmt.Errorf("failed to write gadget config: %w", err) }