summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/wav.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/wav.c')
-rw-r--r--lib/rbcodec/codecs/wav.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/rbcodec/codecs/wav.c b/lib/rbcodec/codecs/wav.c
index cc65ab83b2..3208e2b5b8 100644
--- a/lib/rbcodec/codecs/wav.c
+++ b/lib/rbcodec/codecs/wav.c
@@ -182,7 +182,8 @@ enum codec_status codec_run(void)
182 182
183 codec_set_replaygain(ci->id3); 183 codec_set_replaygain(ci->id3);
184 184
185 /* Need to save offset for later use (cleared indirectly by advance_buffer) */ 185 /* Need to save resume for later use (cleared indirectly by advance_buffer) */
186 param = ci->id3->elapsed;
186 bytesdone = ci->id3->offset; 187 bytesdone = ci->id3->offset;
187 188
188 /* get RIFF chunk header */ 189 /* get RIFF chunk header */
@@ -361,10 +362,21 @@ enum codec_status codec_run(void)
361 } 362 }
362 363
363 /* make sure we're at the correct offset */ 364 /* make sure we're at the correct offset */
364 if (bytesdone > (uint32_t) firstblockposn) { 365 if (bytesdone > (uint32_t) firstblockposn || param) {
366 uint32_t seek_val;
367 int seek_mode;
368
369 if (bytesdone) {
370 seek_val = bytesdone - MIN((uint32_t) firstblockposn, bytesdone);
371 seek_mode = PCM_SEEK_POS;
372 } else {
373 seek_val = param;
374 seek_mode = PCM_SEEK_TIME;
375 }
376
365 /* Round down to previous block */ 377 /* Round down to previous block */
366 struct pcm_pos *newpos = codec->get_seek_pos(bytesdone - firstblockposn, 378 struct pcm_pos *newpos = codec->get_seek_pos(seek_val, seek_mode,
367 PCM_SEEK_POS, &read_buffer); 379 &read_buffer);
368 380
369 if (newpos->pos > format.numbytes) 381 if (newpos->pos > format.numbytes)
370 return CODEC_OK; 382 return CODEC_OK;