From 8bbd793ae67c36a16ae3a2a59fed19b4f23a77a9 Mon Sep 17 00:00:00 2001 From: - <> Date: Thu, 23 Jun 2022 01:32:08 -0400 Subject: [PATCH] rounding through intrinsics --- src/cubeb_mixer.cpp | 9 ++++++--- src/cubeb_sndio.c | 4 +++- src/cubeb_wasapi.cpp | 4 +++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/cubeb_mixer.cpp b/src/cubeb_mixer.cpp index 74bab713..0a3366ed 100644 --- a/src/cubeb_mixer.cpp +++ b/src/cubeb_mixer.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -377,22 +378,24 @@ MixerContext::init() for (uint32_t j = 0; j < _in_ch_count; j++) { double target = _matrix[i][j] * 32768 + rem; - int value = lrintf(target); + int value = _mm_cvtsd_si32(_mm_set_sd(target)); // round double to int rem += target - value; sum += std::abs(value); } maxsum = std::max(maxsum, sum); } - if (maxsum > 32768) { + if (maxsum > 32768) { //> or >=? _clipping = true; } } // FIXME quantize for integers + // June 23, 2022: I made a change but have no idea what was wanted for (uint32_t i = 0; i < CHANNELS_MAX; i++) { int ch_in = 0; for (uint32_t j = 0; j < CHANNELS_MAX; j++) { - _matrix32[i][j] = lrintf(_matrix[i][j] * 32768); + // round double to int + _matrix32[i][j] = _mm_cvtsd_si32(_mm_set_sd(_matrix[i][j] * 32768)); if (_matrix[i][j]) { _matrix_ch[i][++ch_in] = j; } diff --git a/src/cubeb_sndio.c b/src/cubeb_sndio.c index 5e11725e..d928d0c3 100644 --- a/src/cubeb_sndio.c +++ b/src/cubeb_sndio.c @@ -16,6 +16,7 @@ #include #include #include +#include #if defined(CUBEB_SNDIO_DEBUG) #define DPR(...) fprintf(stderr, __VA_ARGS__); @@ -106,7 +107,8 @@ float_to_s16(void * ptr, long nsamp, float volume) int s; while (nsamp-- > 0) { - s = lrintf(*(src++) * mult); + // round float to int + s = _mm_cvt_ss2si(_mm_set_ss(*(src++) * mult)); if (s < -32768) s = -32768; else if (s > 32767) diff --git a/src/cubeb_wasapi.cpp b/src/cubeb_wasapi.cpp index 039ad76c..1e16d1fa 100644 --- a/src/cubeb_wasapi.cpp +++ b/src/cubeb_wasapi.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include "cubeb-internal.h" #include "cubeb/cubeb.h" @@ -938,7 +939,8 @@ refill(cubeb_stream * stm, void * input_buffer, long input_frames_count, case CUBEB_SAMPLE_S16NE: { short * buf = static_cast(dest); for (long i = 0; i < out_samples; ++i) { - buf[i] = static_cast(static_cast(buf[i]) * volume); + // round float to int + buf[i] = _mm_cvt_ss2si(_mm_set_ss(buf[i] * volume)); } break; }