diff options
-rw-r--r-- | firmware/id3.c | 6 | ||||
-rw-r--r-- | firmware/replaygain.c | 23 |
2 files changed, 15 insertions, 14 deletions
diff --git a/firmware/id3.c b/firmware/id3.c index b3c09f2e6b..35e0517769 100644 --- a/firmware/id3.c +++ b/firmware/id3.c | |||
@@ -322,9 +322,9 @@ static int parseuser( struct mp3entry* entry, char* tag, int bufferpos ) | |||
322 | int desc_len = strlen(tag); | 322 | int desc_len = strlen(tag); |
323 | int value_len = 0; | 323 | int value_len = 0; |
324 | 324 | ||
325 | /* Only parse TXXX replaygain tags if tag version < 2.4 */ | 325 | /* Note: for ID3v2.4, parse_replaygain will not overwrite replaygain |
326 | if (entry->id3version < ID3_VER_2_4 && | 326 | values already parsed from RVA2 tags */ |
327 | (tag - entry->id3v2buf + desc_len + 2) < bufferpos) { | 327 | if ((tag - entry->id3v2buf + desc_len + 2) < bufferpos) { |
328 | /* At least part of the value was read, so we can safely try to | 328 | /* At least part of the value was read, so we can safely try to |
329 | * parse it | 329 | * parse it |
330 | */ | 330 | */ |
diff --git a/firmware/replaygain.c b/firmware/replaygain.c index ffabb4b2ac..b7cde7f005 100644 --- a/firmware/replaygain.c +++ b/firmware/replaygain.c | |||
@@ -358,24 +358,25 @@ long parse_replaygain(const char* key, const char* value, | |||
358 | { | 358 | { |
359 | char **p = NULL; | 359 | char **p = NULL; |
360 | 360 | ||
361 | if ((strcasecmp(key, "replaygain_track_gain") == 0) | 361 | if (((strcasecmp(key, "replaygain_track_gain") == 0) |
362 | || ((strcasecmp(key, "rg_radio") == 0) && !entry->track_gain)) | 362 | || (strcasecmp(key, "rg_radio") == 0)) && !entry->track_gain) |
363 | { | 363 | { |
364 | entry->track_gain = get_replaygain(value); | 364 | entry->track_gain = get_replaygain(value); |
365 | p = &(entry->track_gain_string); | 365 | p = &(entry->track_gain_string); |
366 | } | 366 | } |
367 | else if ((strcasecmp(key, "replaygain_album_gain") == 0) | 367 | else if (((strcasecmp(key, "replaygain_album_gain") == 0) |
368 | || ((strcasecmp(key, "rg_audiophile") == 0) && !entry->album_gain)) | 368 | || (strcasecmp(key, "rg_audiophile") == 0)) && !entry->album_gain) |
369 | { | 369 | { |
370 | entry->album_gain = get_replaygain(value); | 370 | entry->album_gain = get_replaygain(value); |
371 | p = &(entry->album_gain_string); | 371 | p = &(entry->album_gain_string); |
372 | } | 372 | } |
373 | else if ((strcasecmp(key, "replaygain_track_peak") == 0) | 373 | else if (((strcasecmp(key, "replaygain_track_peak") == 0) |
374 | || ((strcasecmp(key, "rg_peak") == 0) && !entry->track_peak)) | 374 | || (strcasecmp(key, "rg_peak") == 0)) && !entry->track_peak) |
375 | { | 375 | { |
376 | entry->track_peak = get_replaypeak(value); | 376 | entry->track_peak = get_replaypeak(value); |
377 | } | 377 | } |
378 | else if (strcasecmp(key, "replaygain_album_peak") == 0) | 378 | else if ((strcasecmp(key, "replaygain_album_peak") == 0) |
379 | && !entry->album_peak) | ||
379 | { | 380 | { |
380 | entry->album_peak = get_replaypeak(value); | 381 | entry->album_peak = get_replaypeak(value); |
381 | } | 382 | } |
@@ -455,14 +456,14 @@ static long get_rva_values(const char *frame, long *gain, long *peak, | |||
455 | long parse_replaygain_rva(const char* key, const char* value, | 456 | long parse_replaygain_rva(const char* key, const char* value, |
456 | struct mp3entry* entry, char* buffer, int length) | 457 | struct mp3entry* entry, char* buffer, int length) |
457 | { | 458 | { |
458 | if ((strcasecmp(key, "track") == 0) && *value == MASTER_CHANNEL | 459 | /* Values will be overwritten if they already exist. This gives priority to |
459 | && !entry->track_gain && !entry->track_peak) | 460 | replaygain in RVA2 fields over TXXX fields for ID3v2.4. */ |
461 | if ((strcasecmp(key, "track") == 0) && *value == MASTER_CHANNEL) | ||
460 | { | 462 | { |
461 | return get_rva_values(value + 1, &(entry->track_gain), &(entry->track_peak), | 463 | return get_rva_values(value + 1, &(entry->track_gain), &(entry->track_peak), |
462 | &(entry->track_gain_string), buffer, length); | 464 | &(entry->track_gain_string), buffer, length); |
463 | } | 465 | } |
464 | else if ((strcasecmp(key, "album") == 0) && *value == MASTER_CHANNEL | 466 | else if ((strcasecmp(key, "album") == 0) && *value == MASTER_CHANNEL) |
465 | && !entry->album_gain && !entry->album_peak) | ||
466 | { | 467 | { |
467 | return get_rva_values(value + 1, &(entry->album_gain), &(entry->album_peak), | 468 | return get_rva_values(value + 1, &(entry->album_gain), &(entry->album_peak), |
468 | &(entry->album_gain_string), buffer, length); | 469 | &(entry->album_gain_string), buffer, length); |