ActiveAE: clamp float values after having mixed audio
authorRainer Hochecker <fernetmenta@online.de>
Fri, 27 Sep 2013 11:00:58 +0000 (13:00 +0200)
committerRainer Hochecker <fernetmenta@online.de>
Sat, 28 Sep 2013 14:51:14 +0000 (16:51 +0200)
xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp

index 7a6732a..c0746dc 100644 (file)
@@ -1571,6 +1571,7 @@ bool CActiveAE::RunStages()
           allStreamsReady = false;
       }
 
+      bool needClamp = false;
       for (it = m_streams.begin(); it != m_streams.end() && allStreamsReady; ++it)
       {
         if ((*it)->m_paused || !(*it)->m_resampleBuffers)
@@ -1638,7 +1639,9 @@ bool CActiveAE::RunStages()
 #else
                 float* fbuffer = (float*) out->pkt->data[j]+i*nb_floats;
                 for (int k = 0; k < nb_floats; ++k)
-                  *fbuffer++ *= m_muted ? 0.0 : volume;
+                {
+                  fbuffer[k] *= m_muted ? 0.0 : volume;
+                }
 #endif
               }
             }
@@ -1701,9 +1704,21 @@ bool CActiveAE::RunStages()
                 float *src = (float*)mix->pkt->data[j]+i*nb_floats;
 #ifdef __SSE__
                 CAEUtil::SSEMulAddArray(dst, src, m_muted ? 0.0 : volume, nb_floats);
+                for (int k = 0; k < nb_floats; ++k)
+                {
+                  if (fabs(dst[k]) > 1.0f)
+                  {
+                    needClamp = true;
+                    break;
+                  }
+                }
 #else
                 for (int k = 0; k < nb_floats; ++k)
-                  *dst++ += *src++ * m_muted ? 0.0 : volume;
+                {
+                  dst[k] += src[k] * m_muted ? 0.0 : volume;
+                  if (fabs(dst[k]) > 1.0f)
+                    needClamp = true;
+                }
 #endif
               }
             }
@@ -1711,6 +1726,16 @@ bool CActiveAE::RunStages()
           }
           busy = true;
         }
+      }// for
+
+      // finally clamp samples
+      if(out && needClamp)
+      {
+        int nb_floats = out->pkt->nb_samples * out->pkt->config.channels / out->pkt->planes;
+        for(int i=0; i<out->pkt->planes; i++)
+        {
+          CAEUtil::ClampArray((float*)out->pkt->data[i], nb_floats);
+        }
       }
 
       // process output buffer, gui sounds, encode, viz