diff --git a/software/src/app.py b/software/src/app.py index 8f848bc..3b42619 100644 --- a/software/src/app.py +++ b/software/src/app.py @@ -48,7 +48,10 @@ class PlayerApp: if self.current_tag is not None: print('Tag gone, stopping playback') self.current_tag = None - self.player.stop() + if self.playlist is not None: + pos = self.player.stop() + if pos is not None: + self.playlist.setPlaybackOffset(pos) def onButtonPressed(self, what): assert self.buttons is not None @@ -69,7 +72,8 @@ class PlayerApp: def _set_playlist(self, tag: bytes): self.playlist = self.playlist_db.getPlaylistForTag(tag) - self._play(self.playlist.getCurrentPath() if self.playlist is not None else None) + self._play(self.playlist.getCurrentPath() if self.playlist is not None else None, + self.playlist.getPlaybackOffset() if self.playlist is not None else 0) def _play_next(self): if self.playlist is None: @@ -79,7 +83,7 @@ class PlayerApp: if filename is None: self.playlist = None - def _play(self, filename: bytes | None): + def _play(self, filename: bytes | None, offset=0): if self.mp3file is not None: self.player.stop() self.mp3file.close() @@ -87,4 +91,4 @@ class PlayerApp: if filename is not None: print(f'Playing {filename!r}') self.mp3file = open(filename, 'rb') - self.player.play(self.mp3file) + self.player.play(self.mp3file, offset) diff --git a/software/src/mp3player.py b/software/src/mp3player.py index 7f17d90..f62e156 100644 --- a/software/src/mp3player.py +++ b/software/src/mp3player.py @@ -21,14 +21,19 @@ class MP3Player: self.mp3task = None self.volume = 128 self.cb = cb + self.pos = 0 - def play(self, stream): + def play(self, stream, offset=0): """ Play from byte stream. + If offset > 0, discard the first offset bytes """ if self.mp3task is not None: self.mp3task.cancel() self.mp3task = None + if offset > 0: + stream.seek(offset, 1) + self.pos = offset self.mp3task = asyncio.create_task(self._play_task(stream)) def stop(self): @@ -38,6 +43,8 @@ class MP3Player: if self.mp3task is not None: self.mp3task.cancel() self.mp3task = None + return self.pos + return None def set_volume(self, volume: int): """ @@ -60,6 +67,7 @@ class MP3Player: # End of file break _, _, underruns = await self.audiocore.async_put(data[:bytes_read]) + self.pos += bytes_read if underruns > known_underruns: print(f"{underruns:x}") known_underruns = underruns diff --git a/software/tests/test_playerapp.py b/software/tests/test_playerapp.py index 7859b53..ecacf35 100644 --- a/software/tests/test_playerapp.py +++ b/software/tests/test_playerapp.py @@ -35,7 +35,7 @@ class FakeMp3Player: def set_volume(self, vol: int): self.volume = vol - def play(self, track: FakeFile): + def play(self, track: FakeFile, offset: int): self.track = track @@ -67,6 +67,9 @@ class FakePlaylistDb: return None return self.parent.tracklist[self.pos] + def getPlaybackOffset(self): + return 0 + def __init__(self, tracklist=[b'test/path.mp3']): self.tracklist = tracklist