Enhancement: Make the code more DRY

This commit is contained in:
Alex P 2025-11-10 19:09:22 +02:00
parent f51c372183
commit 50c6d0d0b0
2 changed files with 19 additions and 19 deletions

View File

@ -66,8 +66,7 @@ func startAudio() error {
if inputSource.Load() == nil && audioInputEnabled.Load() && config.UsbDevices != nil && config.UsbDevices.Audio { if inputSource.Load() == nil && audioInputEnabled.Load() && config.UsbDevices != nil && config.UsbDevices.Audio {
alsaPlaybackDevice := "hw:1,0" // USB speakers alsaPlaybackDevice := "hw:1,0" // USB speakers
// Create CGO audio source var source audio.AudioSource = audio.NewCgoInputSource(alsaPlaybackDevice)
source := audio.NewCgoInputSource(alsaPlaybackDevice)
inputSource.Store(&source) inputSource.Store(&source)
inputRelay = audio.NewInputRelay(source) inputRelay = audio.NewInputRelay(source)
@ -79,7 +78,6 @@ func startAudio() error {
return nil return nil
} }
// stopOutputAudio stops output audio (device → browser)
func stopOutputAudio() { func stopOutputAudio() {
audioMutex.Lock() audioMutex.Lock()
outRelay := outputRelay outRelay := outputRelay
@ -88,7 +86,6 @@ func stopOutputAudio() {
outputSource = nil outputSource = nil
audioMutex.Unlock() audioMutex.Unlock()
// Disconnect outside mutex to avoid blocking during CGO calls
if outRelay != nil { if outRelay != nil {
outRelay.Stop() outRelay.Stop()
} }
@ -97,17 +94,14 @@ func stopOutputAudio() {
} }
} }
// stopInputAudio stops input audio (browser → device)
func stopInputAudio() { func stopInputAudio() {
audioMutex.Lock() audioMutex.Lock()
inRelay := inputRelay inRelay := inputRelay
inputRelay = nil inputRelay = nil
audioMutex.Unlock() audioMutex.Unlock()
// Atomically swap and disconnect outside mutex
inSource := inputSource.Swap(nil) inSource := inputSource.Swap(nil)
// Disconnect outside mutex to avoid blocking during CGO calls
if inRelay != nil { if inRelay != nil {
inRelay.Stop() inRelay.Stop()
} }
@ -140,18 +134,23 @@ func onWebRTCDisconnect() {
func setAudioTrack(audioTrack *webrtc.TrackLocalStaticSample) { func setAudioTrack(audioTrack *webrtc.TrackLocalStaticSample) {
audioMutex.Lock() audioMutex.Lock()
defer audioMutex.Unlock()
currentAudioTrack = audioTrack currentAudioTrack = audioTrack
oldRelay := outputRelay
if outputRelay != nil {
outputRelay.Stop()
outputRelay = nil outputRelay = nil
}
var newRelay *audio.OutputRelay
if outputSource != nil { if outputSource != nil {
outputRelay = audio.NewOutputRelay(outputSource, audioTrack) newRelay = audio.NewOutputRelay(outputSource, audioTrack)
if err := outputRelay.Start(); err != nil { outputRelay = newRelay
}
audioMutex.Unlock()
// Stop/start outside mutex to avoid blocking during CGO calls
if oldRelay != nil {
oldRelay.Stop()
}
if newRelay != nil {
if err := newRelay.Start(); err != nil {
audioLogger.Error().Err(err).Msg("Failed to start output relay") audioLogger.Error().Err(err).Msg("Failed to start output relay")
} }
} }

View File

@ -896,16 +896,17 @@ func updateUsbRelatedConfig(wasAudioEnabled bool) error {
audioMutex.Lock() audioMutex.Lock()
inRelay := inputRelay inRelay := inputRelay
inSource := inputSource
inputRelay = nil inputRelay = nil
inputSource = nil
audioMutex.Unlock() audioMutex.Unlock()
// Atomically swap input source
inSource := inputSource.Swap(nil)
if inRelay != nil { if inRelay != nil {
inRelay.Stop() inRelay.Stop()
} }
if inSource != nil { if inSource != nil {
inSource.Disconnect() (*inSource).Disconnect()
} }
if err := gadget.UpdateGadgetConfig(); err != nil { if err := gadget.UpdateGadgetConfig(); err != nil {