aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2015-10-25 14:07:58 -0700
committerChris Robinson <[email protected]>2015-10-25 14:07:58 -0700
commit90349b384fe538b0d160b5ff0485d6235b1c6f9d (patch)
tree1acef7723db132f28b3f3c4b36f5616e35ff0485
parentfc03a955e9dd58e11cb3f165423e1629d5f07935 (diff)
Use the correct position in the SSE resamplers for left-over processing
-rw-r--r--Alc/mixer_sse.c4
-rw-r--r--Alc/mixer_sse2.c5
-rw-r--r--Alc/mixer_sse3.c11
-rw-r--r--Alc/mixer_sse41.c13
4 files changed, 23 insertions, 10 deletions
diff --git a/Alc/mixer_sse.c b/Alc/mixer_sse.c
index c618f966..e67c9cca 100644
--- a/Alc/mixer_sse.c
+++ b/Alc/mixer_sse.c
@@ -182,6 +182,10 @@ void Mix_SSE(const ALfloat *data, ALuint OutChans, ALfloat (*restrict OutBuffer)
_mm_store_ps(&OutBuffer[c][OutPos+pos], dry4);
pos += 4;
} while(minsize-pos > 3);
+ /* NOTE: gain4 now represents the next four gains after the
+ * last four mixed samples, so the lowest element represents
+ * the next gain to apply.
+ */
gain = _mm_cvtss_f32(gain4);
}
/* Mix with applying left over gain steps that aren't aligned multiples of 4. */
diff --git a/Alc/mixer_sse2.c b/Alc/mixer_sse2.c
index 1787c196..a134b9a6 100644
--- a/Alc/mixer_sse2.c
+++ b/Alc/mixer_sse2.c
@@ -63,7 +63,10 @@ const ALfloat *Resample_lerp32_SSE2(const ALfloat *src, ALuint frac, ALuint incr
_mm_store_ps(pos_.f, _mm_castsi128_ps(pos4));
}
- pos = pos_.i[3];
+ /* NOTE: These four elements represent the position *after* the last four
+ * samples, so the lowest element is the next position to resample.
+ */
+ pos = pos_.i[0];
frac = _mm_cvtsi128_si32(frac4);
for(;i < numsamples;i++)
diff --git a/Alc/mixer_sse3.c b/Alc/mixer_sse3.c
index acb0338a..b673315b 100644
--- a/Alc/mixer_sse3.c
+++ b/Alc/mixer_sse3.c
@@ -78,8 +78,11 @@ const ALfloat *Resample_fir4_32_SSE3(const ALfloat *src, ALuint frac, ALuint inc
_mm_store_ps(frac_.f, _mm_castsi128_ps(frac4));
}
- pos = pos_.i[3];
- frac = frac_.i[3];
+ /* NOTE: These four elements represent the position *after* the last four
+ * samples, so the lowest element is the next position to resample.
+ */
+ pos = pos_.i[0];
+ frac = frac_.i[0];
for(;i < numsamples;i++)
{
@@ -143,8 +146,8 @@ const ALfloat *Resample_fir8_32_SSE3(const ALfloat *src, ALuint frac, ALuint inc
_mm_store_ps(frac_.f, _mm_castsi128_ps(frac4));
}
- pos = pos_.i[3];
- frac = frac_.i[3];
+ pos = pos_.i[0];
+ frac = frac_.i[0];
for(;i < numsamples;i++)
{
diff --git a/Alc/mixer_sse41.c b/Alc/mixer_sse41.c
index 4b347d32..59b99b2b 100644
--- a/Alc/mixer_sse41.c
+++ b/Alc/mixer_sse41.c
@@ -67,7 +67,10 @@ const ALfloat *Resample_lerp32_SSE41(const ALfloat *src, ALuint frac, ALuint inc
pos_.i[3] = _mm_extract_epi32(pos4, 3);
}
- pos = pos_.i[3];
+ /* NOTE: These four elements represent the position *after* the last four
+ * samples, so the lowest element is the next position to resample.
+ */
+ pos = pos_.i[0];
frac = _mm_cvtsi128_si32(frac4);
for(;i < numsamples;i++)
@@ -134,8 +137,8 @@ const ALfloat *Resample_fir4_32_SSE41(const ALfloat *src, ALuint frac, ALuint in
frac_.i[3] = _mm_extract_epi32(frac4, 3);
}
- pos = pos_.i[3];
- frac = frac_.i[3];
+ pos = pos_.i[0];
+ frac = frac_.i[0];
for(;i < numsamples;i++)
{
@@ -205,8 +208,8 @@ const ALfloat *Resample_fir8_32_SSE41(const ALfloat *src, ALuint frac, ALuint in
frac_.i[3] = _mm_extract_epi32(frac4, 3);
}
- pos = pos_.i[3];
- frac = frac_.i[3];
+ pos = pos_.i[0];
+ frac = frac_.i[0];
for(;i < numsamples;i++)
{