diff options
Diffstat (limited to 'lib/rbcodec/codecs/au.c')
-rw-r--r-- | lib/rbcodec/codecs/au.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/rbcodec/codecs/au.c b/lib/rbcodec/codecs/au.c index 7ae7fe3e94..18d4296125 100644 --- a/lib/rbcodec/codecs/au.c +++ b/lib/rbcodec/codecs/au.c | |||
@@ -139,6 +139,7 @@ enum codec_status codec_run(void) | |||
139 | codec_set_replaygain(ci->id3); | 139 | codec_set_replaygain(ci->id3); |
140 | 140 | ||
141 | /* Need to save offset for later use (cleared indirectly by advance_buffer) */ | 141 | /* Need to save offset for later use (cleared indirectly by advance_buffer) */ |
142 | param = ci->id3->elapsed; | ||
142 | bytesdone = ci->id3->offset; | 143 | bytesdone = ci->id3->offset; |
143 | 144 | ||
144 | ci->memset(&format, 0, sizeof(struct pcm_format)); | 145 | ci->memset(&format, 0, sizeof(struct pcm_format)); |
@@ -236,10 +237,20 @@ enum codec_status codec_run(void) | |||
236 | } | 237 | } |
237 | 238 | ||
238 | /* make sure we're at the correct offset */ | 239 | /* make sure we're at the correct offset */ |
239 | if (bytesdone > (uint32_t) firstblockposn) { | 240 | if (bytesdone > (uint32_t) firstblockposn || param) { |
241 | uint32_t seek_val; | ||
242 | int seek_mode; | ||
243 | |||
244 | if (bytesdone) { | ||
245 | seek_val = bytesdone - MIN((uint32_t) firstblockposn, bytesdone); | ||
246 | seek_mode = PCM_SEEK_POS; | ||
247 | } else { | ||
248 | seek_val = param; | ||
249 | seek_mode = PCM_SEEK_TIME; | ||
250 | } | ||
251 | |||
240 | /* Round down to previous block */ | 252 | /* Round down to previous block */ |
241 | struct pcm_pos *newpos = codec->get_seek_pos(bytesdone - firstblockposn, | 253 | struct pcm_pos *newpos = codec->get_seek_pos(seek_val, seek_mode, NULL); |
242 | PCM_SEEK_POS, NULL); | ||
243 | 254 | ||
244 | if (newpos->pos > format.numbytes) | 255 | if (newpos->pos > format.numbytes) |
245 | goto done; | 256 | goto done; |