mirror of https://github.com/sipwise/sems.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.0 KiB
114 lines
3.0 KiB
#ifndef _RESAMP_H
|
|
#define _RESAMP_H
|
|
|
|
#include <vector>
|
|
|
|
using std::vector;
|
|
|
|
class Resample
|
|
{
|
|
protected:
|
|
int filter_delay;
|
|
unsigned current;
|
|
unsigned curfrc;
|
|
unsigned pad_samples;
|
|
vector<float> samples;
|
|
|
|
public:
|
|
Resample();
|
|
virtual ~Resample() {};
|
|
|
|
/* put num_samples from memory pointed to by samples into state
|
|
* returns -1 on error (must be a realloc, memory error)
|
|
* number of samples put into state (currently always = num_samples) otherwise */
|
|
virtual int put_samples(signed short* samples, unsigned int num_samples);
|
|
|
|
|
|
/*
|
|
* resample by rate
|
|
*
|
|
* dst - pointer where to put at most num_samples (resampled) samples
|
|
* rate - rate at which to resample (e.g. 0.5 - half the original samplerate)
|
|
* num_samples - number of samples to put into dst (for stereo 1 sample means 2 samples values, left and right)
|
|
* rstate - resampling state
|
|
*
|
|
* returns number of samples actually put into dst
|
|
*
|
|
*/
|
|
virtual int resample(signed short *dst, float rate, unsigned num_samples) = 0;
|
|
};
|
|
|
|
class ResampleSincMono : public Resample
|
|
{
|
|
protected:
|
|
static float sinc[16][256];
|
|
static bool sinc_initialized;
|
|
|
|
private:
|
|
void init_sinc(void);
|
|
static inline float upsample(float *src, unsigned int current, unsigned int curfrc);
|
|
static inline float downsample(float *src, unsigned int current, unsigned int curfrc, unsigned long long sinc_increment, float scale);
|
|
|
|
public:
|
|
ResampleSincMono();
|
|
ResampleSincMono(bool do_pad, float max_rate);
|
|
virtual ~ResampleSincMono() {};
|
|
virtual int resample(signed short *dst, float rate, unsigned num_samples);
|
|
};
|
|
|
|
class ResampleSincStereo : public ResampleSincMono
|
|
{
|
|
private:
|
|
static inline float upsample(float *src, unsigned int current, unsigned int curfrc);
|
|
static inline float downsample(float *src, unsigned int current, unsigned int curfrc, unsigned long long sinc_increment, float scale);
|
|
|
|
public:
|
|
ResampleSincStereo();
|
|
ResampleSincStereo(bool do_pad, float max_rate);
|
|
virtual ~ResampleSincStereo() {};
|
|
virtual int resample(signed short *dst, float rate, unsigned num_samples);
|
|
};
|
|
|
|
class ResampleLinMono : public Resample
|
|
{
|
|
private:
|
|
static inline float updownsample(float *src, unsigned int current, unsigned int curfrc);
|
|
|
|
public:
|
|
ResampleLinMono();
|
|
ResampleLinMono(bool do_pad, float max_rate);
|
|
virtual ~ResampleLinMono() {};
|
|
virtual int resample(signed short *dst, float rate, unsigned num_samples);
|
|
};
|
|
|
|
class ResampleLinStereo : public Resample
|
|
{
|
|
private:
|
|
static inline float updownsample(float *src, unsigned int current, unsigned int curfrc);
|
|
|
|
public:
|
|
ResampleLinStereo();
|
|
ResampleLinStereo(bool do_pad, float max_rate);
|
|
virtual ~ResampleLinStereo() {};
|
|
virtual int resample(signed short *dst, float rate, unsigned num_samples);
|
|
};
|
|
|
|
class ResampleFactory
|
|
{
|
|
public:
|
|
enum interpolType {
|
|
INTERPOL_LINEAR,
|
|
INTERPOL_SINC
|
|
};
|
|
|
|
enum sampleType {
|
|
SAMPLE_MONO,
|
|
SAMPLE_STEREO
|
|
};
|
|
|
|
static Resample* createResampleObj(bool doPad, float maxRatio, interpolType interpol_type, sampleType sample_type);
|
|
static void destroyResampleObj(Resample *Obj) { delete Obj; };
|
|
};
|
|
|
|
#endif
|