diff options
| author | Brandon Low <lostlogic@rockbox.org> | 2006-10-23 16:47:48 +0000 |
|---|---|---|
| committer | Brandon Low <lostlogic@rockbox.org> | 2006-10-23 16:47:48 +0000 |
| commit | 97f2af25532846f5dc72f6d3265cd9f5ff333610 (patch) | |
| tree | d8412c064f794e7908b3eb7c3f93fa2bddb57614 | |
| parent | 5825b2c84f3b8a0fa9bd243ca5a0dec8141bc573 (diff) | |
| download | rockbox-97f2af25532846f5dc72f6d3265cd9f5ff333610.zip rockbox-97f2af25532846f5dc72f6d3265cd9f5ff333610.tar.gz rockbox-97f2af25532846f5dc72f6d3265cd9f5ff333610.tar.bz2 rockbox-97f2af25532846f5dc72f6d3265cd9f5ff333610.tar.xz | |
Fix FS 6205: id3v1 stripping messed up rebuffer_and_seeks. Add an assurance check JinC other things mess it up, more graceful recovery.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11318 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | apps/playback.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/apps/playback.c b/apps/playback.c index 9e95c4f..ddb6019 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -2166,6 +2166,13 @@ static bool audio_read_file(size_t minimum) else overlap = RINGBUF_ADD_CROSS(buf_widx,rc,CUR_TI->buf_idx); + if ((unsigned)rc > tracks[track_widx].filerem) + { + logf("Bad: rc-filerem=%d, fixing", rc-tracks[track_widx].filerem); + tracks[track_widx].filesize += rc - tracks[track_widx].filerem; + tracks[track_widx].filerem = rc; + } + /* Advance buffer */ buf_widx = RINGBUF_ADD(buf_widx, rc); tracks[track_widx].available += rc; @@ -2883,9 +2890,12 @@ static void audio_rebuffer_and_seek(size_t newpos) filling = false; audio_initialize_buffer_fill(true); + /* This may have been tweaked by the id3v1 code */ + CUR_TI->filesize=filesize(fd); if (newpos > conf_preseek) { CUR_TI->start_pos = newpos - conf_preseek; + lseek(current_fd, CUR_TI->start_pos, SEEK_SET); CUR_TI->filerem = CUR_TI->filesize - CUR_TI->start_pos; real_preseek = conf_preseek; } @@ -2898,8 +2908,6 @@ static void audio_rebuffer_and_seek(size_t newpos) CUR_TI->available = 0; - lseek(current_fd, CUR_TI->start_pos, SEEK_SET); - audio_read_file(real_preseek); /* Account for the data we just read that is 'behind' us now */ |