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