summaryrefslogtreecommitdiff
path: root/apps/codecs/vox.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/vox.c')
-rw-r--r--apps/codecs/vox.c37
1 files changed, 28 insertions, 9 deletions
diff --git a/apps/codecs/vox.c b/apps/codecs/vox.c
index 21742e16d9..ff5d571e8d 100644
--- a/apps/codecs/vox.c
+++ b/apps/codecs/vox.c
@@ -52,9 +52,8 @@ enum codec_status codec_main(void)
int bufcount;
int endofstream;
uint8_t *voxbuf;
- off_t firstblockposn; /* position of the first block in file */
+ off_t firstblockposn = 0; /* position of the first block in file */
const struct pcm_codec *codec;
- int offset = 0;
/* Generic codec initialisation */
ci->configure(DSP_SET_SAMPLE_DEPTH, PCM_OUTPUT_DEPTH-1);
@@ -70,7 +69,10 @@ next_track:
ci->sleep(1);
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));
/* set format */
@@ -80,12 +82,9 @@ next_track:
format.blockalign = 1;
/* advance to first WAVE chunk */
- ci->advance_buffer(offset);
-
- firstblockposn = offset;
-
+ firstblockposn = 0;
decodedsamples = 0;
- bytesdone = 0;
+ ci->advance_buffer(firstblockposn);
/*
* get codec
@@ -124,6 +123,25 @@ next_track:
ci->configure(DSP_SWITCH_FREQUENCY, ci->id3->frequency);
ci->configure(DSP_SET_STEREO_MODE, STEREO_MONO);
+ /* 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, &read_buffer);
+
+ 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;
@@ -134,7 +152,8 @@ next_track:
}
if (ci->seek_time) {
- struct pcm_pos *newpos = codec->get_seek_pos(ci->seek_time, &read_buffer);
+ struct pcm_pos *newpos = codec->get_seek_pos(ci->seek_time, PCM_SEEK_TIME,
+ &read_buffer);
if (newpos->pos > format.numbytes)
break;