diff options
author | xengineering <me@xengineering.eu> | 2024-12-08 19:56:52 +0100 |
---|---|---|
committer | xengineering <me@xengineering.eu> | 2024-12-15 13:00:13 +0100 |
commit | 04ed13ca73442d90a15d1b0b3816ed5ee8f130d8 (patch) | |
tree | 401bd5adfc53b43c96b66dd5c483bf3b351a17e8 | |
parent | 9fe390db8e63603a7bfb2e0c7cd77386cc6247ff (diff) | |
download | soundbox-app-04ed13ca73442d90a15d1b0b3816ed5ee8f130d8.tar soundbox-app-04ed13ca73442d90a15d1b0b3816ed5ee8f130d8.tar.zst soundbox-app-04ed13ca73442d90a15d1b0b3816ed5ee8f130d8.zip |
Add experimental streaming with PipeWire
This allows to stream sound from a Linux PC with PipeWire sound system
to soundboxes.
Currently PipeWire capture nodes are used. They should be connected to
the monitor output of the default sound sink manually.
-rw-r--r-- | main.go | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -42,7 +42,7 @@ type State struct { Theme *material.Theme IsPlaying bool Title string - UrlSelector widget.Enum + SourceSelector widget.Enum PlayPauseButton widget.Clickable PlayerContext context.Context PlayerCancel context.CancelFunc @@ -105,7 +105,7 @@ func (ui *Ui) HandleInputs(gtx layout.Context) { if ui.State.IsPlaying { ui.State.PlayerCancel() } else { - if ui.State.UrlSelector.Value == "" { + if ui.State.SourceSelector.Value == "" { log.Println("A URL has to be selected.") } else { ui.State.PlayerContext, ui.State.PlayerCancel = context.WithCancel(context.Background()) @@ -115,7 +115,7 @@ func (ui *Ui) HandleInputs(gtx layout.Context) { targets = append(targets, net.HardwareAddr(entry.Mac)) } } - go play(ui.State.PlayerContext, ui.State.UrlSelector.Value, targets, ui) + go play(ui.State.PlayerContext, ui.State.SourceSelector.Value, targets, ui) } } } @@ -149,9 +149,12 @@ func (ui *Ui) Layout(gtx layout.Context) layout.Dimensions { layout.Rigid(layout.Spacer{Height: unit.Dp(25)}.Layout), } + entries = append(entries, layout.Rigid(material.RadioButton( + ui.State.Theme, &ui.State.SourceSelector, + "PipeWire", "This device (experimental)").Layout)) for _, url := range ui.State.Config.URLs { entries = append(entries, layout.Rigid(material.RadioButton( - ui.State.Theme, &ui.State.UrlSelector, + ui.State.Theme, &ui.State.SourceSelector, url.Url, url.Name).Layout)) } @@ -174,7 +177,12 @@ func play(ctx context.Context, url string, targets []net.HardwareAddr, ui *Ui) { setPlayingState(true) defer setPlayingState(false) - err := soundbox.StreamURLContext(ctx, url, targets) + var err error + if url == "PipeWire" { + err = soundbox.StreamPipewireContext(ctx, targets) + } else { + err = soundbox.StreamURLContext(ctx, url, targets) + } if err != nil { log.Println(err) } |