summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/server/Buffer.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/server/Buffer.cpp b/src/server/Buffer.cpp
index 6d605490..a91ce1b8 100644
--- a/src/server/Buffer.cpp
+++ b/src/server/Buffer.cpp
@@ -162,17 +162,25 @@ Buffer::port_data(PortType port_type) const
const_cast<Buffer*>(this)->port_data(port_type));
}
+/** Vector fabsf */
+static inline __m128
+mm_abs_ps(__m128 x)
+{
+ const __m128 sign_mask = _mm_set1_ps(-0.0f); // -0.0f = 1 << 31
+ return _mm_andnot_ps(sign_mask, x);
+}
+
float
Buffer::peak(const Context& context) const
{
#ifdef __SSE__
const __m128* const vbuf = (const __m128* const)samples();
- __m128 vpeak = vbuf[0];
+ __m128 vpeak = mm_abs_ps(vbuf[0]);
const SampleCount nblocks = context.nframes() / 4;
- // First, find the vector max of the buffer
+ // First, find the vector absolute max of the buffer
for (SampleCount i = 1; i < nblocks; ++i) {
- vpeak = _mm_max_ps(vpeak, vbuf[i]);
+ vpeak = _mm_max_ps(vpeak, mm_abs_ps(vbuf[i]));
}
// Now we need the single max of vpeak
@@ -199,7 +207,7 @@ Buffer::peak(const Context& context) const
const Sample* const buf = samples();
float peak = 0.0f;
for (SampleCount i = 0; i < context.nframes(); ++i) {
- peak = fmaxf(peak, buf[i]);
+ peak = fmaxf(peak, fabsf(buf[i]));
}
return peak;
#endif