cog/ThirdParty/libvgm/include/libvgm/emu/Resampler.h

93 lines
2.5 KiB
C

#ifndef __RESAMPLER_H__
#define __RESAMPLER_H__
#ifdef __cplusplus
extern "C"
{
#endif
#include "../stdtype.h"
#include "snddef.h" // for DEV_SMPL
#include "EmuStructs.h"
typedef struct _waveform_32bit_stereo
{
DEV_SMPL L;
DEV_SMPL R;
} WAVE_32BS;
typedef struct _resampling_state
{
UINT32 smpRateSrc;
UINT32 smpRateDst;
INT16 volumeL;
INT16 volumeR;
// Resampler Type:
// 00 - Old
// 01 - Upsampling
// 02 - Copy
// 03 - Downsampling
UINT8 resampleMode; // can be FF [auto] or Resampler Type
UINT8 resampler;
DEVFUNC_UPDATE StreamUpdate;
void* su_DataPtr;
UINT32 smpP; // Current Sample (Playback Rate)
UINT32 smpLast; // Sample Number Last
UINT32 smpNext; // Sample Number Next
WAVE_32BS lSmpl; // Last Sample
WAVE_32BS nSmpl; // Next Sample
UINT32 smplBufSize;
DEV_SMPL* smplBufs[2];
} RESMPL_STATE;
// ---- resampler helper functions (for quick/comfortable initialization) ----
/**
* @brief Sets up a the resampler to use a certain sound device.
*
* @param CAA resampler to be connected to a device
* @param devInf device to be used by the resampler
*/
void Resmpl_DevConnect(RESMPL_STATE* CAA, const DEV_INFO* devInf);
/**
* @brief Helper function to quickly set resampler configuration values.
*
* @param CAA resampler to be configured
* @param resampleMode resampling mode, 0xFF = auto
* @param volume volume gain applied during resampling process, 8.8 fixed point, 0x100 equals 100%
* @param destSampleRate sample rate of the output stream
*/
void Resmpl_SetVals(RESMPL_STATE* CAA, UINT8 resampleMode, UINT16 volume, UINT32 destSampleRate);
// ---- resampler main functions ----
/**
* @brief Initializes a resampler. The resampler must be configured and connected to a device.
*
* @param CAA resampler to be initialized
*/
void Resmpl_Init(RESMPL_STATE* CAA);
/**
* @brief Deinitializes a resampler and frees used memory.
*
* @param CAA resampler to be deinitialized
*/
void Resmpl_Deinit(RESMPL_STATE* CAA);
/**
* @brief Sets the sample rate of the sound device. Used for sample rate changes without deinit/init.
*
* @param CAA resampler whose input sample rate is changed
*/
void Resmpl_ChangeRate(void* DataPtr, UINT32 newSmplRate);
/**
* @brief Request and resample input data in order to render samples into the output buffer.
*
* @param CAA resampler to be executed
* @param samples number of output samples to be rendered
* @param smplBuffer buffer for output data
*/
void Resmpl_Execute(RESMPL_STATE* CAA, UINT32 samples, WAVE_32BS* smplBuffer);
#ifdef __cplusplus
}
#endif
#endif // __RESAMPLER_H__