diff options
Diffstat (limited to 'lib/rbcodec/codecs/wav64.c')
-rw-r--r-- | lib/rbcodec/codecs/wav64.c | 19 |
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; |