diff --git a/NEWS b/NEWS index dae8a13eb..07e13ff13 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ ver 0.22.1 (not yet released) * decoder - opus: apply the OpusHead output gain even if there is no EBU R128 tag + - opus: fix track/album ReplayGain fallback * output - alsa: don't deadlock when the ALSA driver is buggy - jack, pulse: reduce the delay when stopping or pausing playback diff --git a/src/decoder/plugins/OpusDecoderPlugin.cxx b/src/decoder/plugins/OpusDecoderPlugin.cxx index e3022d8fc..0343e201c 100644 --- a/src/decoder/plugins/OpusDecoderPlugin.cxx +++ b/src/decoder/plugins/OpusDecoderPlugin.cxx @@ -268,7 +268,6 @@ MPDOpusDecoder::HandleTags(const ogg_packet &packet) { ReplayGainInfo rgi; rgi.Clear(); - rgi.track.gain = rgi.album.gain = EbuR128ToReplayGain(output_gain); TagBuilder tag_builder; AddTagHandler h(tag_builder); @@ -276,8 +275,16 @@ MPDOpusDecoder::HandleTags(const ogg_packet &packet) if (!ScanOpusTags(packet.packet, packet.bytes, &rgi, h)) return; - client.SubmitReplayGain(&rgi); - submitted_replay_gain = true; + if (rgi.IsDefined()) { + /* submit all valid EBU R128 values with output_gain + applied */ + if (rgi.track.IsDefined()) + rgi.track.gain += EbuR128ToReplayGain(output_gain); + if (rgi.album.IsDefined()) + rgi.album.gain += EbuR128ToReplayGain(output_gain); + client.SubmitReplayGain(&rgi); + submitted_replay_gain = true; + } if (!tag_builder.empty()) { Tag tag = tag_builder.Commit(); diff --git a/src/decoder/plugins/OpusTags.cxx b/src/decoder/plugins/OpusTags.cxx index c78586065..ee1d0cb22 100644 --- a/src/decoder/plugins/OpusTags.cxx +++ b/src/decoder/plugins/OpusTags.cxx @@ -61,7 +61,7 @@ ScanOneOpusTag(StringView name, StringView value, const char *endptr; const auto l = ParseInt64(value, &endptr, 10); if (endptr > value.begin() && endptr == value.end()) - rgi->track.gain += float(l) / 256.0f; + rgi->track.gain = float(l) / 256.0f; } else if (rgi != nullptr && name.EqualsIgnoreCase("R128_ALBUM_GAIN")) { /* R128_ALBUM_GAIN is a Q7.8 fixed point number in @@ -70,7 +70,7 @@ ScanOneOpusTag(StringView name, StringView value, const char *endptr; const auto l = ParseInt64(value, &endptr, 10); if (endptr > value.begin() && endptr == value.end()) - rgi->album.gain += float(l) / 256.0f; + rgi->album.gain = float(l) / 256.0f; } handler.OnPair(name, value);