Audacity 3.2.0
Public Member Functions | Public Attributes | List of all members
EffectPhaser::Instance Struct Reference
Inheritance diagram for EffectPhaser::Instance:
[legend]
Collaboration diagram for EffectPhaser::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...
 
void InstanceInit (EffectSettings &settings, EffectPhaserState &data, float sampleRate)
 
size_t InstanceProcess (EffectSettings &settings, EffectPhaserState &data, const float *const *inBlock, float *const *outBlock, size_t blockLen)
 
void Coefficients (double hz, double slope, double gain, double samplerate, int type, double &a0, double &a1, double &a2, double &b0, double &b1, double &b2)
 
float DoFilter (EffectPhaserState &data, float in)
 
- 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
 

Public Attributes

EffectPhaserState mState
 
std::vector< EffectPhaser::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 128 of file Phaser.cpp.

Constructor & Destructor Documentation

◆ Instance()

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

Definition at line 132 of file Phaser.cpp.

Member Function Documentation

◆ Coefficients()

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

◆ DoFilter()

float EffectPhaser::Instance::DoFilter ( EffectPhaserState data,
float  in 
)

◆ GetAudioInCount()

unsigned EffectPhaser::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 221 of file Phaser.cpp.

222{
223 return 1;
224}

◆ GetAudioOutCount()

unsigned EffectPhaser::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 226 of file Phaser.cpp.

227{
228 return 1;
229}

◆ InstanceInit()

void EffectPhaser::Instance::InstanceInit ( EffectSettings settings,
EffectPhaserState data,
float  sampleRate 
)

Definition at line 460 of file Phaser.cpp.

461{
462 auto& ms = GetSettings(settings);
463
464 data.samplerate = sampleRate;
465
466 for (int j = 0; j < ms.mStages; j++)
467 {
468 data.old[j] = 0;
469 }
470
471 data.skipcount = 0;
472 data.gain = 0;
473 data.fbout = 0;
474 data.laststages = 0;
475 data.outgain = 0;
476
477 return;
478}
static Settings & settings()
Definition: TrackInfo.cpp:69
double outgain
Definition: Phaser.h:35
double fbout
Definition: Phaser.h:34
double gain
Definition: Phaser.h:33
double old[NUM_STAGES]
Definition: Phaser.h:32
float samplerate
Definition: Phaser.h:30
sampleCount skipcount
Definition: Phaser.h:31
static EffectPhaserSettings & GetSettings(EffectSettings &settings)
Assume settings originated from MakeSettings() and copies thereof.
Definition: Effect.h:169

References EffectPhaserState::fbout, EffectPhaserState::gain, EffectWithSettings< EffectPhaserSettings, StatelessPerTrackEffect >::GetSettings(), EffectPhaserState::laststages, EffectPhaserState::old, EffectPhaserState::outgain, anonymous_namespace{ClipSegmentTest.cpp}::sampleRate, EffectPhaserState::samplerate, settings(), and EffectPhaserState::skipcount.

Here is the call graph for this function:

◆ InstanceProcess()

size_t EffectPhaser::Instance::InstanceProcess ( EffectSettings settings,
EffectPhaserState data,
const float *const *  inBlock,
float *const *  outBlock,
size_t  blockLen 
)

Definition at line 480 of file Phaser.cpp.

483{
484 auto& ms = GetSettings(settings);
485
486 const float *ibuf = inBlock[0];
487 float *obuf = outBlock[0];
488
489 for (int j = data.laststages; j < ms.mStages; j++)
490 {
491 data.old[j] = 0;
492 }
493 data.laststages = ms.mStages;
494
495 data.lfoskip = ms.mFreq * 2 * M_PI / data.samplerate;
496 data.phase = ms.mPhase * M_PI / 180;
497 data.outgain = DB_TO_LINEAR(ms.mOutGain);
498
499 for (decltype(blockLen) i = 0; i < blockLen; i++)
500 {
501 double in = ibuf[i];
502
503 double m = in + data.fbout * ms.mFeedback / 101; // Feedback must be less than 100% to avoid infinite gain.
504
505 if (((data.skipcount++) % lfoskipsamples) == 0)
506 {
507 //compute sine between 0 and 1
508 data.gain =
509 (1.0 +
510 cos(data.skipcount.as_double() * data.lfoskip
511 + data.phase)) / 2.0;
512
513 // change lfo shape
514 data.gain = expm1(data.gain * phaserlfoshape) / expm1(phaserlfoshape);
515
516 // attenuate the lfo
517 data.gain = 1.0 - data.gain / 255.0 * ms.mDepth;
518 }
519
520 // phasing routine
521 for (int j = 0; j < ms.mStages; j++)
522 {
523 double tmp = data.old[j];
524 data.old[j] = data.gain * tmp + m;
525 m = tmp - data.gain * data.old[j];
526 }
527 data.fbout = m;
528
529 obuf[i] = (float) (data.outgain * (m * ms.mDryWet + in * (255 - ms.mDryWet)) / 255);
530 }
531
532 return blockLen;
533}
#define M_PI
Definition: Distortion.cpp:30
#define DB_TO_LINEAR(x)
Definition: MemoryX.h:335
#define phaserlfoshape
Definition: Phaser.cpp:49
#define lfoskipsamples
Definition: Phaser.cpp:52
double lfoskip
Definition: Phaser.h:36
double phase
Definition: Phaser.h:37
double as_double() const
Definition: SampleCount.h:46

References sampleCount::as_double(), DB_TO_LINEAR, EffectPhaserState::fbout, EffectPhaserState::gain, EffectWithSettings< EffectPhaserSettings, StatelessPerTrackEffect >::GetSettings(), EffectPhaserState::laststages, EffectPhaserState::lfoskip, lfoskipsamples, M_PI, EffectPhaserState::old, EffectPhaserState::outgain, EffectPhaserState::phase, phaserlfoshape, EffectPhaserState::samplerate, settings(), and EffectPhaserState::skipcount.

Here is the call graph for this function:

◆ ProcessBlock()

size_t EffectPhaser::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 240 of file Phaser.cpp.

242{
243 return InstanceProcess(settings, mState, inBlock, outBlock, blockLen);
244}
size_t InstanceProcess(EffectSettings &settings, EffectPhaserState &data, const float *const *inBlock, float *const *outBlock, size_t blockLen)
Definition: Phaser.cpp:480
EffectPhaserState mState
Definition: Phaser.cpp:170

References mState, and settings().

Here is the call graph for this function:

◆ ProcessInitialize()

bool EffectPhaser::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 231 of file Phaser.cpp.

233{
235 if (chanMap[0] == ChannelNameFrontRight)
236 mState.phase += M_PI;
237 return true;
238}
@ ChannelNameFrontRight
void InstanceInit(EffectSettings &settings, EffectPhaserState &data, float sampleRate)
Definition: Phaser.cpp:460

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

Here is the call graph for this function:

◆ RealtimeAddProcessor()

bool EffectPhaser::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 253 of file Phaser.cpp.

255{
257
258 InstanceInit(settings, slave.mState, sampleRate);
259
260 mSlaves.push_back(slave);
261
262 return true;
263}
const PerTrackEffect & mProcessor
std::vector< EffectPhaser::Instance > mSlaves
Definition: Phaser.cpp:171

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

Here is the call graph for this function:

◆ RealtimeFinalize()

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

Reimplemented from EffectInstance.

Definition at line 265 of file Phaser.cpp.

266{
267 mSlaves.clear();
268
269 return true;
270}

◆ RealtimeInitialize()

bool EffectPhaser::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 246 of file Phaser.cpp.

247{
248 SetBlockSize(512);
249 mSlaves.clear();
250 return true;
251}
size_t SetBlockSize(size_t maxBlockSize) override

◆ RealtimeProcess()

size_t EffectPhaser::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 272 of file Phaser.cpp.

274{
275 if (group >= mSlaves.size())
276 return 0;
277 return InstanceProcess(settings, mSlaves[group].mState, inbuf, outbuf, numSamples);
278}

References mState, and settings().

Here is the call graph for this function:

Member Data Documentation

◆ mSlaves

std::vector<EffectPhaser::Instance> EffectPhaser::Instance::mSlaves

Definition at line 171 of file Phaser.cpp.

◆ mState

EffectPhaserState EffectPhaser::Instance::mState

Definition at line 170 of file Phaser.cpp.

Referenced by RealtimeAddProcessor().


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