1
0
Fork 0
forked from len0rd/rockbox

Tidied up the ID3V2 parser a little

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3475 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Linus Nielsen Feltzing 2003-03-18 01:31:35 +00:00
parent 372ad33d35
commit 6b6f97ddda

View file

@ -186,6 +186,24 @@ static bool setid3v1title(int fd, struct mp3entry *entry)
return true; return true;
} }
static int read_frame(int fd, unsigned char *buf, char **destptr, int framelen)
{
int bytesread;
bytesread = read(fd, buf, framelen);
if(bytesread < 0)
return bytesread * 10 - 1;
if(bytesread < framelen)
return -1;
*destptr = buf;
if(unicode_munge(destptr, &bytesread) < 0)
return -2;
(*destptr)[bytesread] = '\0';
return bytesread + 1;
}
/* /*
* Sets the title of an MP3 entry based on its ID3v2 tag. * Sets the title of an MP3 entry based on its ID3v2 tag.
@ -203,7 +221,7 @@ static void setid3v2title(int fd, struct mp3entry *entry)
char header[10]; char header[10];
unsigned char version; unsigned char version;
char *buffer = entry->id3v2buf; char *buffer = entry->id3v2buf;
char *tracknum = NULL; char *tmp = NULL;
int bytesread = 0; int bytesread = 0;
int buffersize = sizeof(entry->id3v2buf); int buffersize = sizeof(entry->id3v2buf);
int flags; int flags;
@ -339,56 +357,64 @@ static void setid3v2title(int fd, struct mp3entry *entry)
if (!entry->artist && if (!entry->artist &&
(!strncmp(header, "TPE1", strlen("TPE1")) || (!strncmp(header, "TPE1", strlen("TPE1")) ||
!strncmp(header, "TP1", strlen("TP1")))) { !strncmp(header, "TP1", strlen("TP1")))) {
bytesread = read(fd, buffer + bufferpos, framelen); bytesread = read_frame(fd, buffer + bufferpos,
entry->artist = buffer + bufferpos; &entry->artist, framelen);
unicode_munge(&entry->artist, &bytesread); if(bytesread < 0)
entry->artist[bytesread + 1] = '\0'; return;
bufferpos += bytesread + 2;
size -= bytesread; bufferpos += bytesread;
size -= framelen;
} }
else if (!entry->title && else if (!entry->title &&
(!strncmp(header, "TIT2", strlen("TIT2")) || (!strncmp(header, "TIT2", strlen("TIT2")) ||
!strncmp(header, "TT2", strlen("TT2")))) { !strncmp(header, "TT2", strlen("TT2")))) {
bytesread = read(fd, buffer + bufferpos, framelen); bytesread = read_frame(fd, buffer + bufferpos,
entry->title = buffer + bufferpos; &entry->title, framelen);
unicode_munge(&entry->title, &bytesread); if(bytesread < 0)
entry->title[bytesread + 1] = '\0'; return;
bufferpos += bytesread + 2;
size -= bytesread; bufferpos += bytesread;
size -= framelen;
} }
else if( !entry->album && else if( !entry->album &&
!strncmp(header, "TALB", strlen("TALB"))) { !strncmp(header, "TALB", strlen("TALB"))) {
bytesread = read(fd, buffer + bufferpos, framelen); bytesread = read_frame(fd, buffer + bufferpos,
entry->album = buffer + bufferpos; &entry->album, framelen);
unicode_munge(&entry->album, &bytesread); if(bytesread < 0)
entry->album[bytesread + 1] = '\0'; return;
bufferpos += bytesread + 2;
size -= bytesread; bufferpos += bytesread;
size -= framelen;
} }
else if (!entry->tracknum && else if (!entry->tracknum &&
!strncmp(header, "TRCK", strlen("TRCK"))) { !strncmp(header, "TRCK", strlen("TRCK"))) {
bytesread = read(fd, buffer + bufferpos, framelen); bytesread = read_frame(fd, buffer + bufferpos,
tracknum = buffer + bufferpos; &tmp, framelen);
unicode_munge(&tracknum, &bytesread); if(bytesread < 0)
tracknum[bytesread + 1] = '\0'; return;
entry->tracknum = atoi(tracknum);
bufferpos += bytesread + 1; entry->tracknum = atoi(tmp);
size -= bytesread;
size -= framelen;
} }
else if (!entry->year && else if (!entry->year &&
(!strncmp(header, "TYER", 4) || (!strncmp(header, "TYER", 4) ||
!strncmp(header, "TYR", 3))) { !strncmp(header, "TYR", 3))) {
char* ptr = buffer + bufferpos; bytesread = read_frame(fd, buffer + bufferpos,
bytesread = read(fd, ptr, framelen); &tmp, framelen);
unicode_munge(&ptr, &bytesread); if(bytesread < 0)
entry->year = atoi(ptr); return;
bufferpos += bytesread + 1;
entry->year = atoi(tmp);
size -= bytesread; size -= bytesread;
} }
else if (!entry->genre && else if (!entry->genre &&
!strncmp(header, "TCON", 4)) { !strncmp(header, "TCON", 4)) {
char* ptr = buffer + bufferpos; char* ptr = buffer + bufferpos;
bytesread = read(fd, ptr, framelen); bytesread = read(fd, ptr, framelen);
if(bytesread < 0 || bytesread < framelen)
return;
if (ptr[1] == '(' && ptr[2] != '(') if (ptr[1] == '(' && ptr[2] != '(')
entry->genre = atoi(ptr+2); entry->genre = atoi(ptr+2);
bufferpos += bytesread + 1; bufferpos += bytesread + 1;