📄 taudiofiltervolume.h
字号:
#ifndef _TAUDIOFILTERVOLUME_H_
#define _TAUDIOFILTERVOLUME_H_
#include "TaudioFilter.h"
#include "TvolumeSettings.h"
#include "IaudioFilterVolume.h"
class TaudioFilterVolume : public TaudioFilter, public IaudioFilterVolume
_DECLARE_FILTER(TaudioFilterVolume,TaudioFilter)
private:
static const unsigned int NSAMPLES,MIN_SAMPLE_SIZE;
int nSamples;
// Some limits
//static const int MIN_S16,MAX_S16;
// "Ideal" level
static const float MID_S16;
// Silence level
// FIXME: should be relative to the level of the samples
static const float SIL_S16;
TsampleFormat oldfmt;
TvolumeSettings oldcfg;
int volumes[6];
bool isVol;
struct Tmem
{
float avg; // average level of the sample
size_t len; // sample size (weight)
} *mem;
int idx;
static const float MUL_INIT,MUL_MIN;//,MUL_MAX;
float mul;
template<unsigned int nchannels> struct Tmultiply
{
template<class sample_t> static void processVol(sample_t * const samples,size_t numsamples,const int *volumes)
{
typedef typename TsampleFormatInfo<sample_t>::helper_t helper_t;
for (size_t i=0;i<numsamples*nchannels;)
for (unsigned int ch=0;ch<nchannels;ch++,i++)
{
helper_t yt=volumes[ch]*helper_t(samples[i])/256;
samples[i]=TsampleFormatInfo<sample_t>::limit(yt);
}
}
template<class sample_t> static void processMul(sample_t * const samples,size_t numsamples,const int *volumes,float mul)
{
if (IsSameType<sample_t,float>::value)
for (size_t i=0;i<numsamples*nchannels;)
for (unsigned int ch=0;ch<nchannels;ch++,i++)
{
float tmp=mul*float(samples[i])*volumes[ch]/256;
samples[i]=TsampleFormatInfo<sample_t>::limit(tmp);
}
else
{
typedef typename TsampleFormatInfo<sample_t>::helper_t helper_t;
helper_t mulT=helper_t(mul*(-TsampleFormatInfo<sample_t>::min()/16));
for (size_t i=0;i<numsamples*nchannels;)
for (unsigned int ch=0;ch<nchannels;ch++,i++)
{
helper_t yt=(volumes[ch]*helper_t(samples[i]))/256;
helper_t tmp=mulT*yt/(-TsampleFormatInfo<sample_t>::min()/16);
samples[i]=TsampleFormatInfo<sample_t>::limit(tmp);
}
}
}
};
template<class sample_t> void volume(sample_t* const samples,size_t numsamples,const TsampleFormat &fmt,const TvolumeSettings *cfg);
struct
{
bool have;
unsigned int volumes[6]; // 0 - 65536
} storedvolumes;
CCritSec csVolumes;
protected:
virtual bool is(const TsampleFormat &fmt,const TfilterSettingsAudio *cfg);
virtual int getSupportedFormats(const TfilterSettingsAudio *cfg,bool *honourPreferred) const {return TsampleFormat::SF_ALL_24;}
public:
TaudioFilterVolume(IffdshowBase *Ideci,Tfilters *Iparent);
virtual ~TaudioFilterVolume();
virtual HRESULT process(TfilterQueue::iterator it,TsampleFormat &fmt,void *samples,size_t numsamples,const TfilterSettingsAudio *cfg0);
virtual void onSeek(void);
virtual HRESULT queryInterface(const IID &iid,void **ptr) const;
STDMETHODIMP getVolumeData(unsigned int *nchannels,int channels[],int volumes[]);
STDMETHODIMP_(int) getCurrentNormalization(void);
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -