aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/alu.cpp
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2019-03-25 22:52:15 -0700
committerChris Robinson <[email protected]>2019-03-25 22:52:15 -0700
commita57116f7888a0fdbdac9ed01ce8237c8296a2f65 (patch)
tree5a8816946948c6c3b5d1e4020a58c5d1ea31348b /Alc/alu.cpp
parent0a4d1c858ec21b948838f5e9b464b5534d497bca (diff)
Scale floats directly to 32-bit integer values
Rather than scaling to a 25-bit integer and shifting for the extra 7 bits. This should improve precision for values closer to 0.
Diffstat (limited to 'Alc/alu.cpp')
-rw-r--r--Alc/alu.cpp10
1 files changed, 5 insertions, 5 deletions
diff --git a/Alc/alu.cpp b/Alc/alu.cpp
index 0e91844b..6abc26e1 100644
--- a/Alc/alu.cpp
+++ b/Alc/alu.cpp
@@ -1587,12 +1587,12 @@ template<> inline ALfloat SampleConv(ALfloat val) noexcept
{ return val; }
template<> inline ALint SampleConv(ALfloat val) noexcept
{
- /* Floats have a 23-bit mantissa. There is an implied 1 bit in the mantissa
- * along with the sign bit, giving 25 bits total, so [-16777216, +16777216]
- * is the max value a normalized float can be scaled to before losing
- * precision.
+ /* Floats have a 23-bit mantissa, plus an implied 1 bit and a sign bit.
+ * This means a normalized float has at most 25 bits of signed precision.
+ * When scaling and clamping for a signed 32-bit integer, these following
+ * values are the best a float can give.
*/
- return fastf2i(clampf(val*16777216.0f, -16777216.0f, 16777215.0f))<<7;
+ return fastf2i(clampf(val*2147483648.0f, -2147483648.0f, 2147483520.0f));
}
template<> inline ALshort SampleConv(ALfloat val) noexcept
{ return fastf2i(clampf(val*32768.0f, -32768.0f, 32767.0f)); }