diff --git a/internal/audio/monitor.go b/internal/audio/monitor.go new file mode 100644 index 0000000..4374a9b --- /dev/null +++ b/internal/audio/monitor.go @@ -0,0 +1,58 @@ +package audio + +import ( + "log" + + "mrogalski.eu/go/pulseaudio" + + "codeberg.org/tomkoid/audstopper/internal/config" +) + +func AudioMonitor(c *pulseaudio.Client, config *config.Config) { + outputs, activeIndex, err := c.Outputs() + if err != nil { + c.Close() + log.Fatal(err) + } + + // Get the default sink (audio source) + var defaultSink pulseaudio.Output = outputs[activeIndex] + + var initialSinkName string = defaultSink.CardID + + updateChan, err := c.Updates() + if err != nil { + c.Close() + log.Fatal(err) + } + + log.Println("Starting audio monitoring.") + + // Monitor the default sink for changes + for { + <-updateChan + + // Get the new default sink + outputs, activeIndex, err := c.Outputs() + if err != nil { + c.Close() + log.Fatal(err) + } + + defaultSink = outputs[activeIndex] + + // Check if the sink name has changed + if defaultSink.CardID != initialSinkName { + log.Printf( + "Audio source changed from %s to %s\n", + initialSinkName, + defaultSink.CardID, + ) + + // stop audio if mpc or playerctl is running + stopAudio(config) + + initialSinkName = defaultSink.CardID + } + } +} diff --git a/internal/audio/stop.go b/internal/audio/stop.go index 81bac17..20a6195 100644 --- a/internal/audio/stop.go +++ b/internal/audio/stop.go @@ -8,7 +8,7 @@ import ( "codeberg.org/tomkoid/audstopper/internal/tools" ) -func StopAudio(config *config.Config) { +func stopAudio(config *config.Config) { log.Println("Stopping audio.") // if mpc binary exists on system if _, err := exec.LookPath("mpc"); err == nil && config.Mpc { diff --git a/main.go b/main.go index b73d3e6..af4bc91 100644 --- a/main.go +++ b/main.go @@ -22,49 +22,8 @@ func main() { // Handle program termination go tools.HandleCleanup(c) - defer c.Close() - - outputs, activeIndex, err := c.Outputs() - if err != nil { - log.Fatal(err) - } + // Start audio monitoring + audio.AudioMonitor(c, &config) - // Get the default sink (audio source) - var defaultSink pulseaudio.Output = outputs[activeIndex] - - var initialSinkName string = defaultSink.CardID - - updateChan, err := c.Updates() - if err != nil { - log.Fatal(err) - } - - log.Println("Starting audio monitoring.") - - // Monitor the default sink for changes - for { - <-updateChan - - // Get the new default sink - outputs, activeIndex, err := c.Outputs() - if err != nil { - log.Fatal(err) - } - - defaultSink = outputs[activeIndex] - - // Check if the sink name has changed - if defaultSink.CardID != initialSinkName { - log.Printf( - "Audio source changed from %s to %s\n", - initialSinkName, - defaultSink.CardID, - ) - - // stop audio if mpc or playerctl is running - audio.StopAudio(&config) - - initialSinkName = defaultSink.CardID - } - } + defer c.Close() }