implement MPRIS SetVolume
This commit is contained in:
+7
-2
@@ -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) {
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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),
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user