decoder/mpcdec: fix bogus ReplayGain values

Apparently, libmpcdec sets gain/peak variables to zero if they are not
present.  This clashes with our formula and results in bogus values
which cause noise during playback.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/640
This commit is contained in:
Max Kellermann 2019-09-13 19:41:54 +02:00
parent 9270829b5b
commit 92495d2b0b
2 changed files with 9 additions and 3 deletions

1
NEWS
View File

@ -1,6 +1,7 @@
ver 0.21.15 (not yet released)
* decoder
- dsdiff, dsf: fix displayed bit rate
- mpcdec: fix bogus ReplayGain values
* output
- solaris: fix build with glibc 2.30

View File

@ -141,8 +141,12 @@ static constexpr ReplayGainTuple
ImportMpcdecReplayGain(mpc_uint16_t gain, mpc_uint16_t peak) noexcept
{
auto t = ReplayGainTuple::Undefined();
t.gain = MPC_OLD_GAIN_REF - (gain / 256.);
t.peak = pow(10, peak / 256. / 20) / 32767;
if (gain != 0 && peak != 0) {
t.gain = MPC_OLD_GAIN_REF - (gain / 256.);
t.peak = pow(10, peak / 256. / 20) / 32767;
}
return t;
}
@ -187,7 +191,8 @@ mpcdec_decode(DecoderClient &client, InputStream &is)
{
const auto rgi = ImportMpcdecReplayGain(info);
client.SubmitReplayGain(&rgi);
if (rgi.IsDefined())
client.SubmitReplayGain(&rgi);
}
client.Ready(audio_format, is.IsSeekable(),