aboutsummaryrefslogtreecommitdiffstats
path: root/alc/mixvoice.cpp
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2019-09-26 19:24:29 -0700
committerChris Robinson <[email protected]>2019-09-26 19:24:29 -0700
commit9b64e5e0db2a778313bb873bb38f481ce40efe31 (patch)
tree4ac057e992a8720abf57e1ce548d4bda1a750f42 /alc/mixvoice.cpp
parentd50ca464cd5e4f07bc399fd244578b0b34d72aef (diff)
Implement a "fast" bsinc path
This takes advantage of the fact than when increment <= 1 (when not down- sampling), the scale factor is always 0. As a result, the scale and scale-phase deltas never contribute to the filtered output. Removing those multiply+add operations cuts half of the work done by the inner loop. Sounds that do need to down-sample (when played with a high pitch, or is 48khz on 44.1khz output, for example), still go through the normal bsinc process.
Diffstat (limited to 'alc/mixvoice.cpp')
-rw-r--r--alc/mixvoice.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/alc/mixvoice.cpp b/alc/mixvoice.cpp
index bfb3b663..58a08ce3 100644
--- a/alc/mixvoice.cpp
+++ b/alc/mixvoice.cpp
@@ -135,7 +135,7 @@ inline HrtfMixerBlendFunc SelectHrtfBlendMixer()
} // namespace
-ResamplerFunc SelectResampler(Resampler resampler)
+ResamplerFunc SelectResampler(Resampler resampler, ALuint increment)
{
switch(resampler)
{
@@ -159,6 +159,18 @@ ResamplerFunc SelectResampler(Resampler resampler)
return Resample_<CubicTag,CTag>;
case Resampler::BSinc12:
case Resampler::BSinc24:
+ if(increment <= FRACTIONONE)
+ {
+#ifdef HAVE_NEON
+ if((CPUCapFlags&CPU_CAP_NEON))
+ return Resample_<FastBSincTag,NEONTag>;
+#endif
+#ifdef HAVE_SSE
+ if((CPUCapFlags&CPU_CAP_SSE))
+ return Resample_<FastBSincTag,SSETag>;
+#endif
+ return Resample_<FastBSincTag,CTag>;
+ }
#ifdef HAVE_NEON
if((CPUCapFlags&CPU_CAP_NEON))
return Resample_<BSincTag,NEONTag>;