Audacity 3.2.0
Public Member Functions | Protected Member Functions | Protected Attributes | Static Protected Attributes | Private Member Functions | Private Attributes | Friends | List of all members
EffectBase Class Referenceabstract

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

#include <EffectBase.h>

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

Public Member Functions

 EffectBase ()
 
 ~EffectBase () override
 
- Public Member Functions inherited from EffectUIClientInterface
virtual ~EffectUIClientInterface ()
 
virtual int ShowClientInterface (wxWindow &parent, wxDialog &dialog, bool forceModal=false)=0
 
virtual bool IsGraphicalUI ()=0
 
virtual std::unique_ptr< EffectUIValidatorPopulateUI (ShuttleGui &S, EffectInstance &instance, EffectSettingsAccess &access)=0
 Adds controls to a panel that is given as the parent window of S More...
 
virtual bool CanExportPresets ()=0
 
virtual void ExportPresets (const EffectSettings &settings) const =0
 
virtual void ImportPresets (EffectSettings &settings)=0
 
virtual bool HasOptions ()=0
 
virtual void ShowOptions ()=0
 
- Public Member Functions inherited from EffectPlugin
EffectPluginoperator= (EffectPlugin &)=delete
 
virtual ~EffectPlugin ()
 
virtual const EffectSettingsManagerGetDefinition () const =0
 
virtual int ShowHostInterface (wxWindow &parent, const EffectDialogFactory &factory, EffectInstance &instance, EffectSettingsAccess &access, bool forceModal=false)=0
 Usually applies factory to self and given access. More...
 
virtual void Preview (EffectSettingsAccess &access, bool dryOnly)=0
 
virtual bool SaveSettingsAsString (const EffectSettings &settings, wxString &parms) const =0
 
virtual bool 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, double projectRate, TrackList *list, WaveTrackFactory *factory, NotifyingSelectedRegion &selectedRegion, unsigned flags, wxWindow *pParent=nullptr, const EffectDialogFactory &dialogFactory={}, const EffectSettingsAccessPtr &pAccess=nullptr)=0
 Unfortunately complicated dual-use function. More...
 
virtual bool TransferDataToWindow (const EffectSettings &settings)=0
 Update controls for the settings. More...
 
virtual bool TransferDataFromWindow (EffectSettings &settings)=0
 Update the given settings from controls. More...
 
- 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...
 
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 int GetMidiInCount () const
 Function that has not yet found a use. More...
 
virtual int GetMidiOutCount () const
 Function that has not yet found a use. 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 bool SaveSettings (const EffectSettings &settings, CommandParameters &parms) const =0
 Store settings as keys and values. More...
 
virtual bool LoadSettings (const CommandParameters &parms, EffectSettings &settings) const =0
 Restore settings from keys and values. More...
 
virtual RegistryPaths GetFactoryPresets () const =0
 Report names of factory presets. More...
 
virtual bool LoadUserPreset (const RegistryPath &name, EffectSettings &settings) const =0
 Change settings to a user-named preset. More...
 
virtual bool SaveUserPreset (const RegistryPath &name, const EffectSettings &settings) const =0
 Save settings in the configuration file as a user-named preset. More...
 
virtual bool LoadFactoryPreset (int id, EffectSettings &settings) const =0
 Change settings to the preset whose name is GetFactoryPresets()[id] More...
 
virtual bool LoadFactoryDefaults (EffectSettings &settings) const =0
 Change settings back to "factory default". 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 bool SupportsRealtime () const =0
 Whether the effect supports realtime previewing (while audio is playing). More...
 
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

void Preview (EffectSettingsAccess &access, bool dryOnly) override
 
bool DoEffect (EffectSettings &settings, double projectRate, TrackList *list, WaveTrackFactory *factory, NotifyingSelectedRegion &selectedRegion, unsigned flags, wxWindow *pParent, const EffectDialogFactory &dialogFactory, const EffectSettingsAccessPtr &pAccess) override
 Unfortunately complicated dual-use function. More...
 
virtual bool CheckWhetherSkipEffect (const EffectSettings &settings) const =0
 After Init(), tell whether Process() should be skipped. More...
 
virtual double CalcPreviewInputLength (const EffectSettings &settings, double previewLength) const =0
 
void SetLinearEffectFlag (bool linearEffectFlag)
 
void SetPreviewFullSelectionFlag (bool previewDurationFlag)
 
bool IsPreviewing () const
 
void IncludeNotSelectedPreviewTracks (bool includeNotSelected)
 
void ReplaceProcessedTracks (const bool bGoodResult)
 
const TrackListinputTracks () const
 
const AudacityProjectFindProject () const
 
- Protected Member Functions inherited from EffectUIClientInterface
virtual bool ValidateUI (EffectSettings &settings)=0
 
virtual bool CloseUI ()=0
 

Protected Attributes

BasicUI::ProgressDialogmProgress {}
 
double mProjectRate {}
 
WaveTrackFactorymFactory {}
 
std::shared_ptr< TrackListmOutputTracks
 
double mT0 {}
 
double mT1 {}
 
wxArrayString mPresetNames
 
unsigned mUIFlags { 0 }
 
- Protected Attributes inherited from EffectUIClientInterface
friend EffectUIValidator
 
friend DefaultEffectUIValidator
 

Static Protected Attributes

static int nEffectsDone = 0
 

Private Member Functions

double GetDefaultDuration ()
 
void CountWaveTracks ()
 

Private Attributes

wxWeakRef< wxDialog > mUIDialog
 This weak pointer may be the same as mUIParent, or null. More...
 
TrackListmTracks {}
 
bool mIsLinearEffect { false }
 This weak pointer may be the same as mHostUIDialog, or null. More...
 
bool mPreviewWithNotSelected { false }
 
bool mPreviewFullSelection { false }
 
bool mIsPreview { false }
 
std::vector< Track * > mIMap
 
std::vector< Track * > mOMap
 
int mNumTracks {}
 
int mNumGroups {}
 

Friends

class Effect
 

Additional Inherited Members

- Public Types inherited from EffectPlugin
using EffectSettingsAccessPtr = std::shared_ptr< EffectSettingsAccess >
 
- Static Public Member Functions inherited from EffectDefinitionInterface
static Identifier GetSquashedName (const Identifier &ident)
 A utility that strips spaces and CamelCases a name. More...
 
- 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>")
 

Detailed Description

Base class for many of the effects in Audacity.

Definition at line 30 of file EffectBase.h.

Constructor & Destructor Documentation

◆ EffectBase()

EffectBase::EffectBase ( )

Definition at line 40 of file EffectBase.cpp.

41{
42 // PRL: I think this initialization of mProjectRate doesn't matter
43 // because it is always reassigned in DoEffect before it is used
44 // STF: but can't call AudioIOBase::GetOptimalSupportedSampleRate() here.
45 // (Which is called to compute the default-default value.) (Bug 2280)
47}
double mProjectRate
Definition: EffectBase.h:99
bool ReadWithDefault(T *pVar, const T &defaultValue) const
overload of ReadWithDefault returning a boolean that is true if the value was previously defined *‍/
Definition: Prefs.h:191
PROJECT_RATE_API IntSetting DefaultSampleRate

References QualitySettings::DefaultSampleRate, mProjectRate, and Setting< T >::ReadWithDefault().

Here is the call graph for this function:

◆ ~EffectBase()

EffectBase::~EffectBase ( )
overridedefault

Member Function Documentation

◆ CalcPreviewInputLength()

virtual double EffectBase::CalcPreviewInputLength ( const EffectSettings settings,
double  previewLength 
) const
protectedpure virtual

Implemented in EffectChangeSpeed, Effect, EffectPaulstretch, EffectTimeScale, and EffectTruncSilence.

Referenced by Preview().

Here is the caller graph for this function:

◆ CheckWhetherSkipEffect()

virtual bool EffectBase::CheckWhetherSkipEffect ( const EffectSettings settings) const
protectedpure virtual

After Init(), tell whether Process() should be skipped.

Implemented in EffectBassTreble, EffectChangeSpeed, EffectClickRemoval, Effect, EffectNoiseRemoval, and EffectNormalize.

Referenced by DoEffect().

Here is the caller graph for this function:

◆ CountWaveTracks()

void EffectBase::CountWaveTracks ( )
private

Definition at line 310 of file EffectBase.cpp.

311{
312 mNumTracks = mTracks->Selected< const WaveTrack >().size();
314}
int mNumTracks
Definition: EffectBase.h:136
TrackList * mTracks
Definition: EffectBase.h:125
int mNumGroups
Definition: EffectBase.h:137
auto SelectedLeaders() -> TrackIterRange< TrackType >
Definition: Track.h:1480
auto Selected() -> TrackIterRange< TrackType >
Definition: Track.h:1446
A Track that contains audio waveform data.
Definition: WaveTrack.h:57

References mNumGroups, mNumTracks, mTracks, TrackList::Selected(), TrackList::SelectedLeaders(), and size.

Referenced by DoEffect(), and Preview().

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

◆ DoEffect()

bool EffectBase::DoEffect ( EffectSettings settings,
double  projectRate,
TrackList list,
WaveTrackFactory factory,
NotifyingSelectedRegion selectedRegion,
unsigned  flags,
wxWindow *  pParent,
const EffectDialogFactory dialogFactory,
const EffectSettingsAccessPtr pAccess 
)
overrideprotectedvirtual

Unfortunately complicated dual-use function.

Sometimes this is invoked only to do effect processing, as a delegate for another effect, but sometimes also to put up a dialog prompting the user for settings first.

Create a user interface only if the supplied factory is not null. Factory may be null because we "Repeat last effect" or apply a macro

Will only operate on tracks that have the "selected" flag set to true, which is consistent with Audacity's standard UI.

Returns
true on success
Parameters
settingsAlways given; only for processing
pAccessSometimes given; only for UI

Implements EffectPlugin.

Definition at line 60 of file EffectBase.cpp.

68{
69 auto cleanup0 = valueRestorer(mUIFlags, flags);
70 wxASSERT(selectedRegion.duration() >= 0.0);
71
72 mOutputTracks.reset();
73
75 mProjectRate = projectRate;
76 mTracks = list;
77
78 // This is for performance purposes only, no additional recovery implied
79 auto &pProject = *const_cast<AudacityProject*>(FindProject()); // how to remove this const_cast?
80 TransactionScope trans(pProject, "Effect");
81
82 // Update track/group counts
84
85 bool isSelection = false;
86
87 auto duration = 0.0;
92
93 WaveTrack *newTrack{};
94 bool success = false;
95 auto oldDuration = duration;
96
97 auto cleanup = finally( [&] {
98 if (!success) {
99 if (newTrack) {
100 mTracks->Remove(newTrack);
101 }
102 // On failure, restore the old duration setting
103 settings.extra.SetDuration(oldDuration);
104 }
105 else
106 trans.Commit();
107
108 ReplaceProcessedTracks( false );
109 mPresetNames.clear();
110 } );
111
112 // We don't yet know the effect type for code in the Nyquist Prompt, so
113 // assume it requires a track and handle errors when the effect runs.
114 if ((GetType() == EffectTypeGenerate || GetPath() == NYQUIST_PROMPT_ID) && (mNumTracks == 0)) {
115 auto track = mFactory->Create();
117 newTrack = mTracks->Add(track);
118 newTrack->SetSelected(true);
119 }
120
121 mT0 = selectedRegion.t0();
122 mT1 = selectedRegion.t1();
123 if (mT1 > mT0)
124 {
125 // there is a selection: let's fit in there...
126 // MJS: note that this is just for the TTC and is independent of the track rate
127 // but we do need to make sure we have the right number of samples at the project rate
128 double quantMT0 = QUANTIZED_TIME(mT0, mProjectRate);
129 double quantMT1 = QUANTIZED_TIME(mT1, mProjectRate);
130 duration = quantMT1 - quantMT0;
131 isSelection = true;
132 mT1 = mT0 + duration;
133 }
134
135 // This is happening inside EffectSettingsAccess::ModifySettings
136 auto newFormat = isSelection
138 : NumericConverter::DefaultSelectionFormat();
139 auto updater = [&](EffectSettings &settings) {
140 settings.extra.SetDuration(duration);
141 settings.extra.SetDurationFormat( newFormat );
142 };
143 // Update our copy of settings; update the EffectSettingsAccess too,
144 // if we are going to show a dialog
145 updater(settings);
146 if (pAccess)
147 pAccess->ModifySettings(updater);
148
149#ifdef EXPERIMENTAL_SPECTRAL_EDITING
150 mF0 = selectedRegion.f0();
151 mF1 = selectedRegion.f1();
153 mPresetNames.push_back(L"control-f0");
155 mPresetNames.push_back(L"control-f1");
156
157#endif
159
160 // Note: Init may read parameters from preferences
161 auto pInstance = MakeInstance();
162 if (!pInstance->Init())
163 return false;
164
165 // Prompting will be bypassed when applying an effect that has already
166 // been configured, e.g. repeating the last effect on a different selection.
167 // Prompting may call EffectBase::Preview
168 if ( pParent && dialogFactory && pAccess &&
169 IsInteractive()) {
171 *pParent, dialogFactory, *pInstance, *pAccess, IsBatchProcessing() ) )
172 return false;
173 else
174 // Retrieve again after the dialog modified settings
175 settings = pAccess->Get();
176 }
177
178 // If the dialog was shown, then it has been closed without errors or
179 // cancellation, and any change of duration has been saved in the config file
180
181 bool returnVal = true;
182 bool skipFlag = CheckWhetherSkipEffect(settings);
183 if (skipFlag == false)
184 {
185 using namespace BasicUI;
186 auto name = GetName();
187 auto progress = MakeProgress(
188 name,
189 XO("Applying %s...").Format( name ),
191 );
192 auto vr = valueRestorer( mProgress, progress.get() );
193
194 returnVal = pInstance->Process(settings);
195 }
196
197 if (returnVal && (mT1 >= mT0 ))
198 {
199 selectedRegion.setTimes(mT0, mT1);
200 }
201
202 success = returnVal;
203 return returnVal;
204}
static RegisteredToolbarFactory factory
const TranslatableString name
Definition: Distortion.cpp:82
const RegistryPath & CurrentSettingsGroup()
Component of a configuration key path, for last-used destructive settings.
@ EffectTypeGenerate
#define XO(s)
Definition: Internat.h:31
ValueRestorer< T > valueRestorer(T &var)
inline functions provide convenient parameter type deduction
Definition: MemoryX.h:226
#define QUANTIZED_TIME(time, rate)
Definition: MemoryX.h:500
#define NYQUIST_PROMPT_ID
static Settings & settings()
Definition: TrackInfo.cpp:87
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:89
virtual PluginPath GetPath() const =0
TranslatableString GetName() const
double mT1
Definition: EffectBase.h:107
std::shared_ptr< TrackList > mOutputTracks
Definition: EffectBase.h:105
WaveTrackFactory * mFactory
Definition: EffectBase.h:101
void CountWaveTracks()
Definition: EffectBase.cpp:310
virtual bool CheckWhetherSkipEffect(const EffectSettings &settings) const =0
After Init(), tell whether Process() should be skipped.
BasicUI::ProgressDialog * mProgress
Definition: EffectBase.h:98
wxArrayString mPresetNames
Definition: EffectBase.h:112
double GetDefaultDuration()
Definition: EffectBase.cpp:51
double mT0
Definition: EffectBase.h:106
unsigned mUIFlags
Definition: EffectBase.h:113
void ReplaceProcessedTracks(const bool bGoodResult)
Definition: EffectBase.cpp:224
const AudacityProject * FindProject() const
Definition: EffectBase.cpp:303
virtual EffectType GetType() const =0
Type determines how it behaves.
virtual bool IsInteractive() const =0
Whether the effect needs a dialog for entry of settings.
virtual std::shared_ptr< EffectInstance > MakeInstance() const =0
Make an object maintaining short-term state of an Effect.
virtual int ShowHostInterface(wxWindow &parent, const EffectDialogFactory &factory, EffectInstance &instance, EffectSettingsAccess &access, bool forceModal=false)=0
Usually applies factory to self and given access.
virtual const EffectSettingsManager & GetDefinition() const =0
virtual bool IsBatchProcessing() const =0
static const RegistryPath & DurationKey()
Abstract base class used in importing a file.
double t1() const
Definition: ViewInfo.h:35
double f1() const
Definition: ViewInfo.h:37
double duration() const
Definition: ViewInfo.h:40
bool setTimes(double t0, double t1)
Definition: ViewInfo.cpp:51
double f0() const
Definition: ViewInfo.h:36
double t0() const
Definition: ViewInfo.h:34
NumericConverter provides the advanced formatting control used in the selection bar of Audacity.
static NumericFormatSymbol TimeAndSampleFormat()
static const int UndefinedFrequency
wxString MakeUniqueTrackName(const wxString &baseTrackName) const
Returns string that contains baseTrackName, but is guaranteed to be unique among other tracks in that...
Definition: Track.cpp:524
TrackKind * Add(const std::shared_ptr< TrackKind > &t)
Definition: Track.h:1556
TrackNodePointer Remove(Track *t)
Remove the Track and return an iterator to what followed it.
Definition: Track.cpp:783
RAII for a database transaction, possibly nested.
std::shared_ptr< WaveTrack > Create()
Creates an unnamed empty WaveTrack with default sample format and default rate.
Definition: WaveTrack.cpp:118
static wxString GetDefaultAudioTrackNamePreference()
Definition: WaveTrack.cpp:100
@ ProgressShowCancel
Definition: BasicUI.h:139
std::unique_ptr< ProgressDialog > MakeProgress(const TranslatableString &title, const TranslatableString &message, unsigned flags=(ProgressShowStop|ProgressShowCancel), const TranslatableString &remainingLabelText={})
Create and display a progress dialog.
Definition: BasicUI.h:271
bool GetConfig(const EffectDefinitionInterface &ident, ConfigurationType type, const RegistryPath &group, const RegistryPath &key, Value &var, const Value &defval)
Externalized state of a plug-in.

References TrackList::Add(), CheckWhetherSkipEffect(), TransactionScope::Commit(), CountWaveTracks(), WaveTrackFactory::Create(), CurrentSettingsGroup(), NumericConverter::DefaultSelectionFormat(), NotifyingSelectedRegion::duration(), EffectSettingsExtra::DurationKey(), EffectTypeGenerate, NotifyingSelectedRegion::f0(), NotifyingSelectedRegion::f1(), factory, FindProject(), PluginSettings::GetConfig(), WaveTrack::GetDefaultAudioTrackNamePreference(), GetDefaultDuration(), EffectPlugin::GetDefinition(), ComponentInterface::GetName(), ComponentInterface::GetPath(), EffectDefinitionInterface::GetType(), EffectPlugin::IsBatchProcessing(), EffectDefinitionInterface::IsInteractive(), EffectInstanceFactory::MakeInstance(), BasicUI::MakeProgress(), TrackList::MakeUniqueTrackName(), mFactory, mNumTracks, mOutputTracks, mPresetNames, mProgress, mProjectRate, mT0, mT1, mTracks, mUIFlags, name, NYQUIST_PROMPT_ID, PluginSettings::Private, BasicUI::ProgressShowCancel, QUANTIZED_TIME, TrackList::Remove(), ReplaceProcessedTracks(), NotifyingSelectedRegion::setTimes(), settings(), EffectPlugin::ShowHostInterface(), NotifyingSelectedRegion::t0(), NotifyingSelectedRegion::t1(), NumericConverter::TimeAndSampleFormat(), SelectedRegion::UndefinedFrequency, valueRestorer(), and XO.

Referenced by Effect::Delegate().

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

◆ FindProject()

const AudacityProject * EffectBase::FindProject ( ) const
protected

Definition at line 303 of file EffectBase.cpp.

304{
305 if (!inputTracks())
306 return nullptr;
307 return inputTracks()->GetOwner();
308}
const TrackList * inputTracks() const
Definition: EffectBase.h:102
AudacityProject * GetOwner()
Definition: Track.h:1365

References TrackList::GetOwner(), and inputTracks().

Referenced by Effect::CopyInputTracks(), DoEffect(), Effect::GetSelectionFormat(), EffectEqualization::Init(), NyquistEffect::Init(), Generator::Process(), NyquistEffect::Process(), EffectTwoPassSimpleMono::Process(), EffectTruncSilence::ProcessIndependently(), and PerTrackEffect::ProcessTrack().

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

◆ GetDefaultDuration()

double EffectBase::GetDefaultDuration ( )
private

Definition at line 51 of file EffectBase.cpp.

52{
53 return 30.0;
54}

Referenced by DoEffect().

Here is the caller graph for this function:

◆ IncludeNotSelectedPreviewTracks()

void EffectBase::IncludeNotSelectedPreviewTracks ( bool  includeNotSelected)
protected

Definition at line 217 of file EffectBase.cpp.

218{
219 mPreviewWithNotSelected = includeNotSelected;
220}
bool mPreviewWithNotSelected
Definition: EffectBase.h:128

References mPreviewWithNotSelected.

◆ inputTracks()

const TrackList * EffectBase::inputTracks ( ) const
inlineprotected

◆ IsPreviewing()

bool EffectBase::IsPreviewing ( ) const
inlineprotected

Definition at line 83 of file EffectBase.h.

83{ return mIsPreview; }
bool mIsPreview
Definition: EffectBase.h:131

Referenced by NyquistEffect::Process(), EffectPaulstretch::ProcessOne(), and PerTrackEffect::ProcessTrack().

Here is the caller graph for this function:

◆ Preview()

void EffectBase::Preview ( EffectSettingsAccess access,
bool  dryOnly 
)
overrideprotectedvirtual

Implements EffectPlugin.

Reimplemented in EffectTimeScale.

Definition at line 316 of file EffectBase.cpp.

317{
318 if (mNumTracks == 0) { // nothing to preview
319 return;
320 }
321
322 auto gAudioIO = AudioIO::Get();
323 if (gAudioIO->IsBusy()) {
324 return;
325 }
326
327 wxWindow *FocusDialog = wxWindow::FindFocus();
328
329 double previewDuration;
330 bool isNyquist = GetFamily() == NYQUISTEFFECTS_FAMILY;
331 bool isGenerator = GetType() == EffectTypeGenerate;
332
333 // Mix a few seconds of audio from all of the tracks
334 double previewLen;
335 gPrefs->Read(wxT("/AudioIO/EffectsPreviewLen"), &previewLen, 6.0);
336
337 const double rate = mProjectRate;
338
339 const auto &settings = access.Get();
340 if (isNyquist && isGenerator)
341 previewDuration = CalcPreviewInputLength(settings, previewLen);
342 else
343 previewDuration = std::min(settings.extra.GetDuration(),
344 CalcPreviewInputLength(settings, previewLen));
345
346 double t1 = mT0 + previewDuration;
347
348 if ((t1 > mT1) && !isGenerator) {
349 t1 = mT1;
350 }
351
352 if (t1 <= mT0)
353 return;
354
355 bool success = true;
356
357 auto cleanup = finally( [&] {
358
359 // Effect is already inited; we will call Process and then Init
360 // again, so the state is exactly the way it was before Preview
361 // was called.
362 if (!dryOnly)
363 // TODO remove this reinitialization of state within the Effect object
364 // It is done indirectly via Effect::Instance
365 MakeInstance()->Init();
366
367 // In case any dialog control depends on mT1 or mDuration:
368 if ( mUIDialog )
369 mUIDialog->TransferDataToWindow();
370 } );
371
372 auto vr0 = valueRestorer( mT0 );
373 auto vr1 = valueRestorer( mT1 );
374 // Most effects should stop at t1.
376 mT1 = t1;
377
378 // In case any dialog control depends on mT1 or mDuration:
379 if ( mUIDialog ) {
380 mUIDialog->TransferDataToWindow();
381 }
382
383 // Save the original track list
384 TrackList *saveTracks = mTracks;
385
386 auto cleanup2 = finally( [&] {
387 mTracks = saveTracks;
388 if (FocusDialog) {
389 FocusDialog->SetFocus();
390 }
391
392 // In case of failed effect, be sure to free memory.
393 ReplaceProcessedTracks( false );
394 } );
395
396 // Build NEW tracklist from rendering tracks
397 // Set the same owning project, so FindProject() can see it within Process()
398 const auto pProject = saveTracks->GetOwner();
399 auto uTracks = TrackList::Create( pProject );
400 mTracks = uTracks.get();
401
402 // Linear Effect preview optimised by pre-mixing to one track.
403 // Generators need to generate per track.
404 if (mIsLinearEffect && !isGenerator) {
405 WaveTrack::Holder mixLeft, mixRight;
406 MixAndRender(saveTracks->Selected<const WaveTrack>(),
407 Mixer::WarpOptions{ *saveTracks },
408 wxString{}, // Don't care about the name of the temporary tracks
409 mFactory, rate, floatSample, mT0, t1, mixLeft, mixRight);
410 if (!mixLeft)
411 return;
412
413 mixLeft->Offset(-mixLeft->GetStartTime());
414 mixLeft->SetSelected(true);
415 auto pLeft = mTracks->Add( mixLeft );
416 Track *pRight{};
417 if (mixRight) {
418 mixRight->Offset(-mixRight->GetStartTime());
419 mixRight->SetSelected(true);
420 pRight = mTracks->Add( mixRight );
421 mTracks->MakeMultiChannelTrack(*pLeft, 2, true);
422 }
423 }
424 else {
425 for (auto src : saveTracks->Any< const WaveTrack >()) {
426 if (src->GetSelected() || mPreviewWithNotSelected) {
427 auto dest = src->Copy(mT0, t1);
428 dest->SetSelected(src->GetSelected());
429 mTracks->Add( dest );
430 }
431 }
432 }
433
434 // NEW tracks start at time zero.
435 // Adjust mT0 and mT1 to be the times to process, and to
436 // play back in these tracks
437 mT1 -= mT0;
438 mT0 = 0.0;
439
440 // Update track/group counts
442
443 // Apply effect
444 if (!dryOnly) {
445 using namespace BasicUI;
446 auto progress = MakeProgress(
447 GetName(),
448 XO("Preparing preview"),
450 ); // Have only "Stop" button.
451 auto vr = valueRestorer( mProgress, progress.get() );
452
453 auto vr2 = valueRestorer( mIsPreview, true );
454
456 success = MakeInstance()->Process(settings);
457 });
458 }
459
460 if (success)
461 {
463
464 // Some effects (Paulstretch) may need to generate more
465 // than previewLen, so take the min.
466 t1 = std::min(mT0 + previewLen, mT1);
467
468 // Start audio playing
469 auto options = DefaultPlayOptions(*pProject);
470 int token = gAudioIO->StartStream(tracks, mT0, t1, t1, options);
471
472 if (token) {
473 auto previewing = ProgressResult::Success;
474 // The progress dialog must be deleted before stopping the stream
475 // to allow events to flow to the app during StopStream processing.
476 // The progress dialog blocks these events.
477 {
478 ProgressDialog progress
479 (GetName(), XO("Previewing"), pdlgHideCancelButton);
480
481 while (gAudioIO->IsStreamActive(token) && previewing == ProgressResult::Success) {
482 using namespace std::chrono;
483 std::this_thread::sleep_for(100ms);
484 previewing = progress.Update(gAudioIO->GetStreamTime() - mT0, t1 - mT0);
485 }
486 }
487
488 gAudioIO->StopStream();
489
490 while (gAudioIO->IsBusy()) {
491 using namespace std::chrono;
492 std::this_thread::sleep_for(100ms);
493 }
494 }
495 else {
496 using namespace BasicUI;
498 wxWidgetsWindowPlacement{ FocusDialog }, XO("Error"),
499 XO("Error opening sound device.\nTry changing the audio host, playback device and the project sample rate."),
500 wxT("Error_opening_sound_device"),
501 ErrorDialogOptions{ ErrorDialogType::ModalErrorReport } );
502 }
503 }
504}
int min(int a, int b)
#define NYQUISTEFFECTS_FAMILY
Definition: EffectBase.h:144
void MixAndRender(const TrackIterRange< const WaveTrack > &trackRange, const Mixer::WarpOptions &warpOptions, const wxString &newTrackName, WaveTrackFactory *trackFactory, double rate, sampleFormat format, double startTime, double endTime, WaveTrack::Holder &uLeft, WaveTrack::Holder &uRight)
Mixes together all input tracks, applying any envelopes, amplitude gain, panning, and real-time effec...
FileConfig * gPrefs
Definition: Prefs.cpp:71
@ pdlgHideCancelButton
AudioIOStartStreamOptions DefaultPlayOptions(AudacityProject &project, bool newDefault)
@ floatSample
Definition: SampleFormat.h:34
static AudioIO * Get()
Definition: AudioIO.cpp:140
Abstraction of a progress dialog with well defined time-to-completion estimate.
Definition: BasicUI.h:154
bool mPreviewFullSelection
Definition: EffectBase.h:129
virtual double CalcPreviewInputLength(const EffectSettings &settings, double previewLength) const =0
wxWeakRef< wxDialog > mUIDialog
This weak pointer may be the same as mUIParent, or null.
Definition: EffectBase.h:119
bool mIsLinearEffect
This weak pointer may be the same as mHostUIDialog, or null.
Definition: EffectBase.h:127
virtual EffectFamilySymbol GetFamily() const =0
Report identifier and user-visible name of the effect protocol.
void ModifySettings(Function &&function)
Do a correct read-modify-write of settings.
virtual const EffectSettings & Get()=0
static TransportTracks GetAllPlaybackTracks(TrackList &trackList, bool selectedOnly, bool nonWaveToo=false)
Abstract base class for an object holding data associated with points on a time axis.
Definition: Track.h:225
void Offset(double t)
Definition: Track.h:474
A flat linked list of tracks supporting Add, Remove, Clear, and Contains, serialization of the list o...
Definition: Track.h:1330
bool MakeMultiChannelTrack(Track &first, int nChannels, bool aligned)
Converts channels to a multichannel track.
Definition: Track.cpp:747
static std::shared_ptr< TrackList > Create(AudacityProject *pOwner)
Definition: Track.cpp:483
auto Any() -> TrackIterRange< TrackType >
Definition: Track.h:1429
std::shared_ptr< WaveTrack > Holder
Definition: WaveTrack.h:105
@ ProgressShowStop
Definition: BasicUI.h:138
void ShowErrorDialog(const WindowPlacement &placement, const TranslatableString &dlogTitle, const TranslatableString &message, const ManualPageID &helpPage, const ErrorDialogOptions &options={})
Show an error dialog with a link to the manual for further help.
Definition: BasicUI.h:241
Options for variations of error dialogs; the default is for modal dialogs.
Definition: BasicUI.h:49
Window placement information for wxWidgetsBasicUI can be constructed from a wxWindow pointer.

References TrackList::Add(), TrackList::Any(), CalcPreviewInputLength(), CountWaveTracks(), TrackList::Create(), DefaultPlayOptions(), EffectTypeGenerate, floatSample, AudioIO::Get(), EffectSettingsAccess::Get(), ProjectAudioManager::GetAllPlaybackTracks(), EffectDefinitionInterface::GetFamily(), ComponentInterface::GetName(), TrackList::GetOwner(), EffectDefinitionInterface::GetType(), gPrefs, EffectInstanceFactory::MakeInstance(), TrackList::MakeMultiChannelTrack(), BasicUI::MakeProgress(), mFactory, min(), mIsLinearEffect, mIsPreview, MixAndRender(), mNumTracks, EffectSettingsAccess::ModifySettings(), mPreviewFullSelection, mPreviewWithNotSelected, mProgress, mProjectRate, mT0, mT1, mTracks, mUIDialog, NYQUISTEFFECTS_FAMILY, Track::Offset(), pdlgHideCancelButton, BasicUI::ProgressShowStop, ReplaceProcessedTracks(), TrackList::Selected(), settings(), BasicUI::ShowErrorDialog(), BasicUI::Success, valueRestorer(), and XO.

Referenced by NoiseRemovalDialog::OnPreview(), EffectAmplify::Preview(), and EffectTimeScale::Preview().

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

◆ ReplaceProcessedTracks()

void EffectBase::ReplaceProcessedTracks ( const bool  bGoodResult)
protected

Definition at line 224 of file EffectBase.cpp.

225{
226 if (!bGoodResult) {
227 // Free resources, unless already freed.
228
229 // Processing failed or was cancelled so throw away the processed tracks.
230 if ( mOutputTracks )
231 mOutputTracks->Clear();
232
233 // Reset map
234 mIMap.clear();
235 mOMap.clear();
236
237 //TODO:undo the non-gui ODTask transfer
238 return;
239 }
240
241 // Assume resources need to be freed.
242 wxASSERT(mOutputTracks); // Make sure we at least did the CopyInputTracks().
243
244 auto iterOut = mOutputTracks->ListOfTracks::begin(),
245 iterEnd = mOutputTracks->ListOfTracks::end();
246
247 size_t cnt = mOMap.size();
248 size_t i = 0;
249
250 for (; iterOut != iterEnd; ++i) {
251 ListOfTracks::value_type o = *iterOut;
252 // If tracks were removed from mOutputTracks, then there will be
253 // tracks in the map that must be removed from mTracks.
254 while (i < cnt && mOMap[i] != o.get()) {
255 const auto t = mIMap[i];
256 if (t) {
257 mTracks->Remove(t);
258 }
259 i++;
260 }
261
262 // This should never happen
263 wxASSERT(i < cnt);
264
265 // Remove the track from the output list...don't DELETE it
266 iterOut = mOutputTracks->erase(iterOut);
267
268 const auto t = mIMap[i];
269 if (t == NULL)
270 {
271 // This track is a NEW addition to output tracks; add it to mTracks
272 mTracks->Add( o );
273 }
274 else
275 {
276 // Replace mTracks entry with the NEW track
277 mTracks->Replace(t, o);
278 }
279 }
280
281 // If tracks were removed from mOutputTracks, then there may be tracks
282 // left at the end of the map that must be removed from mTracks.
283 while (i < cnt) {
284 const auto t = mIMap[i];
285 if (t) {
286 mTracks->Remove(t);
287 }
288 i++;
289 }
290
291 // Reset map
292 mIMap.clear();
293 mOMap.clear();
294
295 // Make sure we processed everything
296 wxASSERT(mOutputTracks->empty());
297
298 // The output list is no longer needed
299 mOutputTracks.reset();
300 nEffectsDone++;
301}
std::vector< Track * > mOMap
Definition: EffectBase.h:134
std::vector< Track * > mIMap
Definition: EffectBase.h:133
static int nEffectsDone
Definition: EffectBase.h:91
ListOfTracks::value_type Replace(Track *t, const ListOfTracks::value_type &with)
Definition: Track.cpp:709

References TrackList::Add(), mIMap, mOMap, mOutputTracks, mTracks, nEffectsDone, TrackList::Remove(), and TrackList::Replace().

Referenced by DoEffect(), EffectTruncSilence::DoRemoval(), EffectTruncSilence::FindSilences(), Preview(), EffectAutoDuck::Process(), EffectChangeSpeed::Process(), EffectClickRemoval::Process(), EffectEqualization::Process(), Generator::Process(), EffectLoudness::Process(), EffectNoiseReduction::Process(), EffectNoiseRemoval::Process(), EffectNormalize::Process(), NyquistEffect::Process(), EffectPaulstretch::Process(), EffectRepair::Process(), EffectRepeat::Process(), EffectReverse::Process(), EffectSBSMS::Process(), EffectSimpleMono::Process(), EffectStereoToMono::Process(), EffectTruncSilence::Process(), and EffectTwoPassSimpleMono::Process().

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

◆ SetLinearEffectFlag()

void EffectBase::SetLinearEffectFlag ( bool  linearEffectFlag)
protected

Definition at line 206 of file EffectBase.cpp.

207{
208 mIsLinearEffect = linearEffectFlag;
209}

References mIsLinearEffect.

Referenced by EffectEcho::EffectEcho(), EffectLoudness::EffectLoudness(), EffectNoise::EffectNoise(), EffectReverb::EffectReverb(), EffectSilence::EffectSilence(), EffectWahwah::EffectWahwah(), and NyquistEffect::Parse().

Here is the caller graph for this function:

◆ SetPreviewFullSelectionFlag()

void EffectBase::SetPreviewFullSelectionFlag ( bool  previewDurationFlag)
protected

Definition at line 211 of file EffectBase.cpp.

212{
213 mPreviewFullSelection = previewDurationFlag;
214}

References mPreviewFullSelection.

Referenced by NyquistEffect::Parse().

Here is the caller graph for this function:

Friends And Related Function Documentation

◆ Effect

friend class Effect
friend

Definition at line 116 of file EffectBase.h.

Member Data Documentation

◆ mFactory

WaveTrackFactory* EffectBase::mFactory {}
protected

Definition at line 101 of file EffectBase.h.

Referenced by Effect::Delegate(), DoEffect(), and Preview().

◆ mIMap

std::vector<Track*> EffectBase::mIMap
private

◆ mIsLinearEffect

bool EffectBase::mIsLinearEffect { false }
private

This weak pointer may be the same as mHostUIDialog, or null.

Definition at line 127 of file EffectBase.h.

Referenced by Preview(), and SetLinearEffectFlag().

◆ mIsPreview

bool EffectBase::mIsPreview { false }
private

Definition at line 131 of file EffectBase.h.

Referenced by Preview().

◆ mNumGroups

int EffectBase::mNumGroups {}
private

Definition at line 137 of file EffectBase.h.

Referenced by CountWaveTracks(), and Effect::TrackGroupProgress().

◆ mNumTracks

int EffectBase::mNumTracks {}
private

Definition at line 136 of file EffectBase.h.

Referenced by CountWaveTracks(), DoEffect(), Preview(), and Effect::TrackProgress().

◆ mOMap

std::vector<Track*> EffectBase::mOMap
private

◆ mOutputTracks

std::shared_ptr<TrackList> EffectBase::mOutputTracks
protected

◆ mPresetNames

wxArrayString EffectBase::mPresetNames
protected

Definition at line 112 of file EffectBase.h.

Referenced by DoEffect(), and NyquistEffect::Parse().

◆ mPreviewFullSelection

bool EffectBase::mPreviewFullSelection { false }
private

Definition at line 129 of file EffectBase.h.

Referenced by Preview(), and SetPreviewFullSelectionFlag().

◆ mPreviewWithNotSelected

bool EffectBase::mPreviewWithNotSelected { false }
private

Definition at line 128 of file EffectBase.h.

Referenced by IncludeNotSelectedPreviewTracks(), and Preview().

◆ mProgress

BasicUI::ProgressDialog* EffectBase::mProgress {}
protected

◆ mProjectRate

double EffectBase::mProjectRate {}
protected

◆ mT0

double EffectBase::mT0 {}
protected

◆ mT1

double EffectBase::mT1 {}
protected

◆ mTracks

TrackList* EffectBase::mTracks {}
private

◆ mUIDialog

wxWeakRef<wxDialog> EffectBase::mUIDialog
private

This weak pointer may be the same as mUIParent, or null.

Definition at line 119 of file EffectBase.h.

Referenced by Effect::CloseUI(), Effect::EnableApply(), Effect::EnablePreview(), Preview(), and Effect::ShowClientInterface().

◆ mUIFlags

unsigned EffectBase::mUIFlags { 0 }
protected

Definition at line 113 of file EffectBase.h.

Referenced by Effect::Delegate(), DoEffect(), and Effect::TestUIFlags().

◆ nEffectsDone

int EffectBase::nEffectsDone = 0
staticprotected

Definition at line 91 of file EffectBase.h.

Referenced by NyquistEffect::Process(), and ReplaceProcessedTracks().


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