/* * NAME: genre->number() * DESCRIPTION: translate an ID3v2 genre name/number to its ID3v1 index number */ int id3_genre_number(id3_ucs4_t const *string) { id3_ucs4_t const *ptr; int i; if (string == 0 || *string == 0) return -1; for (ptr = string; *ptr; ++ptr) { if (*ptr < '0' || *ptr > '9') break; } if (*ptr == 0) { unsigned long number; number = id3_ucs4_getnumber(string); return (number <= 0xff) ? number : -1; } for (i = 0; i < NGENRES; ++i) { if (compare(string, genre_table[i])) return i; } /* no equivalent */ return -1; }
/* * NAME: v1->render() * DESCRIPTION: render an ID3v1 (or ID3v1.1) tag */ static id3_length_t v1_render(struct id3_tag const *tag, id3_byte_t *buffer) { struct id3_frame *frame; unsigned int number, i; if (buffer == 0) return 128; id3_render_immediate(&buffer, "TAG", 3); v1_renderstr(tag, ID3_FRAME_TITLE, &buffer, 30); v1_renderstr(tag, ID3_FRAME_ARTIST, &buffer, 30); v1_renderstr(tag, ID3_FRAME_ALBUM, &buffer, 30); v1_renderstr(tag, ID3_FRAME_YEAR, &buffer, 4); v1_renderstr(tag, ID3_FRAME_COMMENT, &buffer, 30); frame = id3_tag_findframe(tag, ID3_FRAME_TRACK, 0); if (frame) { number = id3_ucs4_getnumber(id3_field_getstrings(&frame->fields[1], 0)); if (number & 0xff) { buffer[-2] = 0; buffer[-1] = number; } } frame = id3_tag_findframe(tag, ID3_FRAME_GENRE, 0); number = frame ? id3_ucs4_getnumber(id3_field_getstrings(&frame->fields[1], 0)) : 0xff; id3_render_int(&buffer, number, 1); /* make sure the tag is not empty */ buffer -= 128; for (i = 3; i < 127; ++i) { if (buffer[i] != ' ') break; } return (i == 127 && buffer[127] == 0xff) ? 0 : 128; }
/* * NAME: genre->name() * DESCRIPTION: translate an ID3v2 genre number/keyword to its full name */ id3_ucs4_t const *id3_genre_name(id3_ucs4_t const *string) { id3_ucs4_t const *ptr; static id3_ucs4_t const genre_remix[] = { 'R', 'e', 'm', 'i', 'x', 0 }; static id3_ucs4_t const genre_cover[] = { 'C', 'o', 'v', 'e', 'r', 0 }; unsigned long number; if (string == 0 || *string == 0) return id3_ucs4_empty; if (string[0] == 'R' && string[1] == 'X' && string[2] == 0) return genre_remix; if (string[0] == 'C' && string[1] == 'R' && string[2] == 0) return genre_cover; for (ptr = string; *ptr; ++ptr) { if (*ptr < '0' || *ptr > '9') return string; } number = id3_ucs4_getnumber(string); return (number < NGENRES) ? genre_table[number] : string; }
/* * NAME: v1->render() * DESCRIPTION: render an ID3v1 (or ID3v1.1) tag */ static id3_length_t v1_render(struct id3_tag const *tag, id3_byte_t *buffer) { id3_byte_t data[128], *ptr; struct id3_frame *frame; unsigned int i; int genre = -1; ptr = data; id3_render_immediate(&ptr, "TAG", 3); v1_renderstr(tag, ID3_FRAME_TITLE, &ptr, 30); v1_renderstr(tag, ID3_FRAME_ARTIST, &ptr, 30); v1_renderstr(tag, ID3_FRAME_ALBUM, &ptr, 30); v1_renderstr(tag, ID3_FRAME_YEAR, &ptr, 4); v1_renderstr(tag, ID3_FRAME_COMMENT, &ptr, 30); /* ID3v1.1 track number */ frame = id3_tag_findframe(tag, ID3_FRAME_TRACK, 0); if (frame) { unsigned int track; track = id3_ucs4_getnumber(id3_field_getstrings(&frame->fields[1], 0)); if (track > 0 && track <= 0xff) { ptr[-2] = 0; ptr[-1] = track; } } /* ID3v1 genre number */ frame = id3_tag_findframe(tag, ID3_FRAME_GENRE, 0); if (frame) { unsigned int nstrings; nstrings = id3_field_getnstrings(&frame->fields[1]); for (i = 0; i < nstrings; ++i) { genre = id3_genre_number(id3_field_getstrings(&frame->fields[1], i)); if (genre != -1) break; } if (i == nstrings && nstrings > 0) genre = ID3_GENRE_OTHER; } id3_render_int(&ptr, genre, 1); /* make sure the tag is not empty */ if (genre == -1) { for (i = 3; i < 127; ++i) { if (data[i] != ' ') break; } if (i == 127) return 0; } if (buffer) memcpy(buffer, data, 128); return 128; }