From 432303e22830fed4b9a7e7344ec0162c654db6c7 Mon Sep 17 00:00:00 2001 From: Alex P Date: Sat, 20 Sep 2025 00:21:09 +0300 Subject: [PATCH] [WIP] Cleanup: PR Cleanup --- audio_handlers.go | 64 ++++++++++++++++-------------------- cmd/main.go | 4 +-- internal/audio/audio_mute.go | 37 ++++++++++----------- 3 files changed, 49 insertions(+), 56 deletions(-) diff --git a/audio_handlers.go b/audio_handlers.go index 4f743e34..b39fe087 100644 --- a/audio_handlers.go +++ b/audio_handlers.go @@ -13,7 +13,7 @@ import ( var audioControlService *audio.AudioControlService -func initAudioControlService() { +func ensureAudioControlService() *audio.AudioControlService { if audioControlService == nil { sessionProvider := &SessionProviderImpl{} audioControlService = audio.NewAudioControlService(sessionProvider, logger) @@ -31,50 +31,44 @@ func initAudioControlService() { return nil }) } + return audioControlService } // --- Global Convenience Functions for Audio Control --- -// StopAudioOutputAndRemoveTracks is a global helper to stop audio output subprocess and remove WebRTC tracks -func StopAudioOutputAndRemoveTracks() error { - initAudioControlService() - return audioControlService.MuteAudio(true) +// MuteAudioOutput is a global helper to mute audio output +func MuteAudioOutput() error { + return ensureAudioControlService().MuteAudio(true) } -// StartAudioOutputAndAddTracks is a global helper to start audio output subprocess and add WebRTC tracks -func StartAudioOutputAndAddTracks() error { - initAudioControlService() - return audioControlService.MuteAudio(false) +// UnmuteAudioOutput is a global helper to unmute audio output +func UnmuteAudioOutput() error { + return ensureAudioControlService().MuteAudio(false) } -// StopMicrophoneAndRemoveTracks is a global helper to stop microphone subprocess and remove WebRTC tracks -func StopMicrophoneAndRemoveTracks() error { - initAudioControlService() - return audioControlService.StopMicrophone() +// StopMicrophone is a global helper to stop microphone subprocess +func StopMicrophone() error { + return ensureAudioControlService().StopMicrophone() } -// StartMicrophoneAndAddTracks is a global helper to start microphone subprocess and add WebRTC tracks -func StartMicrophoneAndAddTracks() error { - initAudioControlService() - return audioControlService.StartMicrophone() +// StartMicrophone is a global helper to start microphone subprocess +func StartMicrophone() error { + return ensureAudioControlService().StartMicrophone() } // IsAudioOutputActive is a global helper to check if audio output subprocess is running func IsAudioOutputActive() bool { - initAudioControlService() - return audioControlService.IsAudioOutputActive() + return ensureAudioControlService().IsAudioOutputActive() } // IsMicrophoneActive is a global helper to check if microphone subprocess is running func IsMicrophoneActive() bool { - initAudioControlService() - return audioControlService.IsMicrophoneActive() + return ensureAudioControlService().IsMicrophoneActive() } // ResetMicrophone is a global helper to reset the microphone func ResetMicrophone() error { - initAudioControlService() - return audioControlService.ResetMicrophone() + return ensureAudioControlService().ResetMicrophone() } // GetCurrentSessionAudioTrack returns the current session's audio track for audio relay @@ -118,20 +112,20 @@ func ReplaceCurrentSessionAudioTrack(newTrack *webrtc.TrackLocalStaticSample) er // SetAudioQuality is a global helper to set audio output quality func SetAudioQuality(quality audio.AudioQuality) error { - initAudioControlService() + ensureAudioControlService() audioControlService.SetAudioQuality(quality) return nil } // GetAudioQualityPresets is a global helper to get available audio quality presets func GetAudioQualityPresets() map[audio.AudioQuality]audio.AudioConfig { - initAudioControlService() + ensureAudioControlService() return audioControlService.GetAudioQualityPresets() } // GetCurrentAudioQuality is a global helper to get current audio quality configuration func GetCurrentAudioQuality() audio.AudioConfig { - initAudioControlService() + ensureAudioControlService() return audioControlService.GetCurrentAudioQuality() } @@ -148,9 +142,9 @@ func handleAudioMute(c *gin.Context) { var err error if req.Muted { - err = StopAudioOutputAndRemoveTracks() + err = MuteAudioOutput() } else { - err = StartAudioOutputAndAddTracks() + err = UnmuteAudioOutput() } if err != nil { @@ -166,7 +160,7 @@ func handleAudioMute(c *gin.Context) { // handleMicrophoneStart handles POST /microphone/start requests func handleMicrophoneStart(c *gin.Context) { - err := StartMicrophoneAndAddTracks() + err := StartMicrophone() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return @@ -177,7 +171,7 @@ func handleMicrophoneStart(c *gin.Context) { // handleMicrophoneStop handles POST /microphone/stop requests func handleMicrophoneStop(c *gin.Context) { - err := StopMicrophoneAndRemoveTracks() + err := StopMicrophone() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return @@ -199,9 +193,9 @@ func handleMicrophoneMute(c *gin.Context) { var err error if req.Muted { - err = StopMicrophoneAndRemoveTracks() + err = StopMicrophone() } else { - err = StartMicrophoneAndAddTracks() + err = StartMicrophone() } if err != nil { @@ -225,19 +219,19 @@ func handleMicrophoneReset(c *gin.Context) { // handleSubscribeAudioEvents handles WebSocket audio event subscription func handleSubscribeAudioEvents(connectionID string, wsCon *websocket.Conn, runCtx context.Context, l *zerolog.Logger) { - initAudioControlService() + ensureAudioControlService() audioControlService.SubscribeToAudioEvents(connectionID, wsCon, runCtx, l) } // handleUnsubscribeAudioEvents handles WebSocket audio event unsubscription func handleUnsubscribeAudioEvents(connectionID string, l *zerolog.Logger) { - initAudioControlService() + ensureAudioControlService() audioControlService.UnsubscribeFromAudioEvents(connectionID, l) } // handleAudioStatus handles GET requests for audio status func handleAudioStatus(c *gin.Context) { - initAudioControlService() + ensureAudioControlService() status := audioControlService.GetAudioStatus() c.JSON(200, status) diff --git a/cmd/main.go b/cmd/main.go index 3308bcc6..0981f875 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -11,7 +11,7 @@ import ( func main() { versionPtr := flag.Bool("version", false, "print version and exit") versionJsonPtr := flag.Bool("version-json", false, "print version as json and exit") - audioServerPtr := flag.Bool("audio-output-server", false, "Run as audio server subprocess") + audioOutputServerPtr := flag.Bool("audio-output-server", false, "Run as audio server subprocess") audioInputServerPtr := flag.Bool("audio-input-server", false, "Run as audio input server subprocess") flag.Parse() @@ -26,5 +26,5 @@ func main() { return } - kvm.Main(*audioServerPtr, *audioInputServerPtr) + kvm.Main(*audioOutputServerPtr, *audioInputServerPtr) } diff --git a/internal/audio/audio_mute.go b/internal/audio/audio_mute.go index 9239f627..d1382ee8 100644 --- a/internal/audio/audio_mute.go +++ b/internal/audio/audio_mute.go @@ -4,36 +4,35 @@ import ( "sync" ) -var audioMuteState struct { - muted bool - mu sync.RWMutex +// AudioState holds all audio-related state with a single mutex +type AudioState struct { + mu sync.RWMutex + audioMuted bool + microphoneMuted bool } -var microphoneMuteState struct { - muted bool - mu sync.RWMutex -} +var globalAudioState = &AudioState{} func SetAudioMuted(muted bool) { - audioMuteState.mu.Lock() - defer audioMuteState.mu.Unlock() - audioMuteState.muted = muted + globalAudioState.mu.Lock() + defer globalAudioState.mu.Unlock() + globalAudioState.audioMuted = muted } func IsAudioMuted() bool { - audioMuteState.mu.RLock() - defer audioMuteState.mu.RUnlock() - return audioMuteState.muted + globalAudioState.mu.RLock() + defer globalAudioState.mu.RUnlock() + return globalAudioState.audioMuted } func SetMicrophoneMuted(muted bool) { - microphoneMuteState.mu.Lock() - defer microphoneMuteState.mu.Unlock() - microphoneMuteState.muted = muted + globalAudioState.mu.Lock() + defer globalAudioState.mu.Unlock() + globalAudioState.microphoneMuted = muted } func IsMicrophoneMuted() bool { - microphoneMuteState.mu.RLock() - defer microphoneMuteState.mu.RUnlock() - return microphoneMuteState.muted + globalAudioState.mu.RLock() + defer globalAudioState.mu.RUnlock() + return globalAudioState.microphoneMuted }