summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/smaf.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/smaf.c')
-rw-r--r--lib/rbcodec/codecs/smaf.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/rbcodec/codecs/smaf.c b/lib/rbcodec/codecs/smaf.c
index d56aa0a860..e4ec6342b2 100644
--- a/lib/rbcodec/codecs/smaf.c
+++ b/lib/rbcodec/codecs/smaf.c
@@ -360,7 +360,8 @@ enum codec_status codec_run(void)
360 360
361 codec_set_replaygain(ci->id3); 361 codec_set_replaygain(ci->id3);
362 362
363 /* Need to save offset for later use (cleared indirectly by advance_buffer) */ 363 /* Need to save resume for later use (cleared indirectly by advance_buffer) */
364 param = ci->id3->elapsed;
364 bytesdone = ci->id3->offset; 365 bytesdone = ci->id3->offset;
365 366
366 decodedsamples = 0; 367 decodedsamples = 0;
@@ -408,11 +409,21 @@ enum codec_status codec_run(void)
408 ci->seek_buffer(firstblockposn); 409 ci->seek_buffer(firstblockposn);
409 410
410 /* make sure we're at the correct offset */ 411 /* make sure we're at the correct offset */
411 if (bytesdone > (uint32_t) firstblockposn) 412 if (bytesdone > (uint32_t) firstblockposn || param) {
412 { 413 uint32_t seek_val;
414 int seek_mode;
415
416 if (bytesdone) {
417 seek_val = bytesdone - MIN((uint32_t) firstblockposn, bytesdone);
418 seek_mode = PCM_SEEK_POS;
419 } else {
420 seek_val = param;
421 seek_mode = PCM_SEEK_TIME;
422 }
423
413 /* Round down to previous block */ 424 /* Round down to previous block */
414 struct pcm_pos *newpos = codec->get_seek_pos(bytesdone - firstblockposn, 425 struct pcm_pos *newpos = codec->get_seek_pos(seek_val, seek_mode,
415 PCM_SEEK_POS, &read_buffer); 426 &read_buffer);
416 427
417 if (newpos->pos > format.numbytes) 428 if (newpos->pos > format.numbytes)
418 return CODEC_OK; 429 return CODEC_OK;