diff --git a/apps/gui/gwps-common.c b/apps/gui/gwps-common.c index 41edc0002b..53b12238e4 100644 --- a/apps/gui/gwps-common.c +++ b/apps/gui/gwps-common.c @@ -504,6 +504,12 @@ static char* get_tag(struct wps_data* wps_data, case 'c': /* ID3 Composer */ return id3->composer; + case 'C': /* ID3 Comment */ + return id3->comment; + + case 'A': /* ID3 Albumartist */ + return id3->albumartist; + case 'y': /* year */ if( id3->year_string ) return id3->year_string; diff --git a/apps/lang/deutsch.lang b/apps/lang/deutsch.lang index 4ae438f64d..70f8f91f8c 100644 --- a/apps/lang/deutsch.lang +++ b/apps/lang/deutsch.lang @@ -5391,6 +5391,20 @@ *: "" + + id: LANG_ID3_ALBUMARTIST + desc: in tag viewer + user: + + *: "[Album Artist]" + + + *: "[Album-KÃ?nstler]" + + + *: "" + + id: LANG_ID3_TRACKNUM desc: in tag viewer @@ -5405,6 +5419,20 @@ *: "" + + id: LANG_ID3_COMMENT + desc: in tag viewer + user: + + *: "[Comment]" + + + *: "[Kommentar]" + + + *: "" + + id: LANG_ID3_GENRE desc: in tag viewer diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 66f906052c..6590e109a9 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -5458,6 +5458,20 @@ *: "" + + id: LANG_ID3_ALBUMARTIST + desc: in tag viewer + user: + + *: "[Album Artist]" + + + *: "[Album Artist]" + + + *: "" + + id: LANG_ID3_TRACKNUM desc: in tag viewer @@ -5472,6 +5486,20 @@ *: "" + + id: LANG_ID3_COMMENT + desc: in tag viewer + user: + + *: "[Comment]" + + + *: "[Comment]" + + + *: "" + + id: LANG_ID3_GENRE desc: in tag viewer diff --git a/apps/metadata.c b/apps/metadata.c index 3f2c496671..f5e5d1ba67 100644 --- a/apps/metadata.c +++ b/apps/metadata.c @@ -303,6 +303,22 @@ static long parse_tag(const char* name, char* value, struct mp3entry* id3, { p = &(id3->composer); } + else if (strcasecmp(name, "comment") == 0) + { + p = &(id3->comment); + } + else if (strcasecmp(name, "albumartist") == 0) + { + p = &(id3->albumartist); + } + else if (strcasecmp(name, "album artist") == 0) + { + p = &(id3->albumartist); + } + else if (strcasecmp(name, "ensemble") == 0) + { + p = &(id3->albumartist); + } else { len = parse_replaygain(name, value, id3, buf, buf_remaining); diff --git a/apps/screens.c b/apps/screens.c index d1929c2c8c..631ce80343 100644 --- a/apps/screens.c +++ b/apps/screens.c @@ -1142,7 +1142,9 @@ static char * id3_get_info(int selected_item, void* data, char *buffer) LANG_ID3_TITLE, LANG_ID3_ARTIST, LANG_ID3_ALBUM, + LANG_ID3_ALBUMARTIST, LANG_ID3_TRACKNUM, + LANG_ID3_COMMENT, LANG_ID3_GENRE, LANG_ID3_YEAR, LANG_ID3_LENGTH, @@ -1172,7 +1174,10 @@ static char * id3_get_info(int selected_item, void* data, char *buffer) case 2:/*LANG_ID3_ALBUM*/ info=id3->album; break; - case 3:/*LANG_ID3_TRACKNUM*/ + case 3:/*LANG_ID3_ALBUMARTIST*/ + info=id3->albumartist; + break; + case 4:/*LANG_ID3_TRACKNUM*/ if (id3->track_string) info = id3->track_string; else if (id3->tracknum) @@ -1181,10 +1186,13 @@ static char * id3_get_info(int selected_item, void* data, char *buffer) info = buffer; } break; - case 4:/*LANG_ID3_GENRE*/ + case 5:/*LANG_ID3_COMMENT*/ + info=id3->comment; + break; + case 6:/*LANG_ID3_GENRE*/ info = id3_get_genre(id3); break; - case 5:/*LANG_ID3_YEAR*/ + case 7:/*LANG_ID3_YEAR*/ if (id3->year_string) info = id3->year_string; else if (id3->year) @@ -1193,34 +1201,34 @@ static char * id3_get_info(int selected_item, void* data, char *buffer) info = buffer; } break; - case 6:/*LANG_ID3_LENGTH*/ + case 8:/*LANG_ID3_LENGTH*/ gui_wps_format_time(buffer, MAX_PATH, id3->length); info=buffer; break; - case 7:/*LANG_ID3_PLAYLIST*/ + case 9:/*LANG_ID3_PLAYLIST*/ snprintf(buffer, MAX_PATH, "%d/%d", playlist_get_display_index(), playlist_amount()); info=buffer; break; - case 8:/*LANG_ID3_BITRATE*/ + case 10:/*LANG_ID3_BITRATE*/ snprintf(buffer, MAX_PATH, "%d kbps%s", id3->bitrate, id3->vbr ? str(LANG_ID3_VBR) : (const unsigned char*) ""); info=buffer; break; - case 9:/*LANG_ID3_FRECUENCY*/ + case 11:/*LANG_ID3_FRECUENCY*/ snprintf(buffer, MAX_PATH, "%ld Hz", id3->frequency); info=buffer; break; #if CONFIG_CODEC == SWCODEC - case 10:/*LANG_ID3_TRACK_GAIN*/ + case 12:/*LANG_ID3_TRACK_GAIN*/ info=id3->track_gain_string; break; - case 11:/*LANG_ID3_ALBUM_GAIN*/ + case 13:/*LANG_ID3_ALBUM_GAIN*/ info=id3->album_gain_string; break; - case 12:/*LANG_ID3_PATH*/ + case 14:/*LANG_ID3_PATH*/ #else - case 10:/*LANG_ID3_PATH*/ + case 12:/*LANG_ID3_PATH*/ #endif info=id3->path; break; diff --git a/apps/tagcache.c b/apps/tagcache.c index f6c4ad334c..57bde77cf9 100644 --- a/apps/tagcache.c +++ b/apps/tagcache.c @@ -102,18 +102,22 @@ static long tempbuf_left; /* Buffer space left. */ static long tempbuf_pos; /* Tags we want to get sorted (loaded to the tempbuf). */ -static const int sorted_tags[] = { tag_artist, tag_album, tag_genre, tag_composer, tag_title }; +static const int sorted_tags[] = { tag_artist, tag_album, tag_genre, + tag_composer, tag_comment, tag_albumartist, tag_title }; /* Uniqued tags (we can use these tags with filters and conditional clauses). */ -static const int unique_tags[] = { tag_artist, tag_album, tag_genre, tag_composer }; +static const int unique_tags[] = { tag_artist, tag_album, tag_genre, + tag_composer, tag_comment, tag_albumartist }; /* Numeric tags (we can use these tags with conditional clauses). */ -static const int numeric_tags[] = { tag_year, tag_tracknumber, tag_length, tag_bitrate, - tag_playcount, tag_playtime, tag_lastplayed, tag_virt_autoscore }; +static const int numeric_tags[] = { tag_year, tag_tracknumber, tag_length, + tag_bitrate, tag_playcount, tag_playtime, tag_lastplayed, + tag_virt_autoscore }; +/* String presentation of the tags defined in tagcache.h. Must be in correct order! */ static const char *tags_str[] = { "artist", "album", "genre", "title", - "filename", "composer", "year", "tracknumber", "bitrate", "length", - "playcount", "playtime", "lastplayed" }; + "filename", "composer", "comment", "albumartist", "year", "tracknumber", + "bitrate", "length", "playcount", "playtime", "lastplayed" }; /* Status information of the tagcache. */ static struct tagcache_stat tc_stat; @@ -1393,6 +1397,8 @@ bool tagcache_fill_tags(struct mp3entry *id3, const char *filename) id3->album = get_tag(entry, tag_album)->tag_data; id3->genre_string = get_tag(entry, tag_genre)->tag_data; id3->composer = get_tag(entry, tag_composer)->tag_data; + id3->comment = get_tag(entry, tag_comment)->tag_data; + id3->albumartist = get_tag(entry, tag_albumartist)->tag_data; id3->year = get_tag_numeric(entry, tag_year); id3->tracknum = get_tag_numeric(entry, tag_tracknumber); id3->bitrate = get_tag_numeric(entry, tag_bitrate); @@ -1550,6 +1556,8 @@ static void add_tagcache(char *path) ADD_TAG(entry, tag_album, &track.id3.album); ADD_TAG(entry, tag_genre, &genrestr); ADD_TAG(entry, tag_composer, &track.id3.composer); + ADD_TAG(entry, tag_comment, &track.id3.comment); + ADD_TAG(entry, tag_albumartist, &track.id3.albumartist); entry.data_length = offset; /* Write the header */ @@ -1562,6 +1570,8 @@ static void add_tagcache(char *path) write_item(track.id3.album); write_item(genrestr); write_item(track.id3.composer); + write_item(track.id3.comment); + write_item(track.id3.albumartist); total_entry_count++; } @@ -2882,6 +2892,10 @@ bool tagcache_create_changelog(struct tagcache_search *tcs) if (! (idx.flag & FLAG_DIRTYNUM) ) continue; + /* Skip deleted entries too. */ + if (idx.flag & FLAG_DELETED) + continue; + /* Now retrieve all tags. */ for (j = 0; j < TAG_COUNT; j++) { diff --git a/apps/tagcache.h b/apps/tagcache.h index 4194851aab..503da8c1eb 100644 --- a/apps/tagcache.h +++ b/apps/tagcache.h @@ -23,12 +23,12 @@ #include "id3.h" enum tag_type { tag_artist = 0, tag_album, tag_genre, tag_title, - tag_filename, tag_composer, tag_year, tag_tracknumber, - tag_bitrate, tag_length, tag_playcount, tag_playtime, tag_lastplayed, + tag_filename, tag_composer, tag_comment, tag_albumartist, tag_year, tag_tracknumber, + tag_bitrate, tag_length, tag_playcount, tag_playtime, tag_lastplayed, /* Virtual tags */ tag_virt_autoscore }; -#define TAG_COUNT 13 +#define TAG_COUNT 15 /* Maximum length of a single tag. */ #define TAG_MAXLEN (MAX_PATH*2) @@ -40,7 +40,7 @@ enum tag_type { tag_artist = 0, tag_album, tag_genre, tag_title, #define IDX_BUF_DEPTH 64 /* Tag Cache Header version 'TCHxx'. Increment when changing internal structures. */ -#define TAGCACHE_MAGIC 0x54434806 +#define TAGCACHE_MAGIC 0x54434807 /* How much to allocate extra space for ramcache. */ #define TAGCACHE_RESERVE 32768 diff --git a/apps/tagtree.c b/apps/tagtree.c index d5d70ac206..885ff3ecfc 100644 --- a/apps/tagtree.c +++ b/apps/tagtree.c @@ -195,6 +195,9 @@ static int get_tag(int *tag) MATCH(tag, buf, "artist", tag_artist); MATCH(tag, buf, "bitrate", tag_bitrate); MATCH(tag, buf, "composer", tag_composer); + MATCH(tag, buf, "comment", tag_comment); + MATCH(tag, buf, "albumartist", tag_albumartist); + MATCH(tag, buf, "ensemble", tag_albumartist); MATCH(tag, buf, "genre", tag_genre); MATCH(tag, buf, "length", tag_length); MATCH(tag, buf, "title", tag_title); diff --git a/firmware/export/id3.h b/firmware/export/id3.h index 75af992fc0..83fc2cdaa5 100644 --- a/firmware/export/id3.h +++ b/firmware/export/id3.h @@ -142,6 +142,8 @@ struct mp3entry { char* track_string; char* year_string; char* composer; + char* comment; + char* albumartist; int tracknum; int version; int layer; diff --git a/firmware/id3.c b/firmware/id3.c index bc42cf5c62..bdcf8e526b 100644 --- a/firmware/id3.c +++ b/firmware/id3.c @@ -351,6 +351,14 @@ static int parseyearnum( struct mp3entry* entry, char* tag, int bufferpos ) return bufferpos; } +/* parse comment */ +static int parsecomment( struct mp3entry* entry, char* tag, int bufferpos ) +{ + + entry->comment = tag + 4; // simplistic + return bufferpos; +} + /* parse numeric genre from string, version 2.2 and 2.3 */ static int parsegenre( struct mp3entry* entry, char* tag, int bufferpos ) { @@ -448,6 +456,9 @@ static const struct tag_resolver taglist[] = { { "TYER", 4, offsetof(struct mp3entry, year_string), &parseyearnum, false }, { "TYE", 3, offsetof(struct mp3entry, year_string), &parseyearnum, false }, { "TCOM", 4, offsetof(struct mp3entry, composer), NULL, false }, + { "TPE2", 4, offsetof(struct mp3entry, albumartist), NULL, false }, + { "TP2", 3, offsetof(struct mp3entry, albumartist), NULL, false }, + { "COMM", 4, offsetof(struct mp3entry, comment), &parsecomment, false }, { "TCON", 4, offsetof(struct mp3entry, genre_string), &parsegenre, false }, { "TCO", 3, offsetof(struct mp3entry, genre_string), &parsegenre, false }, #if CONFIG_CODEC == SWCODEC @@ -1151,6 +1162,10 @@ void adjust_mp3entry(struct mp3entry *entry, void *dest, void *orig) entry->year_string += offset; if (entry->composer) entry->composer += offset; + if (entry->comment) + entry->comment += offset; + if (entry->albumartist) + entry->albumartist += offset; #if CONFIG_CODEC == SWCODEC if (entry->track_gain_string) entry->track_gain_string += offset;