summaryrefslogtreecommitdiff
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-26ffcd8f9fca77ee0983eb673e37c15738f1f592.tar.gz
rockbox-26ffcd8f9fca77ee0983eb673e37c15738f1f592.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)
2097 /** Finally, load the audio **/ 2097 /** Finally, load the audio **/
2098 off_t file_offset = 0; 2098 off_t file_offset = 0;
2099 2099
2100 if (track_id3->elapsed > track_id3->length)
2101 track_id3->elapsed = 0;
2102
2103 if ((off_t)track_id3->offset >= buf_filesize(infop->audio_hid))
2104 track_id3->offset = 0;
2105
2106 logf("%s: set offset for %s to %lu\n", __func__,
2107 track_id3->title, track_id3->offset);
2108
2109 /* Adjust for resume rewind so we know what to buffer - starting the codec 2100 /* Adjust for resume rewind so we know what to buffer - starting the codec
2110 calls it again, so we don't save it (and they shouldn't accumulate) */ 2101 calls it again, so we don't save it (and they shouldn't accumulate) */
2111 unsigned long elapsed, offset; 2102 unsigned long elapsed, offset;
2112 resume_rewind_adjust_progress(track_id3, &elapsed, &offset); 2103 resume_rewind_adjust_progress(track_id3, &elapsed, &offset);
2113 2104
2114 logf("%s: Set resume for %s to %lu %lu", __func__,
2115 track_id3->title, elapsed, offset);
2116
2117 enum data_type audiotype = rbcodec_format_is_atomic(track_id3->codectype) ? 2105 enum data_type audiotype = rbcodec_format_is_atomic(track_id3->codectype) ?
2118 TYPE_ATOMIC_AUDIO : TYPE_PACKET_AUDIO; 2106 TYPE_ATOMIC_AUDIO : TYPE_PACKET_AUDIO;
2119 2107
@@ -2145,6 +2133,19 @@ static int audio_finish_load_track(struct track_info *infop)
2145 if (hid >= 0) 2133 if (hid >= 0)
2146 { 2134 {
2147 infop->audio_hid = hid; 2135 infop->audio_hid = hid;
2136
2137 /*
2138 * Fix up elapsed time and offset if past the end
2139 */
2140 if (track_id3->elapsed > track_id3->length)
2141 track_id3->elapsed = 0;
2142
2143 if ((off_t)track_id3->offset >= buf_filesize(infop->audio_hid))
2144 track_id3->offset = 0;
2145
2146 logf("%s: set resume for %s to %lu %lX", __func__,
2147 track_id3->title, track_id3->elapsed, track_id3->offset);
2148
2148 if (infop->self_hid == cur_info.self_hid) 2149 if (infop->self_hid == cur_info.self_hid)
2149 { 2150 {
2150 /* This is the current track to decode - should be started now */ 2151 /* This is the current track to decode - should be started now */