19#ifndef AUDIOTOOLS_ID3_TAG_ALLOW_NONASCII
20#define AUDIOTOOLS_ID3_TAG_ALLOW_NONASCII false
33static const char *
genres[] = {
"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",
"Alternative Rock",
"Bass",
"Soul",
"Punk",
"Space",
"Meditative",
"Instrumental Pop",
"Instrumental Rock",
"Ethnic",
"Gothic",
"Darkwave",
"Techno-Insdustiral",
"Electronic",
"Pop-Folk",
"Eurodance",
"Dream",
"Southern Rock",
"Comedy",
"Cult",
"Gangsta",
"Top 40",
"Christian Rap",
"Pop/Funk",
"Jungle",
"Native US",
"Cabaret",
"New Wave",
"Psychadelic",
"Rave",
"Showtunes",
"Trailer",
"Lo-Fi",
"Tribal",
"Acid Punk",
"Acid Jazz",
"Polka",
"Retro",
"Musical",
"Rock & Roll",
"Hard Rock",
"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",
"Rhytmic Soul",
"Freestyle",
"Duet",
"Punk Rock",
"Drum Solo",
"Acapella",
"Euro-House",
"Dance Hall",
"Goa",
"Drum & Bass",
"Club-House",
"Hardcore",
"Terror",
"Indie",
"BritPop",
"Negerpunk",
"Polsk Punk",
"Beat",
"Christian Gangsta",
"Heavy Metal",
"Black Metal",
"Crossover",
"Contemporary C",
"Christian Rock",
"Merengue",
"Salsa",
"Thrash Metal",
"Anime",
"JPop",
"SynthPop" };
90 int findTag(
const char* tag,
const char*str,
size_t len){
91 if (tag==
nullptr || str==
nullptr || len<=0)
return -1;
96 size_t tag_len = strlen(tag);
97 if (tag_len >= len)
return -1;
98 for (
size_t j=0;j<=len-tag_len-1;j++){
99 if (memcmp(str+j,tag, tag_len)==0){
143 size_t write(
const uint8_t* data,
size_t len){
174 int pos =
findTag(
"TAG+",(
const char*) data, len);
188 pos =
findTag(
"TAG", (
const char*) data, len);
192 if (len-pos>=
sizeof(
ID3v1)){
207 if (data[len-3] ==
'T' && data[len-2] ==
'A' && data[len-1] ==
'G'){
210 }
else if (data[len-2] ==
'T' && data[len-1] ==
'A' ){
213 }
else if (data[len-1] ==
'T'){
223 int missing = 5 - tag_len;
224 strncat((
char*)
tag_str, (
char*)data, missing);
225 if (strncmp((
char*)
tag_str,
"TAG+", 4)==0){
230 }
else if (strncmp((
char*)
tag_str,
"TAG",3)==0){
272 if (genre <
sizeof(
genres)){
273 const char* genre_str =
genres[genre];
286#define UnsynchronisationFlag 0x40
287#define ExtendedHeaderFlag 0x20
288#define ExperimentalIndicatorFlag 0x10
291static const char*
id3_v2_tags[] = {
"TALB",
"TOPE",
"TPE1",
"TIT2",
"TCON"};
364 size_t write(
const uint8_t* data,
size_t len){
420 uint32_t byte0 = chars[0];
421 uint32_t byte1 = chars[1];
422 uint32_t byte2 = chars[2];
423 uint32_t byte3 = chars[3];
424 return byte0 << 21 | byte1 << 14 | byte2 << 7 | byte3;
432 int pos =
findTag(
"ID3", (
const char*) data, len);
437 if (len>=pos+
sizeof(
ID3v2)){
453 const char* partial_tag =
nullptr;
456 int tag_pos =
findTag(tag, (
const char*) data, len);
458 if (tag_pos>0 && tag_pos+
sizeof(
ID3v2Frame)<=len){
467 int checkLen = min(l, 10);
471 LOGW(
"TAG %s ignored", tag);
475 LOGI(
"%s partial tag", tag);
481 if (partial_tag!=
nullptr){
482 int tag_pos =
findTag(partial_tag, (
const char*) data, len);
500 int m = l < 5 ? l : 10;
501 for (
int j=0; j<m; j++){
524 int strpos(
char* str,
const char* target) {
525 char* res = strstr(str, target);
526 return (res ==
nullptr) ? -1 : res - str;
550 if (idx>=0 && idx< (
int)
sizeof(
genres)){
602 virtual size_t write(
const uint8_t *data,
size_t len){
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28