#pragma once
#include "BuildSettings.h"
#include "WindowedFIR.h"
#include "Mixer.h"
#include "MixerSettings.h"
OPENMPT_NAMESPACE_BEGIN
#ifdef LIBOPENMPT_BUILD
#define MPT_RESAMPLER_TABLES_CACHED
#define MPT_RESAMPLER_TABLES_CACHED_ONSTARTUP
#endif
#define SINC_WIDTH 8
#define SINC_PHASES_BITS 12
#define SINC_PHASES (1<<SINC_PHASES_BITS)
#ifdef MPT_INTMIXER
typedef int16 SINC_TYPE;
#define SINC_QUANTSHIFT 15
#else
typedef mixsample_t SINC_TYPE;
#endif
#define SINC_MASK (SINC_PHASES-1)
STATIC_ASSERT((SINC_MASK & 0xffff) == SINC_MASK);
class CResamplerSettings
{
public:
ResamplingMode SrcMode;
double gdWFIRCutoff;
uint8 gbWFIRType;
bool emulateAmiga;
public:
MPT_CONSTEXPR11_FUN CResamplerSettings()
: SrcMode(Resampling::Default())
, gdWFIRCutoff(0.97)
, gbWFIRType(WFIR_KAISER4T)
, emulateAmiga(false)
{
}
bool operator == (const CResamplerSettings &cmp) const
{
return SrcMode == cmp.SrcMode && gdWFIRCutoff == cmp.gdWFIRCutoff && gbWFIRType == cmp.gbWFIRType && emulateAmiga == cmp.emulateAmiga;
}
bool operator != (const CResamplerSettings &cmp) const { return !(*this == cmp); }
};
class CResampler
{
public:
CResamplerSettings m_Settings;
CWindowedFIR m_WindowedFIR;
static const int16 FastSincTable[256 * 4];
#ifdef MODPLUG_TRACKER
static bool StaticTablesInitialized;
#define RESAMPLER_TABLE static
#else
#define RESAMPLER_TABLE
#endif
RESAMPLER_TABLE SINC_TYPE gKaiserSinc[SINC_PHASES * 8]; RESAMPLER_TABLE SINC_TYPE gDownsample13x[SINC_PHASES * 8]; RESAMPLER_TABLE SINC_TYPE gDownsample2x[SINC_PHASES * 8];
#ifndef MPT_INTMIXER
RESAMPLER_TABLE mixsample_t FastSincTablef[256 * 4]; RESAMPLER_TABLE mixsample_t LinearTablef[256]; #endif
#undef RESAMPLER_TABLE
private:
CResamplerSettings m_OldSettings;
public:
CResampler(bool fresh_generate=false)
{
if(fresh_generate)
{
InitializeTablesFromScratch(true);
} else
{
InitializeTables();
}
}
void InitializeTables()
{
#if defined(MPT_RESAMPLER_TABLES_CACHED)
InitializeTablesFromCache();
#else
InitializeTablesFromScratch(true);
#endif
}
void UpdateTables()
{
InitializeTablesFromScratch(false);
}
private:
void InitFloatmixerTables();
void InitializeTablesFromScratch(bool force=false);
#ifdef MPT_RESAMPLER_TABLES_CACHED
void InitializeTablesFromCache();
#endif
};
OPENMPT_NAMESPACE_END