diff --git a/software/src/app.py b/software/src/app.py index cd07a37..15f486c 100644 --- a/software/src/app.py +++ b/software/src/app.py @@ -57,6 +57,7 @@ class PlayerApp: self.buttons = deps.buttons(self) if deps.buttons is not None else None self.mp3file = None self.volume_pos = 3 + self.paused = False self.player.set_volume(VOLUME_CURVE[self.volume_pos]) self._onIdle() @@ -96,6 +97,10 @@ class PlayerApp: self.player.set_volume(VOLUME_CURVE[self.volume_pos]) elif what == self.buttons.NEXT: self._play_next() + elif what == self.buttons.PREV: + self._play_prev() + elif what == self.buttons.PLAY_PAUSE: + self._pause_toggle() def onPlaybackDone(self): assert self.mp3file is not None @@ -136,6 +141,15 @@ class PlayerApp: self.playlist = None self.playing_tag = None + def _play_prev(self): + if self.playlist is None: + return + filename = self.playlist.getPrevPath() + self._play(filename) + if filename is None: + self.playlist = None + self.playing_tag = None + def _play(self, filename: bytes | None, offset=0): if self.mp3file is not None: self.player.stop() @@ -146,8 +160,19 @@ class PlayerApp: print(f'Playing {filename!r}') self.mp3file = open(filename, 'rb') self.player.play(self.mp3file, offset) + self.paused = False self._onActive() + def _pause_toggle(self): + if self.playlist is None: + return + if self.paused: + self._play(self.playlist.getCurrentPath(), self.pause_offset) + else: + self.pause_offset = self.player.stop() + self.paused = True + self._onIdle() + def _onIdle(self): self.timer_manager.schedule(time.ticks_ms() + self.idle_timeout_ms, self.onIdleTimeout) self.leds.set_state(self.leds.IDLE) diff --git a/software/src/utils/playlistdb.py b/software/src/utils/playlistdb.py index 01ecd60..a8c866c 100644 --- a/software/src/utils/playlistdb.py +++ b/software/src/utils/playlistdb.py @@ -107,6 +107,17 @@ class BTreeDB(IPlaylistDB): self.setPlaybackOffset(0) return self.getCurrentPath() + def getPrevPath(self): + """ + Select prev track and return path. + """ + if self.pos > 0: + self.pos -= 1 + if self.persist != BTreeDB.PERSIST_NO: + self.parent._setPlaylistPos(self.tag, self.pos) + self.setPlaybackOffset(0) + return self.getCurrentPath() + def setPlaybackOffset(self, offset): """ Store the current position in the track for PERSIST_OFFSET mode