summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/vox.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/vox.c')
-rw-r--r--lib/rbcodec/codecs/vox.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/rbcodec/codecs/vox.c b/lib/rbcodec/codecs/vox.c
index 66979e2911..d84af24cfc 100644
--- a/lib/rbcodec/codecs/vox.c
+++ b/lib/rbcodec/codecs/vox.c
@@ -73,7 +73,8 @@ enum codec_status codec_run(void)
73 73
74 codec_set_replaygain(ci->id3); 74 codec_set_replaygain(ci->id3);
75 75
76 /* Need to save offset for later use (cleared indirectly by advance_buffer) */ 76 /* Need to save resume for later use (cleared indirectly by advance_buffer) */
77 param = ci->id3->elapsed;
77 bytesdone = ci->id3->offset; 78 bytesdone = ci->id3->offset;
78 ci->seek_buffer(0); 79 ci->seek_buffer(0);
79 80
@@ -123,10 +124,21 @@ enum codec_status codec_run(void)
123 ci->configure(DSP_SET_STEREO_MODE, STEREO_MONO); 124 ci->configure(DSP_SET_STEREO_MODE, STEREO_MONO);
124 125
125 /* make sure we're at the correct offset */ 126 /* make sure we're at the correct offset */
126 if (bytesdone > (uint32_t) firstblockposn) { 127 if (bytesdone > (uint32_t) firstblockposn || param) {
128 uint32_t seek_val;
129 int seek_mode;
130
131 if (bytesdone) {
132 seek_val = bytesdone - MIN((uint32_t )firstblockposn, bytesdone);
133 seek_mode = PCM_SEEK_POS;
134 } else {
135 seek_val = param;
136 seek_mode = PCM_SEEK_TIME;
137 }
138
127 /* Round down to previous block */ 139 /* Round down to previous block */
128 struct pcm_pos *newpos = codec->get_seek_pos(bytesdone - firstblockposn, 140 struct pcm_pos *newpos = codec->get_seek_pos(seek_val, seek_mode,
129 PCM_SEEK_POS, &read_buffer); 141 &read_buffer);
130 142
131 if (newpos->pos > format.numbytes) { 143 if (newpos->pos > format.numbytes) {
132 return CODEC_OK; 144 return CODEC_OK;