forked from len0rd/rockbox
Added ID3 tag 'genre': %ig
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2950 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
345f7c62ba
commit
a5587d0298
3 changed files with 52 additions and 2 deletions
|
@ -63,6 +63,33 @@ static int ff_rewind_count;
|
||||||
bool wps_time_countup = true;
|
bool wps_time_countup = true;
|
||||||
static bool wps_loaded = false;
|
static bool wps_loaded = false;
|
||||||
|
|
||||||
|
static const char* const genres[] = {
|
||||||
|
"Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge",
|
||||||
|
"Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B",
|
||||||
|
"Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska",
|
||||||
|
"Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop",
|
||||||
|
"Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental",
|
||||||
|
"Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "AlternRock",
|
||||||
|
"Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop",
|
||||||
|
"Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno-Industrial",
|
||||||
|
"Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy",
|
||||||
|
"Cult", "Gangsta", "Top 40", "Christian Rap", "Pop/Funk", "Jungle",
|
||||||
|
"Native American", "Cabaret", "New Wave", "Psychadelic", "Rave",
|
||||||
|
"Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz",
|
||||||
|
"Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock",
|
||||||
|
|
||||||
|
/* winamp extensions */
|
||||||
|
"Folk", "Folk-Rock", "National Folk", "Swing", "Fast Fusion", "Bebob",
|
||||||
|
"Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock",
|
||||||
|
"Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock",
|
||||||
|
"Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech",
|
||||||
|
"Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass",
|
||||||
|
"Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba",
|
||||||
|
"Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle",
|
||||||
|
"Duet", "Punk Rock", "Drum Solo", "A capella", "Euro-House", "Dance Hall"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Set format string to use for WPS, splitting it into lines */
|
/* Set format string to use for WPS, splitting it into lines */
|
||||||
static void wps_format(char* fmt)
|
static void wps_format(char* fmt)
|
||||||
{
|
{
|
||||||
|
@ -260,6 +287,13 @@ static char* get_tag(struct mp3entry* id3,
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'g': /* genre */
|
||||||
|
if (id3->genre < sizeof(genres)/sizeof(char*))
|
||||||
|
return (char*)genres[id3->genre];
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -156,7 +156,7 @@ static int unicode_munge(char** string, int *len) {
|
||||||
static bool setid3v1title(int fd, struct mp3entry *entry)
|
static bool setid3v1title(int fd, struct mp3entry *entry)
|
||||||
{
|
{
|
||||||
unsigned char buffer[128];
|
unsigned char buffer[128];
|
||||||
static int offsets[] = {3, 33, 63, 93, 125};
|
static char offsets[] = {3, 33, 63, 93, 125, 127};
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
if (-1 == lseek(fd, -128, SEEK_END))
|
if (-1 == lseek(fd, -128, SEEK_END))
|
||||||
|
@ -168,7 +168,7 @@ static bool setid3v1title(int fd, struct mp3entry *entry)
|
||||||
if (strncmp(buffer, "TAG", 3))
|
if (strncmp(buffer, "TAG", 3))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (i=0;i<5;i++) {
|
for (i=0; i < (int)sizeof offsets; i++) {
|
||||||
char* ptr = buffer + offsets[i];
|
char* ptr = buffer + offsets[i];
|
||||||
|
|
||||||
if (i<3) {
|
if (i<3) {
|
||||||
|
@ -204,6 +204,11 @@ static bool setid3v1title(int fd, struct mp3entry *entry)
|
||||||
if (*ptr == 0)
|
if (*ptr == 0)
|
||||||
entry->tracknum = ptr[1];
|
entry->tracknum = ptr[1];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
/* genre */
|
||||||
|
entry->genre = ptr[0];
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -339,6 +344,16 @@ static void setid3v2title(int fd, struct mp3entry *entry)
|
||||||
bufferpos += bytesread + 1;
|
bufferpos += bytesread + 1;
|
||||||
size -= bytesread;
|
size -= bytesread;
|
||||||
}
|
}
|
||||||
|
else if(!strncmp(header, "TCON", 4)) {
|
||||||
|
char* ptr = buffer + bufferpos;
|
||||||
|
bytesread = read(fd, ptr, framelen);
|
||||||
|
if (ptr[1] == '(' && ptr[2] != '(')
|
||||||
|
entry->genre = atoi(ptr+2);
|
||||||
|
else
|
||||||
|
entry->genre = 0xff;
|
||||||
|
bufferpos += bytesread + 1;
|
||||||
|
size -= bytesread;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
/* Unknown frame, skip it using the total size in case
|
/* Unknown frame, skip it using the total size in case
|
||||||
it was truncated */
|
it was truncated */
|
||||||
|
|
|
@ -30,6 +30,7 @@ struct mp3entry {
|
||||||
int version;
|
int version;
|
||||||
int layer;
|
int layer;
|
||||||
int year;
|
int year;
|
||||||
|
unsigned char genre;
|
||||||
unsigned int bitrate;
|
unsigned int bitrate;
|
||||||
unsigned int frequency;
|
unsigned int frequency;
|
||||||
unsigned int id3v2len;
|
unsigned int id3v2len;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue