/*
 * 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