Audacity 3.2.0
Classes | Public Member Functions | Protected Member Functions | Protected Attributes | Private Types | Private Member Functions | Static Private Member Functions | List of all members
PerTrackEffect Class Reference

Base class for many of the effects in Audacity. More...

#include <PerTrackEffect.h>

Inheritance diagram for PerTrackEffect:
[legend]
Collaboration diagram for PerTrackEffect:
[legend]

Classes

class  Instance
 

Public Member Functions

 ~PerTrackEffect () override
 
- Public Member Functions inherited from Effect
 Effect ()
 
virtual ~Effect ()
 
PluginPath GetPath () const override
 
bool VisitSettings (SettingsVisitor &visitor, EffectSettings &settings) override
 
bool VisitSettings (ConstSettingsVisitor &visitor, const EffectSettings &settings) const override
 
ComponentInterfaceSymbol GetSymbol () const override
 
VendorSymbol GetVendor () const override
 
wxString GetVersion () const override
 
TranslatableString GetDescription () const override
 
EffectType GetType () const override
 Type determines how it behaves. More...
 
EffectFamilySymbol GetFamily () const override
 Report identifier and user-visible name of the effect protocol. More...
 
bool IsInteractive () const override
 Whether the effect needs a dialog for entry of settings. More...
 
bool IsDefault () const override
 Whether the effect sorts "above the line" in the menus. More...
 
RealtimeSince RealtimeSupport () const override
 Since which version of Audacity has the effect supported realtime? More...
 
bool SupportsAutomation () const override
 Whether the effect has any automatable controls. More...
 
bool SaveSettings (const EffectSettings &settings, CommandParameters &parms) const override
 Store settings as keys and values. More...
 
bool LoadSettings (const CommandParameters &parms, EffectSettings &settings) const override
 Restore settings from keys and values. More...
 
OptionalMessage LoadUserPreset (const RegistryPath &name, EffectSettings &settings) const override
 
bool SaveUserPreset (const RegistryPath &name, const EffectSettings &settings) const override
 Save settings in the configuration file as a user-named preset. More...
 
RegistryPaths GetFactoryPresets () const override
 Report names of factory presets. More...
 
OptionalMessage LoadFactoryPreset (int id, EffectSettings &settings) const override
 
OptionalMessage LoadFactoryDefaults (EffectSettings &settings) const override
 
virtual const EffectParameterMethodsParameters () const
 
bool CanExportPresets () const override
 Whether the effect supports export of presets to files, and importing too. More...
 
bool HasOptions () const override
 
const EffectSettingsManagerGetDefinition () const override
 
virtual NumericFormatSymbol GetSelectionFormat ()
 
bool SaveSettingsAsString (const EffectSettings &settings, wxString &parms) const override
 
OptionalMessage LoadSettingsFromString (const wxString &parms, EffectSettings &settings) const override
 
bool IsBatchProcessing () const override
 
void SetBatchProcessing () override
 
void UnsetBatchProcessing () override
 
unsigned TestUIFlags (unsigned mask)
 
bool Delegate (Effect &delegate, EffectSettings &settings, InstanceFinder finder={})
 Re-invoke DoEffect on another Effect object that implements the work. More...
 
- Public Member Functions inherited from EffectBase
 EffectBase ()
 
 ~EffectBase () override
 
bool IsLinearEffect () const
 
bool PreviewsFullSelection () const
 
void SetTracks (TrackList *pTracks)
 
virtual std::any BeginPreview (const EffectSettings &settings)
 Called when Preview() starts, to allow temporary effect state changes. More...
 
bool DoEffect (EffectSettings &settings, const InstanceFinder &finder, double projectRate, TrackList *list, WaveTrackFactory *factory, NotifyingSelectedRegion &selectedRegion, unsigned flags, const EffectSettingsAccessPtr &pAccess) override
 
virtual double CalcPreviewInputLength (const EffectSettings &settings, double previewLength) const =0
 
void ReplaceProcessedTracks (const bool bGoodResult)
 
void CountWaveTracks ()
 
- Public Member Functions inherited from EffectPlugin
EffectPluginoperator= (EffectPlugin &)=delete
 
virtual ~EffectPlugin ()
 
virtual bool HasOptions () const =0
 
virtual bool CanExportPresets () const =0
 Whether the effect supports export of presets to files, and importing too. More...
 
virtual const EffectSettingsManagerGetDefinition () const =0
 
virtual bool SaveSettingsAsString (const EffectSettings &settings, wxString &parms) const =0
 
virtual OptionalMessage LoadSettingsFromString (const wxString &parms, EffectSettings &settings) const =0
 
virtual bool IsBatchProcessing () const =0
 
virtual void SetBatchProcessing ()=0
 
virtual void UnsetBatchProcessing ()=0
 
virtual bool DoEffect (EffectSettings &settings, const InstanceFinder &finder, double projectRate, TrackList *list, WaveTrackFactory *factory, NotifyingSelectedRegion &selectedRegion, unsigned flags, const EffectSettingsAccessPtr &pAccess=nullptr)=0
 
- Public Member Functions inherited from EffectInstanceFactory
virtual ~EffectInstanceFactory ()
 
virtual std::shared_ptr< EffectInstanceMakeInstance () const =0
 Make an object maintaining short-term state of an Effect. More...
 
- Public Member Functions inherited from EffectSettingsManager
virtual ~EffectSettingsManager ()
 
virtual bool VisitSettings (SettingsVisitor &visitor, EffectSettings &settings)
 
virtual bool VisitSettings (ConstSettingsVisitor &visitor, const EffectSettings &settings) const
 
virtual EffectSettings MakeSettings () const
 
virtual bool CopySettingsContents (const EffectSettings &src, EffectSettings &dst) const
 Update one settings object from another. More...
 
virtual std::unique_ptr< EffectOutputsMakeOutputs () const
 Produce an object to hold values to send to effect output meters. More...
 
- Public Member Functions inherited from EffectDefinitionInterface
virtual ~EffectDefinitionInterface ()
 
virtual EffectType GetType () const =0
 Type determines how it behaves. More...
 
virtual EffectType GetClassification () const
 Determines which menu it appears in; default same as GetType(). More...
 
virtual EffectFamilySymbol GetFamily () const =0
 Report identifier and user-visible name of the effect protocol. More...
 
virtual bool IsInteractive () const =0
 Whether the effect needs a dialog for entry of settings. More...
 
virtual bool IsDefault () const =0
 Whether the effect sorts "above the line" in the menus. More...
 
virtual RealtimeSince RealtimeSupport () const =0
 Since which version of Audacity has the effect supported realtime? More...
 
bool SupportsRealtime () const
 
virtual bool SupportsAutomation () const =0
 Whether the effect has any automatable controls. More...
 
virtual bool EnablesDebug () const
 Whether the effect dialog should have a Debug button; default, always false. More...
 
virtual ManualPageID ManualPage () const
 Name of a page in the Audacity alpha manual, default is empty. More...
 
virtual FilePath HelpPage () const
 Fully qualified local help file name, default is empty. More...
 
virtual bool IsHiddenFromMenus () const
 Default is false. More...
 
- Public Member Functions inherited from ComponentInterface
virtual ~ComponentInterface ()
 
virtual PluginPath GetPath () const =0
 
virtual ComponentInterfaceSymbol GetSymbol () const =0
 
virtual VendorSymbol GetVendor () const =0
 
virtual wxString GetVersion () const =0
 
virtual TranslatableString GetDescription () const =0
 
TranslatableString GetName () const
 

Protected Member Functions

bool DoPass1 () const
 
bool DoPass2 () const
 
bool Process (EffectInstance &instance, EffectSettings &settings) const
 
- Protected Member Functions inherited from Effect
bool CheckWhetherSkipEffect (const EffectSettings &settings) const override
 Default implementation returns false. More...
 
double CalcPreviewInputLength (const EffectSettings &settings, double previewLength) const override
 Default implementation returns previewLength More...
 
bool TotalProgress (double frac, const TranslatableString &={}) const
 
bool TrackProgress (int whichTrack, double frac, const TranslatableString &={}) const
 
bool TrackGroupProgress (int whichGroup, double frac, const TranslatableString &={}) const
 
int GetNumWaveTracks () const
 
int GetNumWaveGroups () const
 
void GetBounds (const WaveTrack &track, const WaveTrack *pRight, sampleCount *start, sampleCount *len)
 
void CopyInputTracks (bool allSyncLockSelected=false)
 
TrackAddToOutputTracks (const std::shared_ptr< Track > &t)
 
- Protected Member Functions inherited from EffectBase
virtual bool CheckWhetherSkipEffect (const EffectSettings &settings) const =0
 After Init(), tell whether Process() should be skipped. More...
 
void SetLinearEffectFlag (bool linearEffectFlag)
 
void SetPreviewFullSelectionFlag (bool previewDurationFlag)
 
bool IsPreviewing () const
 
const TrackListinputTracks () const
 
const AudacityProjectFindProject () const
 

Protected Attributes

sampleCount mSampleCnt {}
 
- Protected Attributes inherited from EffectBase
std::shared_ptr< TrackListmOutputTracks
 
wxArrayString mPresetNames
 
unsigned mUIFlags { 0 }
 

Private Types

using Buffers = AudioGraph::Buffers
 
using Factory = std::function< std::shared_ptr< EffectInstance >()>
 

Private Member Functions

bool ProcessPass (Instance &instance, EffectSettings &settings)
 

Static Private Member Functions

static bool ProcessTrack (bool multi, const Factory &factory, EffectSettings &settings, AudioGraph::Source &source, AudioGraph::Sink &sink, std::optional< sampleCount > genLength, double sampleRate, const SampleTrack &track, Buffers &inBuffers, Buffers &outBuffers)
 

Additional Inherited Members

- Public Types inherited from EffectPlugin
using EffectSettingsAccessPtr = std::shared_ptr< EffectSettingsAccess >
 
using InstancePointer = std::shared_ptr< EffectInstanceEx >
 
using InstanceFinder = std::function< std::optional< InstancePointer >(EffectSettings &settings) >
 
- Public Types inherited from EffectDefinitionInterface
enum class  RealtimeSince : unsigned { Never , After_3_1 , Always }
 In which versions of Audacity was an effect realtime capable? More...
 
- Static Public Member Functions inherited from Effect
static EffectFetchParameters (Effect &e, EffectSettings &)
 
static void IncEffectCounter ()
 
- Static Public Member Functions inherited from EffectBase
static std::optional< InstancePointerFindInstance (EffectPlugin &plugin)
 
static InstanceFinder DefaultInstanceFinder (EffectPlugin &plugin)
 
- Static Public Member Functions inherited from EffectDefinitionInterface
static Identifier GetSquashedName (const Identifier &ident)
 A utility that strips spaces and CamelCases a name. More...
 
- Public Attributes inherited from EffectBase
TrackListmTracks {}
 
int mNumTracks {}
 
BasicUI::ProgressDialogmProgress {}
 
double mProjectRate {}
 
WaveTrackFactorymFactory {}
 
double mT0 {}
 
double mT1 {}
 
bool mIsPreview { false }
 
- Static Public Attributes inherited from EffectPlugin
static const wxString kUserPresetIdent = wxT("User Preset:")
 
static const wxString kFactoryPresetIdent = wxT("Factory Preset:")
 
static const wxString kCurrentSettingsIdent = wxT("<Current Settings>")
 
static const wxString kFactoryDefaultsIdent = wxT("<Factory Defaults>")
 
- Static Protected Attributes inherited from EffectBase
static int nEffectsDone = 0
 

Detailed Description

Base class for many of the effects in Audacity.

Base class for Effects that treat each (mono or stereo) track independently of other tracks.

Its override of Effect::Process() uses ProcessInitialize(), ProcessBlock(), and ProcessFinalize() methods of its instance made by MakeInstance(), which must be a subclass of PerTrackEffect::Instance. Also uses GetLatency() to determine how many leading output samples to discard and how many extra samples to produce.

Definition at line 35 of file PerTrackEffect.h.

Member Typedef Documentation

◆ Buffers

Definition at line 70 of file PerTrackEffect.h.

◆ Factory

using PerTrackEffect::Factory = std::function<std::shared_ptr<EffectInstance>()>
private

Definition at line 73 of file PerTrackEffect.h.

Constructor & Destructor Documentation

◆ ~PerTrackEffect()

PerTrackEffect::~PerTrackEffect ( )
overridedefault

Member Function Documentation

◆ DoPass1()

bool PerTrackEffect::DoPass1 ( ) const
protected

Definition at line 55 of file PerTrackEffect.cpp.

56{
57 return true;
58}

Referenced by Process().

Here is the caller graph for this function:

◆ DoPass2()

bool PerTrackEffect::DoPass2 ( ) const
protected

Definition at line 60 of file PerTrackEffect.cpp.

61{
62 return false;
63}

Referenced by Process().

Here is the caller graph for this function:

◆ Process()

bool PerTrackEffect::Process ( EffectInstance instance,
EffectSettings settings 
) const
protected

Definition at line 65 of file PerTrackEffect.cpp.

67{
68 auto pThis = const_cast<PerTrackEffect *>(this);
69 pThis->CopyInputTracks(true);
70 bool bGoodResult = true;
71 // mPass = 1;
72 if (DoPass1()) {
73 auto &myInstance = dynamic_cast<Instance&>(instance);
74 bGoodResult = pThis->ProcessPass(myInstance, settings);
75 // mPass = 2;
76 if (bGoodResult && DoPass2())
77 bGoodResult = pThis->ProcessPass(myInstance, settings);
78 }
79 pThis->ReplaceProcessedTracks(bGoodResult);
80 return bGoodResult;
81}
static Settings & settings()
Definition: TrackInfo.cpp:83
void CopyInputTracks(bool allSyncLockSelected=false)
Definition: Effect.cpp:400
Base class for many of the effects in Audacity.
bool DoPass2() const
bool DoPass1() const

References Effect::CopyInputTracks(), DoPass1(), DoPass2(), and settings().

Referenced by StatefulPerTrackEffect::Process(), and PerTrackEffect::Instance::Process().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ProcessPass()

bool PerTrackEffect::ProcessPass ( Instance instance,
EffectSettings settings 
)
private

Definition at line 83 of file PerTrackEffect.cpp.

84{
85 const auto duration = settings.extra.GetDuration();
86 bool bGoodResult = true;
87 bool isGenerator = GetType() == EffectTypeGenerate;
88 bool isProcessor = GetType() == EffectTypeProcess;
89
90 Buffers inBuffers, outBuffers;
91 ChannelName map[3];
92 size_t prevBufferSize = 0;
93 int count = 0;
94 bool clear = false;
95
96 // It's possible that the number of channels the effect expects changed based on
97 // the parameters (the Audacity Reverb effect does when the stereo width is 0).
98 const auto numAudioIn = instance.GetAudioInCount();
99 const auto numAudioOut = instance.GetAudioOutCount();
100 if (numAudioOut < 1)
101 return false;
102
103 // Instances that can be reused in each loop pass
104 std::vector<std::shared_ptr<EffectInstance>> recycledInstances{
105 // First one is the given one; any others pushed onto here are
106 // discarded when we exit
107 std::dynamic_pointer_cast<EffectInstanceEx>(instance.shared_from_this())
108 };
109
110 const bool multichannel = numAudioIn > 1;
111 auto range = multichannel
112 ? mOutputTracks->Leaders()
113 : mOutputTracks->Any();
114 range.VisitWhile( bGoodResult,
115 [&](WaveTrack *pLeft, const Track::Fallthrough &fallthrough) {
116 // Track range visitor functions receive a pointer that is never null
117 auto &left = *pLeft;
118 if (!left.GetSelected())
119 return fallthrough();
120
121 sampleCount len = 0;
122 sampleCount start = 0;
123 WaveTrack *pRight{};
124
125 const auto numChannels = MakeChannelMap(left, multichannel, map);
126 if (multichannel) {
127 assert(numAudioIn > 1);
128 if (numChannels == 2) {
129 // TODO: more-than-two-channels
130 pRight = *TrackList::Channels(&left).rbegin();
131 clear = false;
132 }
133 }
134
135 if (!isGenerator) {
136 GetBounds(left, pRight, &start, &len);
137 mSampleCnt = len;
138 if (len > 0 && numAudioIn < 1) {
139 bGoodResult = false;
140 return;
141 }
142 }
143 else
144 mSampleCnt = left.TimeToLongSamples(duration);
145
146 const auto sampleRate = left.GetRate();
147
148 // Get the block size the client wants to use
149 auto max = left.GetMaxBlockSize() * 2;
150 const auto blockSize = instance.SetBlockSize(max);
151 if (blockSize == 0) {
152 bGoodResult = false;
153 return;
154 }
155
156 // Calculate the buffer size to be at least the max rounded up to the clients
157 // selected block size.
158 const auto bufferSize =
159 ((max + (blockSize - 1)) / blockSize) * blockSize;
160 if (bufferSize == 0) {
161 bGoodResult = false;
162 return;
163 }
164
165 // Always create the number of input buffers the client expects even
166 // if we don't have
167 // the same number of channels.
168 // (These resizes may do nothing after the first track)
169
170 if (len > 0)
171 assert(numAudioIn > 0); // checked above
172 inBuffers.Reinit(
173 // TODO fix this hack for making Generator progress work without
174 // assertion violations. Make a dummy Source class that doesn't
175 // care about the buffers.
176 std::max(1u, numAudioIn),
177 blockSize,
178 std::max<size_t>(1, bufferSize / blockSize));
179 if (len > 0)
180 // post of Reinit later satisfies pre of Source::Acquire()
181 assert(inBuffers.Channels() > 0);
182
183 if (prevBufferSize != bufferSize) {
184 // Buffer size has changed
185 // We won't be using more than the first 2 buffers,
186 // so clear the rest (if any)
187 for (size_t i = 2; i < numAudioIn; i++)
188 inBuffers.ClearBuffer(i, bufferSize);
189 }
190 prevBufferSize = bufferSize;
191
192 // Always create the number of output buffers the client expects
193 // even if we don't have the same number of channels.
194 // (These resizes may do nothing after the first track)
195 // Output buffers get an extra blockSize worth to give extra room if
196 // the plugin adds latency -- PRL: actually not important to do
197 assert(numAudioOut > 0); // checked above
198 outBuffers.Reinit(numAudioOut, blockSize,
199 (bufferSize / blockSize) + 1);
200 // post of Reinit satisfies pre of ProcessTrack
201 assert(outBuffers.Channels() > 0);
202
203 // (Re)Set the input buffer positions
204 inBuffers.Rewind();
205
206 // Clear unused input buffers
207 if (!pRight && !clear && numAudioIn > 1) {
208 inBuffers.ClearBuffer(1, bufferSize);
209 clear = true;
210 }
211
212 const auto genLength = [this, &settings, &left, isGenerator](
213 ) -> std::optional<sampleCount> {
214 double genDur = 0;
215 if (isGenerator) {
216 const auto duration = settings.extra.GetDuration();
217 if (IsPreviewing()) {
218 gPrefs->Read(wxT("/AudioIO/EffectsPreviewLen"), &genDur, 6.0);
219 genDur = std::min(duration, CalcPreviewInputLength(settings, genDur));
220 }
221 else
222 genDur = duration;
223 // round to nearest sample
224 return sampleCount{ (left.GetRate() * genDur) + 0.5 };
225 }
226 else
227 return {};
228 }();
229
230 const auto pollUser = [this, numChannels, count, start,
231 length = (genLength ? *genLength : len).as_double()
232 ](sampleCount inPos){
233 if (numChannels > 1) {
235 count, (inPos - start).as_double() / length)
236 )
237 return false;
238 }
239 else {
240 if (TrackProgress(count, (inPos - start).as_double() / length))
241 return false;
242 }
243 return true;
244 };
245
246 // Assured above
247 assert(len == 0 || inBuffers.Channels() > 0);
248 // TODO fix this hack to make the time remaining of the generator
249 // progress dialog correct
250 if (len == 0 && genLength)
251 len = *genLength;
252 SampleTrackSource source{ left, pRight, start, len, pollUser };
253 // Assert source is safe to Acquire inBuffers
254 assert(source.AcceptsBuffers(inBuffers));
255 assert(source.AcceptsBlockSize(inBuffers.BlockSize()));
256
257 WaveTrackSink sink{ left, pRight, start, isGenerator, isProcessor,
258 instance.NeedsDither() ? widestSampleFormat : narrowestSampleFormat
259 };
260 assert(sink.AcceptsBuffers(outBuffers));
261
262 // Go process the track(s)
263 const auto factory =
264 [this, &recycledInstances, counter = 0]() mutable {
265 auto index = counter++;
266 if (index < recycledInstances.size())
267 return recycledInstances[index];
268 else
269 return recycledInstances.emplace_back(MakeInstance());
270 };
271 bGoodResult = ProcessTrack(multichannel, factory, settings, source, sink,
272 genLength, sampleRate, left,
273 inBuffers, outBuffers);
274 if (bGoodResult)
275 sink.Flush(outBuffers,
276 mT0, ViewInfo::Get(*FindProject()).selectedRegion.t1());
277 if (!bGoodResult)
278 return;
279 ++count;
280 },
281 [&](Track *t) {
283 t->SyncLockAdjust(mT1, mT0 + duration);
284 }
285 );
286
287 if (bGoodResult && GetType() == EffectTypeGenerate)
288 mT1 = mT0 + duration;
289
290 return bGoodResult;
291}
wxT("CloseDown"))
int min(int a, int b)
@ EffectTypeGenerate
@ EffectTypeProcess
ChannelName
unsigned MakeChannelMap(const SampleTrack &track, bool multichannel, ChannelName map[3])
FileConfig * gPrefs
Definition: Prefs.cpp:70
@ narrowestSampleFormat
Two synonyms for previous values that might change if more values were added.
double mT1
Definition: EffectBase.h:119
std::shared_ptr< TrackList > mOutputTracks
Definition: EffectBase.h:97
bool IsPreviewing() const
Definition: EffectBase.h:89
double mT0
Definition: EffectBase.h:118
const AudacityProject * FindProject() const
Definition: EffectBase.cpp:303
bool TrackGroupProgress(int whichGroup, double frac, const TranslatableString &={}) const
Definition: Effect.cpp:360
double CalcPreviewInputLength(const EffectSettings &settings, double previewLength) const override
Default implementation returns previewLength
Definition: Effect.cpp:437
bool TrackProgress(int whichTrack, double frac, const TranslatableString &={}) const
Definition: Effect.cpp:350
EffectType GetType() const override
Type determines how it behaves.
Definition: Effect.cpp:72
void GetBounds(const WaveTrack &track, const WaveTrack *pRight, sampleCount *start, sampleCount *len)
Definition: Effect.cpp:370
virtual std::shared_ptr< EffectInstance > MakeInstance() const =0
Make an object maintaining short-term state of an Effect.
static bool ProcessTrack(bool multi, const Factory &factory, EffectSettings &settings, AudioGraph::Source &source, AudioGraph::Sink &sink, std::optional< sampleCount > genLength, double sampleRate, const SampleTrack &track, Buffers &inBuffers, Buffers &outBuffers)
AudioGraph::Buffers Buffers
sampleCount mSampleCnt
Adapts SampleTrack to the interface AudioGraph::Source.
static bool IsSyncLockSelected(const Track *pTrack)
Definition: SyncLock.cpp:82
Abstract base class for an object holding data associated with points on a time axis.
Definition: Track.h:161
Continuation<> Fallthrough
Type of arguments passed as optional second parameter to TypeSwitch<void>() cases.
Definition: Track.h:459
static auto Channels(TrackType *pTrack) -> TrackIterRange< TrackType >
Definition: Track.h:1406
static ViewInfo & Get(AudacityProject &project)
Definition: ViewInfo.cpp:235
A Track that contains audio waveform data.
Definition: WaveTrack.h:51
Positions or offsets within audio files need a wide type.
Definition: SampleCount.h:19
static RegisteredToolbarFactory factory

References AudioGraph::Buffers::BlockSize(), Effect::CalcPreviewInputLength(), AudioGraph::Buffers::Channels(), TrackList::Channels(), AudioGraph::Buffers::ClearBuffer(), EffectTypeGenerate, EffectTypeProcess, cloud::factory, EffectBase::FindProject(), ViewInfo::Get(), EffectInstance::GetAudioInCount(), EffectInstance::GetAudioOutCount(), Effect::GetBounds(), Effect::GetType(), gPrefs, EffectBase::IsPreviewing(), SyncLock::IsSyncLockSelected(), MakeChannelMap(), EffectInstanceFactory::MakeInstance(), min(), EffectBase::mOutputTracks, mSampleCnt, EffectBase::mT0, EffectBase::mT1, narrowestSampleFormat, EffectInstance::NeedsDither(), ProcessTrack(), AudioGraph::Buffers::Reinit(), AudioGraph::Buffers::Rewind(), EffectInstance::SetBlockSize(), settings(), Effect::TrackGroupProgress(), Effect::TrackProgress(), widestSampleFormat, and wxT().

Here is the call graph for this function:

◆ ProcessTrack()

bool PerTrackEffect::ProcessTrack ( bool  multi,
const Factory factory,
EffectSettings settings,
AudioGraph::Source source,
AudioGraph::Sink sink,
std::optional< sampleCount genLength,
double  sampleRate,
const SampleTrack track,
Buffers inBuffers,
Buffers outBuffers 
)
staticprivate

Previous contents of inBuffers and outBuffers are ignored

Precondition
source.AcceptsBuffers(inBuffers)
source.AcceptsBlockSize(inBuffers.BlockSize())
sink.AcceptsBuffers(outBuffers)
inBuffers.BlockSize() == outBuffers.BlockSize()

Definition at line 293 of file PerTrackEffect.cpp.

299{
300 assert(upstream.AcceptsBuffers(inBuffers));
301 assert(sink.AcceptsBuffers(outBuffers));
302
303 const auto blockSize = inBuffers.BlockSize();
304 assert(upstream.AcceptsBlockSize(blockSize));
305 assert(blockSize == outBuffers.BlockSize());
306
307 auto pSource = EffectStage::Create( multi, upstream, inBuffers,
308 factory, settings, sampleRate, genLength, track );
309 if (!pSource)
310 return false;
311 assert(pSource->AcceptsBlockSize(blockSize)); // post of ctor
312 assert(pSource->AcceptsBuffers(outBuffers));
313
314 AudioGraph::Task task{ *pSource, outBuffers, sink };
315 return task.RunLoop();
316}
virtual bool AcceptsBuffers(const Buffers &buffers) const =0
static std::unique_ptr< EffectStage > Create(bool multi, Source &upstream, Buffers &inBuffers, const Factory &factory, EffectSettings &settings, double sampleRate, std::optional< sampleCount > genLength, const SampleTrack &track)
Satisfies postcondition of constructor or returns null.
Definition: EffectStage.cpp:86
Copies from a Source to a Sink, mediated by Buffers.

References AudioGraph::Source::AcceptsBlockSize(), AudioGraph::Sink::AcceptsBuffers(), AudioGraph::Source::AcceptsBuffers(), AudioGraph::Buffers::BlockSize(), EffectStage::Create(), cloud::factory, and settings().

Referenced by ProcessPass().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ mSampleCnt

sampleCount PerTrackEffect::mSampleCnt {}
protected

The documentation for this class was generated from the following files: