summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-09-18 13:51:08 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-09-18 13:51:08 +0000
commitb3bb0760852311aca9bd83db3ad99b1bf94b6fba (patch)
tree56ade2e8731b409213cd3ce8a3c91dcbcaefa29a
parent3375f3563ac039ff9311ed8686672751b182bac5 (diff)
downloadrockbox-b3bb0760852311aca9bd83db3ad99b1bf94b6fba.zip
rockbox-b3bb0760852311aca9bd83db3ad99b1bf94b6fba.tar.gz
rockbox-b3bb0760852311aca9bd83db3ad99b1bf94b6fba.tar.bz2
rockbox-b3bb0760852311aca9bd83db3ad99b1bf94b6fba.tar.xz
Another strike in the battle against glitches between tracks
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2325 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/mpeg.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index e91f119..4d26d4b 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -697,7 +697,7 @@ static int new_file(int steps)
{
/* skip past id3v2 tag (to an even byte) */
lseek(mpeg_file,
- id3tags[new_tag_idx]->id3.id3v2len & ~1,
+ id3tags[new_tag_idx]->id3.id3v2len,
SEEK_SET);
id3tags[new_tag_idx]->id3.index = steps;
id3tags[new_tag_idx]->id3.offset = 0;
@@ -743,6 +743,23 @@ static void track_change(void)
update_playlist();
}
+#ifdef DEBUG
+void hexdump(unsigned char *buf, int len)
+{
+ int i;
+
+ for(i = 0;i < len;i++)
+ {
+ if(i && (i & 15) == 0)
+ {
+ DEBUGF("\n");
+ }
+ DEBUGF("%02x ", buf[i]);
+ }
+ DEBUGF("\n");
+}
+#endif
+
static void mpeg_thread(void)
{
static int pause_tick = 0;
@@ -1239,13 +1256,17 @@ static void mpeg_thread(void)
boundary when we reach the end of the file */
if (len < amount_to_read) {
/* Skip id3v1 tag */
+ DEBUGF("Skipping ID3v1 tag\n");
len -= id3tags[tag_read_idx]->id3.id3v1len;
+ /* The very rare case when the buffer wrapped
+ inside the tag must be taken care of */
if(len < 0)
len = 0;
len = (len + 1) & 0xfffffffe;
}
-
+
mp3buf_write += len;
+
if(mp3buf_write >= mp3buflen)
{
mp3buf_write = 0;