implement MPRIS SetVolume

This commit is contained in:
Drew Weymouth
2023-07-13 14:41:11 -07:00
parent a12b6dd276
commit e754b40a09
5 changed files with 59 additions and 20 deletions
+7 -2
View File
@@ -59,6 +59,11 @@ func NewMPRISHandler(playerName string, p *player.Player, pm *PlaybackManager) *
m.evt.Player.OnTitle() m.evt.Player.OnTitle()
} }
}) })
m.pm.OnVolumeChange(func(vol int) {
if m.connErr == nil {
m.evt.Player.OnVolume()
}
})
emitPlayStatus := func() { emitPlayStatus := func() {
if m.connErr == nil { if m.connErr == nil {
m.evt.Player.OnPlayPause() m.evt.Player.OnPlayPause()
@@ -253,8 +258,8 @@ func (m *MPRISHandler) Volume() (float64, error) {
return float64(m.p.GetVolume()) / 100, nil return float64(m.p.GetVolume()) / 100, nil
} }
func (m *MPRISHandler) SetVolume(float64) error { func (m *MPRISHandler) SetVolume(v float64) error {
return errNotImplemented return m.pm.SetVolume(int(v * 100))
} }
func (m *MPRISHandler) Position() (int64, error) { func (m *MPRISHandler) Position() (int64, error) {
+21
View File
@@ -49,6 +49,7 @@ type PlaybackManager struct {
onSongChange []func(nowPlaying, justScrobbledIfAny *mediaprovider.Track) onSongChange []func(nowPlaying, justScrobbledIfAny *mediaprovider.Track)
onPlayTimeUpdate []func(float64, float64) onPlayTimeUpdate []func(float64, float64)
onLoopModeChange []func(LoopMode) onLoopModeChange []func(LoopMode)
onVolumeChange []func(int)
} }
func NewPlaybackManager( func NewPlaybackManager(
@@ -142,6 +143,11 @@ func (p *PlaybackManager) OnLoopModeChange(cb func(LoopMode)) {
p.onLoopModeChange = append(p.onLoopModeChange, cb) p.onLoopModeChange = append(p.onLoopModeChange, cb)
} }
// Registers a callback that is notified whenever the volume changes.
func (p *PlaybackManager) OnVolumeChange(cb func(int)) {
p.onVolumeChange = append(p.onVolumeChange, cb)
}
// Loads the specified album into the play queue. // Loads the specified album into the play queue.
func (p *PlaybackManager) LoadAlbum(albumID string, appendToQueue bool, shuffle bool) error { func (p *PlaybackManager) LoadAlbum(albumID string, appendToQueue bool, shuffle bool) error {
album, err := p.sm.Server.GetAlbum(albumID) album, err := p.sm.Server.GetAlbum(albumID)
@@ -335,6 +341,21 @@ func (p *PlaybackManager) LoopMode() LoopMode {
return LoopMode(p.player.GetLoopMode()) return LoopMode(p.player.GetLoopMode())
} }
func (p *PlaybackManager) SetVolume(vol int) error {
vol = clamp(vol, 0, 100)
if err := p.player.SetVolume(vol); err != nil {
return err
}
for _, cb := range p.onVolumeChange {
cb(vol)
}
return nil
}
func (p *PlaybackManager) Volume() int {
return p.player.GetVolume()
}
// call BEFORE updating p.nowPlayingIdx // call BEFORE updating p.nowPlayingIdx
func (p *PlaybackManager) checkScrobble() { func (p *PlaybackManager) checkScrobble() {
if !p.scrobbleCfg.Enabled || len(p.playQueue) == 0 || p.nowPlayingIdx < 0 { if !p.scrobbleCfg.Enabled || len(p.playQueue) == 0 || p.nowPlayingIdx < 0 {
+4 -5
View File
@@ -54,9 +54,7 @@ func NewBottomPanel(p *player.Player, pm *backend.PlaybackManager, contr *contro
p.OnStopped(func() { p.OnStopped(func() {
bp.Controls.SetPlaying(false) bp.Controls.SetPlaying(false)
}) })
pm.OnLoopModeChange(func(mode backend.LoopMode) { pm.OnLoopModeChange(bp.AuxControls.SetLoopMode)
bp.AuxControls.SetLoopMode(mode)
})
bp.NowPlaying = widgets.NewNowPlayingCard() bp.NowPlaying = widgets.NewNowPlayingCard()
bp.NowPlaying.OnShowCoverImage = func() { bp.NowPlaying.OnShowCoverImage = func() {
@@ -100,8 +98,9 @@ func NewBottomPanel(p *player.Player, pm *backend.PlaybackManager, contr *contro
}) })
bp.AuxControls = widgets.NewAuxControls(p.GetVolume()) bp.AuxControls = widgets.NewAuxControls(p.GetVolume())
bp.AuxControls.VolumeControl.OnVolumeChanged = func(v int) { pm.OnVolumeChange(bp.AuxControls.VolumeControl.SetVolume)
_ = p.SetVolume(v) bp.AuxControls.VolumeControl.OnSetVolume = func(v int) {
_ = bp.playbackManager.SetVolume(v)
} }
bp.AuxControls.OnChangeLoopMode(func() { bp.AuxControls.OnChangeLoopMode(func() {
bp.playbackManager.SetNextLoopMode() bp.playbackManager.SetNextLoopMode()
+4 -4
View File
@@ -163,15 +163,15 @@ func (m *MainWindow) SetupSystemTrayMenu(appName string, fyneApp fyne.App) {
}), }),
fyne.NewMenuItemSeparator(), fyne.NewMenuItemSeparator(),
fyne.NewMenuItem("Volume +10%", func() { fyne.NewMenuItem("Volume +10%", func() {
vol := m.App.Player.GetVolume() vol := m.App.PlaybackManager.Volume()
vol = vol + int(float64(vol)*0.1) vol = vol + int(float64(vol)*0.1)
// will clamp to range for us // will clamp to range for us
m.BottomPanel.AuxControls.VolumeControl.SetVolume(vol) m.App.PlaybackManager.SetVolume(vol)
}), }),
fyne.NewMenuItem("Volume -10%", func() { fyne.NewMenuItem("Volume -10%", func() {
vol := m.App.Player.GetVolume() vol := m.App.PlaybackManager.Volume()
vol = vol - int(float64(vol)*0.1) vol = vol - int(float64(vol)*0.1)
m.BottomPanel.AuxControls.VolumeControl.SetVolume(vol) m.App.PlaybackManager.SetVolume(vol)
}), }),
fyne.NewMenuItemSeparator(), fyne.NewMenuItemSeparator(),
fyne.NewMenuItem("Show", m.Window.Show), fyne.NewMenuItem("Show", m.Window.Show),
+23 -9
View File
@@ -162,7 +162,7 @@ type VolumeControl struct {
icon *TappableIcon icon *TappableIcon
slider *volumeSlider slider *volumeSlider
OnVolumeChanged func(int) OnSetVolume func(int)
muted bool muted bool
lastVol int lastVol int
@@ -185,24 +185,35 @@ func NewVolumeControl(initialVol int) *VolumeControl {
return v return v
} }
// Sets the volume that is displayed in the slider.
// Does not invoke OnSetVolume callback.
func (v *VolumeControl) SetVolume(vol int) {
if (vol == v.lastVol && !v.muted) || (v.muted && vol == 0) {
return
}
v.lastVol = vol
v.muted = false
v.setDisplayedVolume(vol)
}
func (v *VolumeControl) onChanged(volume float64) { func (v *VolumeControl) onChanged(volume float64) {
vol := int(volume) vol := int(volume)
v.lastVol = vol v.lastVol = vol
v.muted = false v.muted = false
v.updateIconForVolume(vol) v.updateIconForVolume(vol)
if v.OnVolumeChanged != nil { v.invokeOnVolumeChange(vol)
v.OnVolumeChanged(vol)
}
} }
func (v *VolumeControl) toggleMute() { func (v *VolumeControl) toggleMute() {
if !v.muted { if !v.muted {
v.muted = true v.muted = true
v.lastVol = int(v.slider.Value) v.lastVol = int(v.slider.Value)
v.SetVolume(0) v.setDisplayedVolume(0)
v.invokeOnVolumeChange(0)
} else { } else {
v.muted = false v.muted = false
v.SetVolume(v.lastVol) v.setDisplayedVolume(v.lastVol)
v.invokeOnVolumeChange(v.lastVol)
} }
} }
@@ -211,12 +222,15 @@ func (v *VolumeControl) CreateRenderer() fyne.WidgetRenderer {
return widget.NewSimpleRenderer(v.container) return widget.NewSimpleRenderer(v.container)
} }
func (v *VolumeControl) SetVolume(vol int) { func (v *VolumeControl) setDisplayedVolume(vol int) {
v.slider.Value = float64(vol) v.slider.Value = float64(vol)
v.slider.Refresh() v.slider.Refresh()
v.updateIconForVolume(vol) v.updateIconForVolume(vol)
if v.OnVolumeChanged != nil { }
v.OnVolumeChanged(vol)
func (v *VolumeControl) invokeOnVolumeChange(vol int) {
if v.OnSetVolume != nil {
v.OnSetVolume(vol)
} }
} }