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