From 26ffcd8f9fca77ee0983eb673e37c15738f1f592 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Sun, 30 Oct 2022 23:46:36 +0000 Subject: 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 --- apps/playback.c | 25 +++++++++++++------------ 1 file 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 */ -- cgit v1.2.3