Fix: Audio Output Enable / Disable

This commit is contained in:
Alex P 2025-09-09 10:39:47 +00:00
parent 0f2aa9abe4
commit 02acee0c75
2 changed files with 35 additions and 5 deletions

View File

@ -156,6 +156,15 @@ func (s *AudioOutputSupervisor) Stop() {
s.forceKillProcess("audio output server") s.forceKillProcess("audio output server")
} }
// Ensure socket file cleanup even if subprocess didn't clean up properly
// This prevents "address already in use" errors on restart
outputSocketPath := getOutputSocketPath()
if err := os.Remove(outputSocketPath); err != nil && !os.IsNotExist(err) {
s.logger.Warn().Err(err).Str("socket_path", outputSocketPath).Msg("failed to remove output socket file during supervisor stop")
} else if err == nil {
s.logger.Debug().Str("socket_path", outputSocketPath).Msg("cleaned up output socket file")
}
s.logger.Info().Str("component", AudioOutputSupervisorComponent).Msg("component stopped") s.logger.Info().Str("component", AudioOutputSupervisorComponent).Msg("component stopped")
} }

View File

@ -30,15 +30,36 @@ func StartAudioRelay(audioTrack AudioTrackWriter) error {
// Get current audio config // Get current audio config
config := GetAudioConfig() config := GetAudioConfig()
// Start the relay (audioTrack can be nil initially) // Retry starting the relay with exponential backoff
// This handles cases where the subprocess hasn't created its socket yet
maxAttempts := 5
baseDelay := 200 * time.Millisecond
maxDelay := 2 * time.Second
var lastErr error
for i := 0; i < maxAttempts; i++ {
if err := relay.Start(audioTrack, config); err != nil { if err := relay.Start(audioTrack, config); err != nil {
return err lastErr = err
if i < maxAttempts-1 {
// Calculate exponential backoff delay
delay := time.Duration(float64(baseDelay) * (1.5 * float64(i+1)))
if delay > maxDelay {
delay = maxDelay
}
time.Sleep(delay)
continue
}
return fmt.Errorf("failed to start audio relay after %d attempts: %w", maxAttempts, lastErr)
} }
// Success
globalRelay = relay globalRelay = relay
return nil return nil
} }
return fmt.Errorf("failed to start audio relay after %d attempts: %w", maxAttempts, lastErr)
}
// StopAudioRelay stops the audio relay system // StopAudioRelay stops the audio relay system
func StopAudioRelay() { func StopAudioRelay() {
relayMutex.Lock() relayMutex.Lock()