143 lines
2.9 KiB
C
143 lines
2.9 KiB
C
|
/*
|
||
|
* DSP.h
|
||
|
* -----
|
||
|
* Purpose: Mixing code for various DSPs (EQ, Mega-Bass, ...)
|
||
|
* Notes : Ugh... This should really be removed at some point.
|
||
|
* Authors: Olivier Lapicque
|
||
|
* OpenMPT Devs
|
||
|
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include "openmpt/all/BuildSettings.hpp"
|
||
|
|
||
|
|
||
|
OPENMPT_NAMESPACE_BEGIN
|
||
|
|
||
|
|
||
|
#ifndef NO_DSP
|
||
|
|
||
|
// Buffer Sizes
|
||
|
#define SURROUNDBUFFERSIZE 2048 // 50ms @ 48kHz
|
||
|
|
||
|
|
||
|
class CSurroundSettings
|
||
|
{
|
||
|
public:
|
||
|
uint32 m_nProLogicDepth;
|
||
|
uint32 m_nProLogicDelay;
|
||
|
public:
|
||
|
CSurroundSettings();
|
||
|
};
|
||
|
|
||
|
|
||
|
class CMegaBassSettings
|
||
|
{
|
||
|
public:
|
||
|
uint32 m_nXBassDepth;
|
||
|
uint32 m_nXBassRange;
|
||
|
public:
|
||
|
CMegaBassSettings();
|
||
|
};
|
||
|
|
||
|
|
||
|
struct BitCrushSettings
|
||
|
{
|
||
|
int m_Bits;
|
||
|
BitCrushSettings();
|
||
|
};
|
||
|
|
||
|
|
||
|
class CSurround
|
||
|
{
|
||
|
public:
|
||
|
CSurroundSettings m_Settings;
|
||
|
|
||
|
// Surround Encoding: 1 delay line + low-pass filter + high-pass filter
|
||
|
int32 nSurroundSize;
|
||
|
int32 nSurroundPos;
|
||
|
int32 nDolbyDepth;
|
||
|
|
||
|
// Surround Biquads
|
||
|
int32 nDolbyHP_Y1;
|
||
|
int32 nDolbyHP_X1;
|
||
|
int32 nDolbyLP_Y1;
|
||
|
int32 nDolbyHP_B0;
|
||
|
int32 nDolbyHP_B1;
|
||
|
int32 nDolbyHP_A1;
|
||
|
int32 nDolbyLP_B0;
|
||
|
int32 nDolbyLP_B1;
|
||
|
int32 nDolbyLP_A1;
|
||
|
|
||
|
int32 SurroundBuffer[SURROUNDBUFFERSIZE];
|
||
|
|
||
|
public:
|
||
|
CSurround();
|
||
|
public:
|
||
|
void SetSettings(const CSurroundSettings &settings) { m_Settings = settings; }
|
||
|
// [XBass level 0(quiet)-100(loud)], [cutoff in Hz 10-100]
|
||
|
bool SetXBassParameters(uint32 nDepth, uint32 nRange);
|
||
|
// [Surround level 0(quiet)-100(heavy)] [delay in ms, usually 5-40ms]
|
||
|
void SetSurroundParameters(uint32 nDepth, uint32 nDelay);
|
||
|
void Initialize(bool bReset, DWORD MixingFreq);
|
||
|
void Process(int * MixSoundBuffer, int * MixRearBuffer, int count, uint32 nChannels);
|
||
|
private:
|
||
|
void ProcessStereoSurround(int * MixSoundBuffer, int count);
|
||
|
void ProcessQuadSurround(int * MixSoundBuffer, int * MixRearBuffer, int count);
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
class CMegaBass
|
||
|
{
|
||
|
public:
|
||
|
CMegaBassSettings m_Settings;
|
||
|
|
||
|
// Bass Expansion: low-pass filter
|
||
|
int32 nXBassFlt_Y1;
|
||
|
int32 nXBassFlt_X1;
|
||
|
int32 nXBassFlt_B0;
|
||
|
int32 nXBassFlt_B1;
|
||
|
int32 nXBassFlt_A1;
|
||
|
|
||
|
// DC Removal Biquad
|
||
|
int32 nDCRFlt_Y1lf;
|
||
|
int32 nDCRFlt_X1lf;
|
||
|
int32 nDCRFlt_Y1rf;
|
||
|
int32 nDCRFlt_X1rf;
|
||
|
int32 nDCRFlt_Y1lb;
|
||
|
int32 nDCRFlt_X1lb;
|
||
|
int32 nDCRFlt_Y1rb;
|
||
|
int32 nDCRFlt_X1rb;
|
||
|
|
||
|
public:
|
||
|
CMegaBass();
|
||
|
public:
|
||
|
void SetSettings(const CMegaBassSettings &settings) { m_Settings = settings; }
|
||
|
// [XBass level 0(quiet)-100(loud)], [cutoff in Hz 10-100]
|
||
|
void SetXBassParameters(uint32 nDepth, uint32 nRange);
|
||
|
void Initialize(bool bReset, DWORD MixingFreq);
|
||
|
void Process(int * MixSoundBuffer, int * MixRearBuffer, int count, uint32 nChannels);
|
||
|
};
|
||
|
|
||
|
|
||
|
class BitCrush
|
||
|
{
|
||
|
public:
|
||
|
BitCrushSettings m_Settings;
|
||
|
public:
|
||
|
BitCrush();
|
||
|
public:
|
||
|
void SetSettings(const BitCrushSettings &settings) { m_Settings = settings; }
|
||
|
void Initialize(bool bReset, DWORD MixingFreq);
|
||
|
void Process(int * MixSoundBuffer, int * MixRearBuffer, int count, uint32 nChannels);
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif // NO_DSP
|
||
|
|
||
|
|
||
|
OPENMPT_NAMESPACE_END
|