summaryrefslogtreecommitdiffstats
path: root/apps/codecs/au.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/au.c')
-rw-r--r--apps/codecs/au.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/apps/codecs/au.c b/apps/codecs/au.c
index 19348bc299..1e6af25924 100644
--- a/apps/codecs/au.c
+++ b/apps/codecs/au.c
@@ -135,6 +135,9 @@ next_track:
codec_set_replaygain(ci->id3);
+ /* Need to save offset for later use (cleared indirectly by advance_buffer) */
+ bytesdone = ci->id3->offset;
+
ci->memset(&format, 0, sizeof(struct pcm_format));
format.is_signed = true;
format.is_little_endian = false;
@@ -191,7 +194,6 @@ next_track:
decodedsamples = 0;
codec = 0;
- bytesdone = 0;
/* get codec */
codec = get_au_codec(format.formattag);
@@ -236,6 +238,25 @@ next_track:
goto done;
}
+ /* make sure we're at the correct offset */
+ if (bytesdone > (uint32_t) firstblockposn) {
+ /* Round down to previous block */
+ struct pcm_pos *newpos = codec->get_seek_pos(bytesdone - firstblockposn,
+ PCM_SEEK_POS, NULL);
+
+ if (newpos->pos > format.numbytes)
+ goto done;
+ if (ci->seek_buffer(firstblockposn + newpos->pos))
+ {
+ bytesdone = newpos->pos;
+ decodedsamples = newpos->samples;
+ }
+ ci->seek_complete();
+ } else {
+ /* already where we need to be */
+ bytesdone = 0;
+ }
+
/* The main decoder loop */
endofstream = 0;
@@ -246,8 +267,8 @@ next_track:
}
if (ci->seek_time) {
- /* 2nd args(read_buffer) is unnecessary in the format which Sun Audio supports. */
- struct pcm_pos *newpos = codec->get_seek_pos(ci->seek_time, NULL);
+ /* 3rd args(read_buffer) is unnecessary in the format which Sun Audio supports. */
+ struct pcm_pos *newpos = codec->get_seek_pos(ci->seek_time, PCM_SEEK_TIME, NULL);
if (newpos->pos > format.numbytes)
break;