shutdown proxy server when switching back to local; debounce vol slider

This commit is contained in:
Drew Weymouth
2025-03-29 15:15:13 -07:00
parent 5a37b1e39f
commit e5c8027a82
5 changed files with 35 additions and 0 deletions
+4
View File
@@ -9,6 +9,7 @@ import (
"github.com/dweymouth/supersonic/backend/mediaprovider"
"github.com/dweymouth/supersonic/backend/player"
"github.com/dweymouth/supersonic/backend/player/mpv"
"github.com/dweymouth/supersonic/backend/util"
"github.com/dweymouth/supersonic/sharedutil"
)
@@ -154,6 +155,9 @@ func (p *playbackEngine) SetPlayer(pl player.BasePlayer) {
}
oldVol := p.player.GetVolume()
if _, isMPV := p.player.(*mpv.Player); !isMPV {
p.player.Destroy()
}
p.player = pl
p.registerPlayerCallbacks(pl)
+6
View File
@@ -197,6 +197,12 @@ func (d *DLNAPlayer) GetStatus() player.Status {
}
}
func (d *DLNAPlayer) Destroy() {
if d.proxyServer != nil {
go d.proxyServer.Shutdown(context.Background())
}
}
func getLocalIP() (string, error) {
interfaces, err := net.Interfaces()
if err != nil {
+2
View File
@@ -140,6 +140,8 @@ func (j *JukeboxPlayer) GetStatus() player.Status {
}
}
func (j *JukeboxPlayer) Destroy() {}
func (j *JukeboxPlayer) startAndUpdateTime() error {
beforeStart := time.Now()
if err := j.provider.JukeboxStart(); err != nil {
+2
View File
@@ -27,6 +27,8 @@ type BasePlayer interface {
GetStatus() Status
Destroy()
// Event API
OnPaused(func())
OnStopped(func())
+21
View File
@@ -2,6 +2,7 @@ package widgets
import (
"math"
"time"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
@@ -163,6 +164,10 @@ type VolumeControl struct {
muted bool
lastVol int
setVolDebouncer func()
delaySetVolume bool
pendingVolume int
container *fyne.Container
}
@@ -178,6 +183,15 @@ func NewVolumeControl(initialVol int) *VolumeControl {
v.slider.Orientation = widget.Horizontal
v.slider.Value = float64(v.lastVol)
v.slider.OnChanged = v.onChanged
// for players that are slow to respond to volume changes
// (e.g. DLNA), delay responding to the SetVolume call
// to avoid hiccuping from callback "echoes"
v.setVolDebouncer = util.NewDebouncer(100*time.Millisecond, func() {
v.delaySetVolume = false
v.SetVolume(v.pendingVolume)
})
v.container = container.NewHBox(container.NewCenter(v.icon), v.slider)
return v
}
@@ -185,6 +199,11 @@ func NewVolumeControl(initialVol int) *VolumeControl {
// Sets the volume that is displayed in the slider.
// Does not invoke OnSetVolume callback.
func (v *VolumeControl) SetVolume(vol int) {
if v.delaySetVolume {
v.pendingVolume = vol
return
}
if (vol == v.lastVol && !v.muted) || (v.muted && vol == 0) {
return
}
@@ -195,6 +214,8 @@ func (v *VolumeControl) SetVolume(vol int) {
func (v *VolumeControl) onChanged(volume float64) {
vol := int(volume)
v.delaySetVolume = true
v.setVolDebouncer()
v.lastVol = vol
v.muted = false
v.updateIconForVolume(vol)