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.pm.OnVolumeChange(func(vol int) {
if m.connErr == nil {
m.evt.Player.OnVolume()
}
})
emitPlayStatus := func() {
if m.connErr == nil {
m.evt.Player.OnPlayPause()
@@ -253,8 +258,8 @@ func (m *MPRISHandler) Volume() (float64, error) {
return float64(m.p.GetVolume()) / 100, nil
}
func (m *MPRISHandler) SetVolume(float64) error {
return errNotImplemented
func (m *MPRISHandler) SetVolume(v float64) error {
return m.pm.SetVolume(int(v * 100))
}
func (m *MPRISHandler) Position() (int64, error) {
+21
View File
@@ -49,6 +49,7 @@ type PlaybackManager struct {
onSongChange []func(nowPlaying, justScrobbledIfAny *mediaprovider.Track)
onPlayTimeUpdate []func(float64, float64)
onLoopModeChange []func(LoopMode)
onVolumeChange []func(int)
}
func NewPlaybackManager(
@@ -142,6 +143,11 @@ func (p *PlaybackManager) OnLoopModeChange(cb func(LoopMode)) {
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.
func (p *PlaybackManager) LoadAlbum(albumID string, appendToQueue bool, shuffle bool) error {
album, err := p.sm.Server.GetAlbum(albumID)
@@ -335,6 +341,21 @@ func (p *PlaybackManager) LoopMode() LoopMode {
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
func (p *PlaybackManager) checkScrobble() {
if !p.scrobbleCfg.Enabled || len(p.playQueue) == 0 || p.nowPlayingIdx < 0 {