mirror of https://github.com/jetkvm/kvm.git
Enhancement: Make the code more DRY
This commit is contained in:
parent
f51c372183
commit
50c6d0d0b0
29
audio.go
29
audio.go
|
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue