summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/wav64.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/wav64.c')
-rw-r--r--lib/rbcodec/codecs/wav64.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/lib/rbcodec/codecs/wav64.c b/lib/rbcodec/codecs/wav64.c
index 9b3b2d38e4..96e605faad 100644
--- a/lib/rbcodec/codecs/wav64.c
+++ b/lib/rbcodec/codecs/wav64.c
@@ -191,6 +191,7 @@ enum codec_status codec_run(void)
191 codec_set_replaygain(ci->id3); 191 codec_set_replaygain(ci->id3);
192 192
193 /* Need to save offset for later use (cleared indirectly by advance_buffer) */ 193 /* Need to save offset for later use (cleared indirectly by advance_buffer) */
194 param = ci->id3->elapsed;
194 bytesdone = ci->id3->offset; 195 bytesdone = ci->id3->offset;
195 196
196 /* get RIFF chunk header */ 197 /* get RIFF chunk header */
@@ -363,10 +364,22 @@ enum codec_status codec_run(void)
363 } 364 }
364 365
365 /* make sure we're at the correct offset */ 366 /* make sure we're at the correct offset */
366 if (bytesdone > (uint32_t) firstblockposn) { 367 if (bytesdone > (uint32_t) firstblockposn || param) {
368 uint32_t seek_val;
369 int seek_mode;
370
371 /* we prefer offset resume */
372 if (bytesdone > (uint32_t) firstblockposn) {
373 seek_val = bytesdone - firstblockposn;
374 seek_mode = PCM_SEEK_POS;
375 } else {
376 seek_val = param;
377 seek_mode = PCM_SEEK_TIME;
378 }
379
367 /* Round down to previous block */ 380 /* Round down to previous block */
368 struct pcm_pos *newpos = codec->get_seek_pos(bytesdone - firstblockposn, 381 struct pcm_pos *newpos = codec->get_seek_pos(seek_val, seek_mode,
369 PCM_SEEK_POS, &read_buffer); 382 &read_buffer);
370 383
371 if (newpos->pos > format.numbytes) { 384 if (newpos->pos > format.numbytes) {
372 return CODEC_OK; 385 return CODEC_OK;