summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/au.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/au.c')
-rw-r--r--lib/rbcodec/codecs/au.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/rbcodec/codecs/au.c b/lib/rbcodec/codecs/au.c
index 7ae7fe3e94..18d4296125 100644
--- a/lib/rbcodec/codecs/au.c
+++ b/lib/rbcodec/codecs/au.c
@@ -139,6 +139,7 @@ enum codec_status codec_run(void)
139 codec_set_replaygain(ci->id3); 139 codec_set_replaygain(ci->id3);
140 140
141 /* Need to save offset for later use (cleared indirectly by advance_buffer) */ 141 /* Need to save offset for later use (cleared indirectly by advance_buffer) */
142 param = ci->id3->elapsed;
142 bytesdone = ci->id3->offset; 143 bytesdone = ci->id3->offset;
143 144
144 ci->memset(&format, 0, sizeof(struct pcm_format)); 145 ci->memset(&format, 0, sizeof(struct pcm_format));
@@ -236,10 +237,20 @@ enum codec_status codec_run(void)
236 } 237 }
237 238
238 /* make sure we're at the correct offset */ 239 /* make sure we're at the correct offset */
239 if (bytesdone > (uint32_t) firstblockposn) { 240 if (bytesdone > (uint32_t) firstblockposn || param) {
241 uint32_t seek_val;
242 int seek_mode;
243
244 if (bytesdone) {
245 seek_val = bytesdone - MIN((uint32_t) firstblockposn, bytesdone);
246 seek_mode = PCM_SEEK_POS;
247 } else {
248 seek_val = param;
249 seek_mode = PCM_SEEK_TIME;
250 }
251
240 /* Round down to previous block */ 252 /* Round down to previous block */
241 struct pcm_pos *newpos = codec->get_seek_pos(bytesdone - firstblockposn, 253 struct pcm_pos *newpos = codec->get_seek_pos(seek_val, seek_mode, NULL);
242 PCM_SEEK_POS, NULL);
243 254
244 if (newpos->pos > format.numbytes) 255 if (newpos->pos > format.numbytes)
245 goto done; 256 goto done;