diff options
Diffstat (limited to 'src/vorbis/vorbis.cc')
-rw-r--r-- | src/vorbis/vorbis.cc | 58 |
1 files changed, 41 insertions, 17 deletions
diff --git a/src/vorbis/vorbis.cc b/src/vorbis/vorbis.cc index 22111ec..fb4d67e 100644 --- a/src/vorbis/vorbis.cc +++ b/src/vorbis/vorbis.cc @@ -168,30 +168,54 @@ static bool update_tuple (OggVorbis_File * vf, Tuple & tuple) static bool update_replay_gain (OggVorbis_File * vf, ReplayGainInfo * rg_info) { - const char *rg_gain, *rg_peak; - vorbis_comment * comment = ov_comment (vf, -1); if (! comment) return false; - rg_gain = vorbis_comment_query(comment, "REPLAYGAIN_ALBUM_GAIN", 0); - if (!rg_gain) rg_gain = vorbis_comment_query(comment, "RG_AUDIOPHILE", 0); /* Old */ - rg_info->album_gain = (rg_gain != nullptr) ? str_to_double (rg_gain) : 0.0; - AUDDBG ("Album gain: %s (%f)\n", rg_gain, rg_info->album_gain); + const char * album_gain = vorbis_comment_query (comment, "REPLAYGAIN_ALBUM_GAIN", 0); + if (! album_gain) album_gain = vorbis_comment_query (comment, "RG_AUDIOPHILE", 0); /* Old */ + const char * track_gain = vorbis_comment_query (comment, "REPLAYGAIN_TRACK_GAIN", 0); + if (! track_gain) track_gain = vorbis_comment_query (comment, "RG_RADIO", 0); /* Old */ + + /* stop if we have no gain values */ + if (! album_gain && ! track_gain) + return false; + + /* fill in missing values if we can */ + if (! album_gain) + album_gain = track_gain; + if (! track_gain) + track_gain = album_gain; + + rg_info->album_gain = str_to_double (album_gain); + rg_info->track_gain = str_to_double (track_gain); - rg_gain = vorbis_comment_query(comment, "REPLAYGAIN_TRACK_GAIN", 0); - if (!rg_gain) rg_gain = vorbis_comment_query(comment, "RG_RADIO", 0); /* Old */ - rg_info->track_gain = (rg_gain != nullptr) ? str_to_double (rg_gain) : 0.0; - AUDDBG ("Track gain: %s (%f)\n", rg_gain, rg_info->track_gain); + const char * album_peak = vorbis_comment_query (comment, "REPLAYGAIN_ALBUM_PEAK", 0); + const char * track_peak = vorbis_comment_query (comment, "REPLAYGAIN_TRACK_PEAK", 0); + if (! track_peak) track_peak = vorbis_comment_query (comment, "RG_PEAK", 0); /* Old */ - rg_peak = vorbis_comment_query(comment, "REPLAYGAIN_ALBUM_PEAK", 0); - rg_info->album_peak = rg_peak != nullptr ? str_to_double (rg_peak) : 0.0; - AUDDBG ("Album peak: %s (%f)\n", rg_peak, rg_info->album_peak); + if (! album_peak && ! track_peak) + { + /* okay, we have gain but no peak values */ + rg_info->album_peak = 0; + rg_info->track_peak = 0; + } + else + { + /* fill in missing values if we can */ + if (! album_peak) + album_peak = track_peak; + if (! track_peak) + track_peak = album_peak; + + rg_info->album_peak = str_to_double (album_peak); + rg_info->track_peak = str_to_double (track_peak); + } - rg_peak = vorbis_comment_query(comment, "REPLAYGAIN_TRACK_PEAK", 0); - if (!rg_peak) rg_peak = vorbis_comment_query(comment, "RG_PEAK", 0); /* Old */ - rg_info->track_peak = rg_peak != nullptr ? str_to_double (rg_peak) : 0.0; - AUDDBG ("Track peak: %s (%f)\n", rg_peak, rg_info->track_peak); + AUDDBG ("Album gain: %s (%f)\n", album_gain, rg_info->album_gain); + AUDDBG ("Track gain: %s (%f)\n", track_gain, rg_info->track_gain); + AUDDBG ("Album peak: %s (%f)\n", album_peak, rg_info->album_peak); + AUDDBG ("Track peak: %s (%f)\n", track_peak, rg_info->track_peak); return true; } |