📄 taudiofilterheadphone.h
字号:
#ifndef _TAUDIOFILTERHEADPHONE_H_
#define _TAUDIOFILTERHEADPHONE_H_
#include "TaudioFilter.h"
#include "TsampleFormat.h"
struct TmixerSettings;
DECLARE_FILTER(TaudioFilterHeadphone,public,TaudioFilter)
private:
TsampleFormat oldfmt;int olddim;
Tbuffer buf;
typedef uint8_t byte_t;
struct atomic_operation_t
{
int i_source_channel_offset;
int i_dest_channel_offset;
unsigned int i_delay;/* in sample unit */
double d_amplitude_factor;
};
struct aout_filter_sys_t
{
private:
void ComputeChannelOperations (unsigned int i_rate , unsigned int i_next_atomic_operation
, int i_source_channel_offset , double d_x , double d_z
, double d_channel_amplitude_factor );
public:
size_t i_overflow_buffer_size;/* in bytes */
byte_t * p_overflow_buffer;
unsigned int i_nb_atomic_operations;
atomic_operation_t * p_atomic_operations;
int Init(const TsampleFormat &fmt,const TmixerSettings *cfg);
} *p_sys;
bool inited;
protected:
virtual int getSupportedFormats(const TfilterSettingsAudio *cfg,bool *honourPreferred) const {return TsampleFormat::SF_FLOAT32;}
public:
TaudioFilterHeadphone(IffdshowBase *Ideci,Tfilters *Iparent);
virtual bool getOutputFmt(TsampleFormat &fmt,const TfilterSettingsAudio *cfg);
virtual HRESULT process(TfilterQueue::iterator it,TsampleFormat &fmt,void *samples,size_t numsamples,const TfilterSettingsAudio *cfg0);
virtual void done(void);
virtual void onSeek(void);
};
DECLARE_FILTER(TaudioFilterHeadphone2,public,TaudioFilter)
private:
TsampleFormat oldfmt;
int indexes[6];
float in[6];
Tbuffer buf;
struct af_hrtf_s
{
public:
af_hrtf_s(const TsampleFormat &fmt);
~af_hrtf_s();
void update_ch(const float *in, const int k);
/* Lengths */
int dlbuflen, hrflen;
unsigned int basslen;
/* L, C, R, Ls, Rs channels */
std::vector<float> lf,rf,lr,rr,cf,cr;
const float *cf_ir, *af_ir, *of_ir, *ar_ir, *or_ir, *cr_ir;
int cf_o, af_o, of_o, ar_o, or_o, cr_o;
/* Bass */
std::vector<float> ba_l,ba_r;
float *ba_ir;
/* Cyclic position on the ring buffer */
int cyc_pos;
} *s;
static float passive_lock(float x);
static float conv(const int nx, const int nk, const float *sx, const float *sk,const int offset);
static const int DELAYBUFLEN=1024; /* Length of the delay buffer */
static const int HRTFFILTLEN=64; /* HRTF filter length */
static const int BASSFILTFREQ=180; /* Bass compensation filter cut (Hz) */
static const int BASSFILTLEN=193; /* Bass compensation filter length */
static const float BASSGAIN; /* Bass compensation gain */
static const float BASSCROSS; /* Bass cross talk */
static const float IRTHRESH; /* Impulse response pruning thresh. */
static const float M17_0DB;
static const float M9_03DB;
static const float M6_99DB;
static const float M4_77DB;
static const float M3_01DB;
static const float M1_76DB;
static const int CFECHODELAY=360; /* Center front echo delay (samples) */
static const float STEXPAND2; /* Stereo expansion / 2 */
static const float cf_filt[128],af_filt[128],of_filt[128],ar_filt[128],or_filt[128],cr_filt[128];
static int pulse_detect(const float *sx);
protected:
virtual int getSupportedFormats(const TfilterSettingsAudio *cfg,bool *honourPreferred) const {return TsampleFormat::SF_FLOAT32;}
public:
TaudioFilterHeadphone2(IffdshowBase *Ideci,Tfilters *Iparent);
virtual bool getOutputFmt(TsampleFormat &fmt,const TfilterSettingsAudio *cfg);
virtual HRESULT process(TfilterQueue::iterator it,TsampleFormat &fmt,void *samples,size_t numsamples,const TfilterSettingsAudio *cfg0);
virtual void done(void);
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -