Audacity 3.2.0
Public Member Functions | Static Public Member Functions | Public Attributes | List of all members
EffectBassTreble::Instance Struct Reference
Inheritance diagram for EffectBassTreble::Instance:
[legend]
Collaboration diagram for EffectBassTreble::Instance:
[legend]

Public Member Functions

 Instance (const PerTrackEffect &effect)
 
bool ProcessInitialize (EffectSettings &settings, double sampleRate, ChannelNames chanMap) override
 
size_t ProcessBlock (EffectSettings &settings, const float *const *inBlock, float *const *outBlock, size_t blockLen) override
 Called for destructive effect computation. More...
 
bool RealtimeInitialize (EffectSettings &settings, double) override
 
bool RealtimeAddProcessor (EffectSettings &settings, EffectOutputs *pOutputs, unsigned numChannels, float sampleRate) override
 
bool RealtimeFinalize (EffectSettings &settings) noexcept override
 
size_t RealtimeProcess (size_t group, EffectSettings &settings, const float *const *inbuf, float *const *outbuf, size_t numSamples) override
 
unsigned GetAudioInCount () const override
 How many input buffers to allocate at once. More...
 
unsigned GetAudioOutCount () const override
 How many output buffers to allocate at once. More...
 
- Public Member Functions inherited from PerTrackEffect::Instance
 Instance (const PerTrackEffect &processor)
 
 ~Instance () override
 
bool Process (EffectSettings &settings) final
 Uses the other virtual functions of this class. More...
 
bool ProcessInitialize (EffectSettings &settings, double sampleRate, ChannelNames chanMap) override
 
bool ProcessFinalize () noexcept override
 
- Public Member Functions inherited from EffectInstanceEx
virtual bool Init ()
 Call once to set up state for whole list of tracks to be processed. More...
 
virtual bool Process (EffectSettings &settings)=0
 Actually do the effect here. More...
 
 ~EffectInstanceEx () override
 
- Public Member Functions inherited from EffectInstance
virtual ~EffectInstance ()
 
virtual size_t GetBlockSize () const =0
 
virtual size_t SetBlockSize (size_t maxBlockSize)=0
 
virtual unsigned GetAudioInCount () const =0
 How many input buffers to allocate at once. More...
 
virtual unsigned GetAudioOutCount () const =0
 How many output buffers to allocate at once. More...
 
virtual bool RealtimeInitialize (EffectSettings &settings, double sampleRate)
 
virtual bool RealtimeAddProcessor (EffectSettings &settings, EffectOutputs *pOutputs, unsigned numChannels, float sampleRate)
 
virtual bool RealtimeSuspend ()
 
virtual bool RealtimeResume ()
 
virtual std::unique_ptr< MessageMakeMessage () const
 Called on the main thread, in which the result may be cloned. More...
 
virtual bool UsesMessages () const noexcept
 
virtual bool RealtimeProcessStart (MessagePackage &package)
 settings are possibly changed, since last call, by an asynchronous dialog More...
 
virtual size_t RealtimeProcess (size_t group, EffectSettings &settings, const float *const *inBuf, float *const *outBuf, size_t numSamples)
 
virtual bool RealtimeProcessEnd (EffectSettings &settings) noexcept
 settings can be updated to let a dialog change appearance at idle More...
 
virtual bool RealtimeFinalize (EffectSettings &settings) noexcept
 
virtual size_t GetTailSize () const
 
virtual SampleCount GetLatency (const EffectSettings &settings, double sampleRate) const
 
virtual bool NeedsDither () const
 
virtual bool ProcessInitialize (EffectSettings &settings, double sampleRate, ChannelNames chanMap)=0
 
virtual bool ProcessFinalize () noexcept=0
 
virtual size_t ProcessBlock (EffectSettings &settings, const float *const *inBlock, float *const *outBlock, size_t blockLen)=0
 Called for destructive effect computation. More...
 
- Public Member Functions inherited from EffectInstanceWithBlockSize
 ~EffectInstanceWithBlockSize () override
 
size_t GetBlockSize () const override
 
size_t SetBlockSize (size_t maxBlockSize) override
 

Static Public Member Functions

static void InstanceInit (EffectSettings &settings, EffectBassTrebleState &data, float sampleRate)
 
static size_t InstanceProcess (EffectSettings &settings, EffectBassTrebleState &data, const float *const *inBlock, float *const *outBlock, size_t blockLen)
 
static void Coefficients (double hz, double slope, double gain, double samplerate, int type, double &a0, double &a1, double &a2, double &b0, double &b1, double &b2)
 
static float DoFilter (EffectBassTrebleState &data, float in)
 

Public Attributes

EffectBassTrebleState mState
 
std::vector< EffectBassTreble::InstancemSlaves
 

Additional Inherited Members

- Public Types inherited from EffectInstance
using Message = EffectSettingsAccess::Message
 
using SampleCount = uint64_t
 
- Protected Attributes inherited from PerTrackEffect::Instance
const PerTrackEffectmProcessor
 
- Protected Attributes inherited from EffectInstanceWithBlockSize
size_t mBlockSize { 0 }
 

Detailed Description

Definition at line 107 of file BassTreble.cpp.

Constructor & Destructor Documentation

◆ Instance()

EffectBassTreble::Instance::Instance ( const PerTrackEffect effect)
inlineexplicit

Definition at line 111 of file BassTreble.cpp.

Member Function Documentation

◆ Coefficients()

void EffectBassTreble::Instance::Coefficients ( double  hz,
double  slope,
double  gain,
double  samplerate,
int  type,
double &  a0,
double &  a1,
double &  a2,
double &  b0,
double &  b1,
double &  b2 
)
static

Definition at line 462 of file BassTreble.cpp.

465{
466 double w = 2 * M_PI * hz / samplerate;
467 double a = exp(log(10.0) * gain / 40);
468 double b = sqrt((a * a + 1) / slope - (pow((a - 1), 2)));
469
470 if (type == kBass)
471 {
472 b0 = a * ((a + 1) - (a - 1) * cos(w) + b * sin(w));
473 b1 = 2 * a * ((a - 1) - (a + 1) * cos(w));
474 b2 = a * ((a + 1) - (a - 1) * cos(w) - b * sin(w));
475 a0 = ((a + 1) + (a - 1) * cos(w) + b * sin(w));
476 a1 = -2 * ((a - 1) + (a + 1) * cos(w));
477 a2 = (a + 1) + (a - 1) * cos(w) - b * sin(w);
478 }
479 else //assumed kTreble
480 {
481 b0 = a * ((a + 1) + (a - 1) * cos(w) + b * sin(w));
482 b1 = -2 * a * ((a - 1) + (a + 1) * cos(w));
483 b2 = a * ((a + 1) + (a - 1) * cos(w) - b * sin(w));
484 a0 = ((a + 1) - (a - 1) * cos(w) + b * sin(w));
485 a1 = 2 * ((a - 1) - (a + 1) * cos(w));
486 a2 = (a + 1) - (a - 1) * cos(w) - b * sin(w);
487 }
488}
@ kBass
Definition: BassTreble.cpp:44
#define M_PI
Definition: Distortion.cpp:30
__finl float_x4 __vecc sqrt(const float_x4 &a)

References kBass, M_PI, and staffpad::audio::simd::sqrt().

Here is the call graph for this function:

◆ DoFilter()

float EffectBassTreble::Instance::DoFilter ( EffectBassTrebleState data,
float  in 
)
static

Definition at line 490 of file BassTreble.cpp.

491{
492 // Bass filter
493 float out = (data.b0Bass * in + data.b1Bass * data.xn1Bass + data.b2Bass * data.xn2Bass -
494 data.a1Bass * data.yn1Bass - data.a2Bass * data.yn2Bass) / data.a0Bass;
495 data.xn2Bass = data.xn1Bass;
496 data.xn1Bass = in;
497 data.yn2Bass = data.yn1Bass;
498 data.yn1Bass = out;
499
500 // Treble filter
501 in = out;
502 out = (data.b0Treble * in + data.b1Treble * data.xn1Treble + data.b2Treble * data.xn2Treble -
503 data.a1Treble * data.yn1Treble - data.a2Treble * data.yn2Treble) / data.a0Treble;
504 data.xn2Treble = data.xn1Treble;
505 data.xn1Treble = in;
506 data.yn2Treble = data.yn1Treble;
507 data.yn1Treble = out;
508
509 return out;
510}

References EffectBassTrebleState::a0Bass, EffectBassTrebleState::a0Treble, EffectBassTrebleState::a1Bass, EffectBassTrebleState::a1Treble, EffectBassTrebleState::a2Bass, EffectBassTrebleState::a2Treble, EffectBassTrebleState::b0Bass, EffectBassTrebleState::b0Treble, EffectBassTrebleState::b1Bass, EffectBassTrebleState::b1Treble, EffectBassTrebleState::b2Bass, EffectBassTrebleState::b2Treble, EffectBassTrebleState::xn1Bass, EffectBassTrebleState::xn1Treble, EffectBassTrebleState::xn2Bass, EffectBassTrebleState::xn2Treble, EffectBassTrebleState::yn1Bass, EffectBassTrebleState::yn1Treble, EffectBassTrebleState::yn2Bass, and EffectBassTrebleState::yn2Treble.

◆ GetAudioInCount()

unsigned EffectBassTreble::Instance::GetAudioInCount ( ) const
overridevirtual

How many input buffers to allocate at once.

If the instance processes channels independently, this can return 1 The result is not necessarily well defined before RealtimeInitialize

Implements EffectInstance.

Definition at line 199 of file BassTreble.cpp.

200{
201 return 1;
202}

◆ GetAudioOutCount()

unsigned EffectBassTreble::Instance::GetAudioOutCount ( ) const
overridevirtual

How many output buffers to allocate at once.

The result is not necessarily well defined before RealtimeInitialize

Implements EffectInstance.

Definition at line 204 of file BassTreble.cpp.

205{
206 return 1;
207}

◆ InstanceInit()

void EffectBassTreble::Instance::InstanceInit ( EffectSettings settings,
EffectBassTrebleState data,
float  sampleRate 
)
static

Definition at line 384 of file BassTreble.cpp.

385{
386 auto& ms = GetSettings(settings);
387
388 data.samplerate = sampleRate;
389 data.slope = 0.4f; // same slope for both filters
390 data.hzBass = 250.0f; // could be tunable in a more advanced version
391 data.hzTreble = 4000.0f; // could be tunable in a more advanced version
392
393 data.a0Bass = 1;
394 data.a1Bass = 0;
395 data.a2Bass = 0;
396 data.b0Bass = 0;
397 data.b1Bass = 0;
398 data.b2Bass = 0;
399
400 data.a0Treble = 1;
401 data.a1Treble = 0;
402 data.a2Treble = 0;
403 data.b0Treble = 0;
404 data.b1Treble = 0;
405 data.b2Treble = 0;
406
407 data.xn1Bass = 0;
408 data.xn2Bass = 0;
409 data.yn1Bass = 0;
410 data.yn2Bass = 0;
411
412 data.xn1Treble = 0;
413 data.xn2Treble = 0;
414 data.yn1Treble = 0;
415 data.yn2Treble = 0;
416
417 data.bass = -1;
418 data.treble = -1;
419 data.gain = DB_TO_LINEAR(ms.mGain);
420
421}
#define DB_TO_LINEAR(x)
Definition: MemoryX.h:337
static Settings & settings()
Definition: TrackInfo.cpp:69
static EffectBassTrebleSettings & GetSettings(EffectSettings &settings)
Assume settings originated from MakeSettings() and copies thereof.
Definition: Effect.h:166

References EffectBassTrebleState::a0Bass, EffectBassTrebleState::a0Treble, EffectBassTrebleState::a1Bass, EffectBassTrebleState::a1Treble, EffectBassTrebleState::a2Bass, EffectBassTrebleState::a2Treble, EffectBassTrebleState::b0Bass, EffectBassTrebleState::b0Treble, EffectBassTrebleState::b1Bass, EffectBassTrebleState::b1Treble, EffectBassTrebleState::b2Bass, EffectBassTrebleState::b2Treble, EffectBassTrebleState::bass, DB_TO_LINEAR, EffectBassTrebleState::gain, EffectWithSettings< EffectBassTrebleSettings, StatelessPerTrackEffect >::GetSettings(), EffectBassTrebleState::hzBass, EffectBassTrebleState::hzTreble, anonymous_namespace{ClipSegmentTest.cpp}::sampleRate, EffectBassTrebleState::samplerate, settings(), EffectBassTrebleState::slope, EffectBassTrebleState::treble, EffectBassTrebleState::xn1Bass, EffectBassTrebleState::xn1Treble, EffectBassTrebleState::xn2Bass, EffectBassTrebleState::xn2Treble, EffectBassTrebleState::yn1Bass, EffectBassTrebleState::yn1Treble, EffectBassTrebleState::yn2Bass, and EffectBassTrebleState::yn2Treble.

Here is the call graph for this function:

◆ InstanceProcess()

size_t EffectBassTreble::Instance::InstanceProcess ( EffectSettings settings,
EffectBassTrebleState data,
const float *const *  inBlock,
float *const *  outBlock,
size_t  blockLen 
)
static

Definition at line 423 of file BassTreble.cpp.

426{
427 auto& ms = GetSettings(settings);
428
429 const float *ibuf = inBlock[0];
430 float *obuf = outBlock[0];
431
432 // Set value to ensure correct rounding
433 double oldBass = DB_TO_LINEAR(ms.mBass);
434 double oldTreble = DB_TO_LINEAR(ms.mTreble);
435
436 data.gain = DB_TO_LINEAR(ms.mGain);
437
438 // Compute coefficients of the low shelf biquand IIR filter
439 if (data.bass != oldBass)
440 Coefficients(data.hzBass, data.slope, ms.mBass, data.samplerate, kBass,
441 data.a0Bass, data.a1Bass, data.a2Bass,
442 data.b0Bass, data.b1Bass, data.b2Bass);
443
444 // Compute coefficients of the high shelf biquand IIR filter
445 if (data.treble != oldTreble)
446 Coefficients(data.hzTreble, data.slope, ms.mTreble, data.samplerate, kTreble,
447 data.a0Treble, data.a1Treble, data.a2Treble,
448 data.b0Treble, data.b1Treble, data.b2Treble);
449
450 for (decltype(blockLen) i = 0; i < blockLen; i++) {
451 obuf[i] = DoFilter(data, ibuf[i]) * data.gain;
452 }
453
454 return blockLen;
455}
@ kTreble
Definition: BassTreble.cpp:45
static float DoFilter(EffectBassTrebleState &data, float in)
Definition: BassTreble.cpp:490
static void Coefficients(double hz, double slope, double gain, double samplerate, int type, double &a0, double &a1, double &a2, double &b0, double &b1, double &b2)
Definition: BassTreble.cpp:462

References EffectBassTrebleState::a0Bass, EffectBassTrebleState::a0Treble, EffectBassTrebleState::a1Bass, EffectBassTrebleState::a1Treble, EffectBassTrebleState::a2Bass, EffectBassTrebleState::a2Treble, EffectBassTrebleState::b0Bass, EffectBassTrebleState::b0Treble, EffectBassTrebleState::b1Bass, EffectBassTrebleState::b1Treble, EffectBassTrebleState::b2Bass, EffectBassTrebleState::b2Treble, EffectBassTrebleState::bass, DB_TO_LINEAR, EffectBassTrebleState::gain, EffectWithSettings< EffectBassTrebleSettings, StatelessPerTrackEffect >::GetSettings(), EffectBassTrebleState::hzBass, EffectBassTrebleState::hzTreble, kBass, kTreble, EffectBassTrebleState::samplerate, settings(), EffectBassTrebleState::slope, and EffectBassTrebleState::treble.

Here is the call graph for this function:

◆ ProcessBlock()

size_t EffectBassTreble::Instance::ProcessBlock ( EffectSettings settings,
const float *const *  inBlock,
float *const *  outBlock,
size_t  blockLen 
)
overridevirtual

Called for destructive effect computation.

Implements EffectInstance.

Definition at line 217 of file BassTreble.cpp.

219{
220 return InstanceProcess(settings, mState, inBlock, outBlock, blockLen);
221}
static size_t InstanceProcess(EffectSettings &settings, EffectBassTrebleState &data, const float *const *inBlock, float *const *outBlock, size_t blockLen)
Definition: BassTreble.cpp:423
EffectBassTrebleState mState
Definition: BassTreble.cpp:149

References mState, and settings().

Here is the call graph for this function:

◆ ProcessInitialize()

bool EffectBassTreble::Instance::ProcessInitialize ( EffectSettings settings,
double  sampleRate,
ChannelNames  chanMap 
)
overridevirtual

Called at start of destructive processing, for each (mono/stereo) track Default implementation does nothing, returns true

Parameters
chanMapnull or array terminated with ChannelNameEOL. Do not retain the pointer
Postcondition
GetAudioInCount() and GetAudioOutCount() are well defined

Implements EffectInstance.

Definition at line 209 of file BassTreble.cpp.

211{
213 return true;
214}
static void InstanceInit(EffectSettings &settings, EffectBassTrebleState &data, float sampleRate)
Definition: BassTreble.cpp:384

References mState, anonymous_namespace{ClipSegmentTest.cpp}::sampleRate, and settings().

Here is the call graph for this function:

◆ RealtimeAddProcessor()

bool EffectBassTreble::Instance::RealtimeAddProcessor ( EffectSettings settings,
EffectOutputs pOutputs,
unsigned  numChannels,
float  sampleRate 
)
overridevirtual
Returns
success Default implementation does nothing, returns true

Reimplemented from EffectInstance.

Definition at line 230 of file BassTreble.cpp.

233{
235
236 InstanceInit(settings, slave.mState, sampleRate);
237
238 mSlaves.push_back(slave);
239
240 return true;
241}
const PerTrackEffect & mProcessor
std::vector< EffectBassTreble::Instance > mSlaves
Definition: BassTreble.cpp:150

References mState, anonymous_namespace{ClipSegmentTest.cpp}::sampleRate, and settings().

Here is the call graph for this function:

◆ RealtimeFinalize()

bool EffectBassTreble::Instance::RealtimeFinalize ( EffectSettings settings)
overridevirtualnoexcept
Returns
success Default implementation does nothing, returns true

Reimplemented from EffectInstance.

Definition at line 243 of file BassTreble.cpp.

244{
245 mSlaves.clear();
246
247 return true;
248}

◆ RealtimeInitialize()

bool EffectBassTreble::Instance::RealtimeInitialize ( EffectSettings settings,
double  sampleRate 
)
overridevirtual
Returns
success
Postcondition
GetAudioInCount() and GetAudioOutCount() are well defined

Default implementation does nothing, returns false (so assume realtime is not supported). Other member functions related to realtime return true or zero, but will not be called, unless a derived class overrides RealtimeInitialize.

Reimplemented from EffectInstance.

Definition at line 223 of file BassTreble.cpp.

224{
225 SetBlockSize(512);
226 mSlaves.clear();
227 return true;
228}
size_t SetBlockSize(size_t maxBlockSize) override

◆ RealtimeProcess()

size_t EffectBassTreble::Instance::RealtimeProcess ( size_t  group,
EffectSettings settings,
const float *const *  inBuf,
float *const *  outBuf,
size_t  numSamples 
)
overridevirtual
Returns
success Default implementation does nothing, returns 0

Reimplemented from EffectInstance.

Definition at line 250 of file BassTreble.cpp.

252{
253 if (group >= mSlaves.size())
254 return 0;
255 return InstanceProcess(settings, mSlaves[group].mState, inbuf, outbuf, numSamples);
256}

References mState, and settings().

Here is the call graph for this function:

Member Data Documentation

◆ mSlaves

std::vector<EffectBassTreble::Instance> EffectBassTreble::Instance::mSlaves

Definition at line 150 of file BassTreble.cpp.

◆ mState

EffectBassTrebleState EffectBassTreble::Instance::mState

Definition at line 149 of file BassTreble.cpp.

Referenced by RealtimeAddProcessor().


The documentation for this struct was generated from the following file: