summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-10-27 23:07:26 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-10-27 23:07:26 +0000
commitc41322c59182e4cb10de185f7c14a59a015ac994 (patch)
treedc20aec83aae2d5a7c65c5acfe4b70f057a1d6af /firmware
parentda407264c28b3a80ad38ef7610e7dde23ba780ac (diff)
downloadrockbox-c41322c59182e4cb10de185f7c14a59a015ac994.tar.gz
rockbox-c41322c59182e4cb10de185f7c14a59a015ac994.zip
Better skipping of leading garbage. Fixes bug #625868.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2752 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/id3.c10
-rw-r--r--firmware/id3.h3
-rw-r--r--firmware/mpeg.c4
3 files changed, 9 insertions, 8 deletions
diff --git a/firmware/id3.c b/firmware/id3.c
index 54f0f970c1..e0e3ca1abf 100644
--- a/firmware/id3.c
+++ b/firmware/id3.c
@@ -713,12 +713,10 @@ static int getsonglength(int fd, struct mp3entry *entry)
713 filetime = entry->filesize/bpf*tpf; 713 filetime = entry->filesize/bpf*tpf;
714 } 714 }
715 715
716 DEBUGF("Old ID3V2 length: %x\n", entry->id3v2len); 716 /* Update the seek point for the first playable frame */
717 /* Adjust the tag length only if there is a tag present */ 717 entry->first_frame_offset = bytecount;
718 if(entry->id3v2len || header_found) 718 DEBUGF("First frame is at %x\n", entry->first_frame_offset);
719 entry->id3v2len = bytecount; 719
720 DEBUGF("New ID3V2 length: %x\n", bytecount);
721
722 return filetime; 720 return filetime;
723} 721}
724 722
diff --git a/firmware/id3.h b/firmware/id3.h
index d76614f540..88f50ba9b1 100644
--- a/firmware/id3.h
+++ b/firmware/id3.h
@@ -33,6 +33,9 @@ struct mp3entry {
33 unsigned int frequency; 33 unsigned int frequency;
34 unsigned int id3v2len; 34 unsigned int id3v2len;
35 unsigned int id3v1len; 35 unsigned int id3v1len;
36 unsigned int first_frame_offset; /* Byte offset to first real MP3 frame.
37 Used for skipping leading garbage to
38 avoid gaps between tracks. */
36 unsigned int filesize; /* in bytes */ 39 unsigned int filesize; /* in bytes */
37 unsigned int length; /* song length */ 40 unsigned int length; /* song length */
38 unsigned int elapsed; /* ms played */ 41 unsigned int elapsed; /* ms played */
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index d75ac2085e..e8fd1acbc7 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -775,7 +775,7 @@ static int new_file(int steps)
775 { 775 {
776 /* skip past id3v2 tag */ 776 /* skip past id3v2 tag */
777 lseek(mpeg_file, 777 lseek(mpeg_file,
778 id3tags[new_tag_idx]->id3.id3v2len, 778 id3tags[new_tag_idx]->id3.first_frame_offset,
779 SEEK_SET); 779 SEEK_SET);
780 id3tags[new_tag_idx]->id3.index = steps; 780 id3tags[new_tag_idx]->id3.index = steps;
781 id3tags[new_tag_idx]->id3.offset = 0; 781 id3tags[new_tag_idx]->id3.offset = 0;
@@ -967,7 +967,7 @@ static void mpeg_thread(void)
967 else { 967 else {
968 /* skip past id3v2 tag */ 968 /* skip past id3v2 tag */
969 lseek(mpeg_file, 969 lseek(mpeg_file,
970 id3tags[tag_read_idx]->id3.id3v2len, 970 id3tags[tag_read_idx]->id3.first_frame_offset,
971 SEEK_SET); 971 SEEK_SET);
972 972
973 } 973 }