From bca70b87efc40595e2bb469d63c77618872bd97b Mon Sep 17 00:00:00 2001
From: Jean-Marc Valin <jmvalin@jmvalin.ca>
Date: Fri, 15 Jul 2016 10:57:21 -0400
Subject: [PATCH] Fixes opus_pcm_soft_clip() returning values slightly larger
 than +/-1 with -ffast-math

---
 src/opus.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/opus.c b/src/opus.c
index b7b0ea06c..2b47cdac6 100644
--- a/src/opus.c
+++ b/src/opus.c
@@ -104,6 +104,10 @@ OPUS_EXPORT void opus_pcm_soft_clip(float *_x, int N, int C, float *declip_mem)
 
          /* Compute a such that maxval + a*maxval^2 = 1 */
          a=(maxval-1)/(maxval*maxval);
+         /* Slightly boost "a" by 2^-24. This is just enough to ensure -ffast-math
+            does not cause output values larger than +/-1, but small enough not
+            to matter even for 24-bit output.  */
+         a += a*6e-8;
          if (x[i*C]>0)
             a = -a;
          /* Apply soft clipping */
-- 
GitLab