Skip to content

Commit 8bbd793

Browse files
author
-
committed
rounding through intrinsics
1 parent 744d638 commit 8bbd793

File tree

3 files changed

+12
-5
lines changed

3 files changed

+12
-5
lines changed

src/cubeb_mixer.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <climits>
1818
#include <cmath>
1919
#include <cstdlib>
20+
#include <emmintrin.h>
2021
#include <memory>
2122
#include <type_traits>
2223

@@ -377,22 +378,24 @@ MixerContext::init()
377378

378379
for (uint32_t j = 0; j < _in_ch_count; j++) {
379380
double target = _matrix[i][j] * 32768 + rem;
380-
int value = lrintf(target);
381+
int value = _mm_cvtsd_si32(_mm_set_sd(target)); // round double to int
381382
rem += target - value;
382383
sum += std::abs(value);
383384
}
384385
maxsum = std::max(maxsum, sum);
385386
}
386-
if (maxsum > 32768) {
387+
if (maxsum > 32768) { //> or >=?
387388
_clipping = true;
388389
}
389390
}
390391

391392
// FIXME quantize for integers
393+
// June 23, 2022: I made a change but have no idea what was wanted
392394
for (uint32_t i = 0; i < CHANNELS_MAX; i++) {
393395
int ch_in = 0;
394396
for (uint32_t j = 0; j < CHANNELS_MAX; j++) {
395-
_matrix32[i][j] = lrintf(_matrix[i][j] * 32768);
397+
// round double to int
398+
_matrix32[i][j] = _mm_cvtsd_si32(_mm_set_sd(_matrix[i][j] * 32768));
396399
if (_matrix[i][j]) {
397400
_matrix_ch[i][++ch_in] = j;
398401
}

src/cubeb_sndio.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <stdbool.h>
1717
#include <stdio.h>
1818
#include <stdlib.h>
19+
#include <xmmintrin.h>
1920

2021
#if defined(CUBEB_SNDIO_DEBUG)
2122
#define DPR(...) fprintf(stderr, __VA_ARGS__);
@@ -106,7 +107,8 @@ float_to_s16(void * ptr, long nsamp, float volume)
106107
int s;
107108

108109
while (nsamp-- > 0) {
109-
s = lrintf(*(src++) * mult);
110+
// round float to int
111+
s = _mm_cvt_ss2si(_mm_set_ss(*(src++) * mult));
110112
if (s < -32768)
111113
s = -32768;
112114
else if (s > 32767)

src/cubeb_wasapi.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <vector>
2525
#include <windef.h>
2626
#include <windows.h>
27+
#include <xmmintrin.h>
2728

2829
#include "cubeb-internal.h"
2930
#include "cubeb/cubeb.h"
@@ -938,7 +939,8 @@ refill(cubeb_stream * stm, void * input_buffer, long input_frames_count,
938939
case CUBEB_SAMPLE_S16NE: {
939940
short * buf = static_cast<short *>(dest);
940941
for (long i = 0; i < out_samples; ++i) {
941-
buf[i] = static_cast<short>(static_cast<float>(buf[i]) * volume);
942+
// round float to int
943+
buf[i] = _mm_cvt_ss2si(_mm_set_ss(buf[i] * volume));
942944
}
943945
break;
944946
}

0 commit comments

Comments
 (0)