summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2022-10-30 23:46:36 +0000
committerAidan MacDonald <amachronic@protonmail.com>2022-11-01 09:52:34 -0400
commit26ffcd8f9fca77ee0983eb673e37c15738f1f592 (patch)
tree25075482c6e489f7b16769f6d019b4ee1304dbcc
parent0d303567344ef36c804d0377ae9c43a869a94557 (diff)
downloadrockbox-26ffcd8f9f.tar.gz
rockbox-26ffcd8f9f.zip
playback: Fix track resume from file offset
Resuming a track with "Resume Playback" or a bookmark is supposed to pass both the file offset and elapsed time to the codec. Since commit dfff938dff08 the offset has been getting zeroed because the buffer handle wasn't open at the time of the buf_filesize() call, causing it to return a negative error code. Having a valid offset improves resume accuracy with some codecs, like VBR MP3. Change-Id: I8af7f001644f1ee1bd27ca3049a4cff2d2274149
-rw-r--r--apps/playback.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/apps/playback.c b/apps/playback.c
index 9b67f2ccc7..c425e14baf 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -2097,23 +2097,11 @@ static int audio_finish_load_track(struct track_info *infop)
/** Finally, load the audio **/
off_t file_offset = 0;
- if (track_id3->elapsed > track_id3->length)
- track_id3->elapsed = 0;
-
- if ((off_t)track_id3->offset >= buf_filesize(infop->audio_hid))
- track_id3->offset = 0;
-
- logf("%s: set offset for %s to %lu\n", __func__,
- track_id3->title, track_id3->offset);
-
/* Adjust for resume rewind so we know what to buffer - starting the codec
calls it again, so we don't save it (and they shouldn't accumulate) */
unsigned long elapsed, offset;
resume_rewind_adjust_progress(track_id3, &elapsed, &offset);
- logf("%s: Set resume for %s to %lu %lu", __func__,
- track_id3->title, elapsed, offset);
-
enum data_type audiotype = rbcodec_format_is_atomic(track_id3->codectype) ?
TYPE_ATOMIC_AUDIO : TYPE_PACKET_AUDIO;
@@ -2145,6 +2133,19 @@ static int audio_finish_load_track(struct track_info *infop)
if (hid >= 0)
{
infop->audio_hid = hid;
+
+ /*
+ * Fix up elapsed time and offset if past the end
+ */
+ if (track_id3->elapsed > track_id3->length)
+ track_id3->elapsed = 0;
+
+ if ((off_t)track_id3->offset >= buf_filesize(infop->audio_hid))
+ track_id3->offset = 0;
+
+ logf("%s: set resume for %s to %lu %lX", __func__,
+ track_id3->title, track_id3->elapsed, track_id3->offset);
+
if (infop->self_hid == cur_info.self_hid)
{
/* This is the current track to decode - should be started now */