From d303f4a5ceb02a2074f48619f8e11ae8eb04c355 Mon Sep 17 00:00:00 2001 From: "Dr. Chat" Date: Thu, 28 May 2015 22:31:55 -0500 Subject: [PATCH] Fix raw sample clamping --- src/xenia/apu/audio_decoder.cc | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/xenia/apu/audio_decoder.cc b/src/xenia/apu/audio_decoder.cc index ae5657d56..55571b140 100644 --- a/src/xenia/apu/audio_decoder.cc +++ b/src/xenia/apu/audio_decoder.cc @@ -200,15 +200,12 @@ int AudioDecoder::DecodePacket(uint8_t* output, size_t output_offset, size_t out for (int i = 0; i < decoded_frame_->nb_samples; i++) { // Raw sample should be within [-1, 1] float fRawSample = sample_array[i]; - float fScaledSample = fRawSample * ((1 << bits_) - 1); - // Clamp the sample in range - int64_t range = (1 << bits_) * 2; - if (fScaledSample > (range - 1)) { - fScaledSample = (float)range; - } else if (fScaledSample < (-range + 1)) { - fScaledSample = (float)-range; - } + // Clamp it, just in case. + fRawSample = std::min( 1.f, fRawSample); + fRawSample = std::max(-1.f, fRawSample); + + float fScaledSample = fRawSample * ((1 << bits_) - 1); // Convert the sample and output it in big endian int sample = (int)fScaledSample;