1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- /*
- * MixFuncTable.cpp
- * ----------------
- * Purpose: Table containing all mixer functions.
- * Notes : The Visual Studio project settings for this file have been adjusted
- * to force function inlining, so that the mixer has a somewhat acceptable
- * performance in debug mode. If you need to debug anything here, be sure
- * to disable those optimizations if needed.
- * Authors: OpenMPT Devs
- * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
- */
- #include "stdafx.h"
- #include "Mixer.h"
- #include "Snd_defs.h"
- #include "ModChannel.h"
- #include "MixFuncTable.h"
- #ifdef MPT_INTMIXER
- #include "IntMixer.h"
- #else
- #include "FloatMixer.h"
- #endif // MPT_INTMIXER
- OPENMPT_NAMESPACE_BEGIN
- namespace MixFuncTable
- {
- #ifdef MPT_INTMIXER
- using I8M = Int8MToIntS;
- using I16M = Int16MToIntS;
- using I8S = Int8SToIntS;
- using I16S = Int16SToIntS;
- #else
- using I8M = Int8MToFloatS;
- using I16M = Int16MToFloatS;
- using I8S = Int8SToFloatS;
- using I16S = Int16SToFloatS;
- #endif // MPT_INTMIXER
- // Build mix function table for given resampling, filter and ramping settings: One function each for 8-Bit / 16-Bit Mono / Stereo
- #define BuildMixFuncTableRamp(resampling, filter, ramp) \
- SampleLoop<I8M, resampling<I8M>, filter<I8M>, MixMono ## ramp<I8M> >, \
- SampleLoop<I16M, resampling<I16M>, filter<I16M>, MixMono ## ramp<I16M> >, \
- SampleLoop<I8S, resampling<I8S>, filter<I8S>, MixStereo ## ramp<I8S> >, \
- SampleLoop<I16S, resampling<I16S>, filter<I16S>, MixStereo ## ramp<I16S> >
- // Build mix function table for given resampling, filter settings: With and without ramping
- #define BuildMixFuncTableFilter(resampling, filter) \
- BuildMixFuncTableRamp(resampling, filter, NoRamp), \
- BuildMixFuncTableRamp(resampling, filter, Ramp)
- // Build mix function table for given resampling settings: With and without filter
- #define BuildMixFuncTable(resampling) \
- BuildMixFuncTableFilter(resampling, NoFilter), \
- BuildMixFuncTableFilter(resampling, ResonantFilter)
- const MixFuncInterface Functions[6 * 16] =
- {
- BuildMixFuncTable(NoInterpolation), // No SRC
- BuildMixFuncTable(LinearInterpolation), // Linear SRC
- BuildMixFuncTable(FastSincInterpolation), // Fast Sinc (Cubic Spline) SRC
- BuildMixFuncTable(PolyphaseInterpolation), // Kaiser SRC
- BuildMixFuncTable(FIRFilterInterpolation), // FIR SRC
- BuildMixFuncTable(AmigaBlepInterpolation), // Amiga emulation
- };
- #undef BuildMixFuncTableRamp
- #undef BuildMixFuncTableFilter
- #undef BuildMixFuncTable
- ResamplingIndex ResamplingModeToMixFlags(ResamplingMode resamplingMode)
- {
- switch(resamplingMode)
- {
- case SRCMODE_NEAREST: return ndxNoInterpolation;
- case SRCMODE_LINEAR: return ndxLinear;
- case SRCMODE_CUBIC: return ndxFastSinc;
- case SRCMODE_SINC8LP: return ndxKaiser;
- case SRCMODE_SINC8: return ndxFIRFilter;
- case SRCMODE_AMIGA: return ndxAmigaBlep;
- default: MPT_ASSERT_NOTREACHED();
- }
- return ndxNoInterpolation;
- }
- } // namespace MixFuncTable
- OPENMPT_NAMESPACE_END
|