app, mp3player: Hook up playlists 'offset' persist mode

Signed-off-by: Matthias Blankertz <matthias@blankertz.org>
This commit is contained in:
2025-09-07 00:18:14 +02:00
parent 5013e2359d
commit 7e532ec641
3 changed files with 21 additions and 6 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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