Audacity 3.2.0
Effect.cpp
Go to the documentation of this file.
1/**********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 Effect.cpp
6
7 Dominic Mazzoni
8 Vaughan Johnson
9 Martyn Shaw
10
11*******************************************************************//*******************************************************************/
17#include "Effect.h"
18#include "EffectOutputTracks.h"
19
20#include <algorithm>
21
22#include <wx/defs.h>
23
24#include "BasicUI.h"
25#include "ConfigInterface.h"
27#include "ShuttleAutomation.h"
28#include "SyncLock.h"
29#include "ViewInfo.h"
30#include "WaveTrack.h"
31#include "wxFileNameWrapper.h"
33
35{
36}
37
39{
40}
41
42// ComponentInterface implementation
43
45{
47}
48
50{
51 return {};
52}
53
55{
56 return XO("Audacity");
57}
58
59wxString Effect::GetVersion() const
60{
61 return AUDACITY_VERSION_STRING;
62}
63
65{
66 return {};
67}
68
69// EffectDefinitionInterface implementation
70
72{
73 return EffectTypeNone;
74}
75
77{
78 // Unusually, the internal and visible strings differ for the built-in
79 // effect family.
80 return { wxT("Audacity"), XO("Built-in") };
81}
82
84{
85 return true;
86}
87
89{
90 return true;
91}
92
94{
96}
97
99{
100 return true;
101}
102
104{
105 static const CapturedParameters<Effect> empty;
106 return empty;
107}
108
110{
111 Parameters().Visit(*this, visitor, settings);
112 return true;
113}
114
116 ConstSettingsVisitor &visitor, const EffectSettings &settings) const
117{
118 Parameters().Visit(*this, visitor, settings);
119 return true;
120}
121
123 const EffectSettings &settings, CommandParameters & parms) const
124{
125 Parameters().Get( *this, settings, parms );
126 return true;
127}
128
130 const CommandParameters & parms, EffectSettings &settings) const
132 // The first argument, and with it the const_cast, will disappear when
133 // all built-in effects are stateless.
134 return Parameters().Set( *const_cast<Effect*>(this), parms, settings );
135}
136
139{
140 // Find one string in the registry and then reinterpret it
141 // as complete settings
142 wxString parms;
144 name, wxT("Parameters"), parms))
145 return {};
146
147 return LoadSettingsFromString(parms, settings);
148}
149
151 const RegistryPath & name, const EffectSettings &settings) const
152{
153 // Save all settings as a single string value in the registry
154 wxString parms;
155 if (!SaveSettingsAsString(settings, parms))
156 return false;
157
159 name, wxT("Parameters"), parms);
160}
161
163{
164 return {};
165}
166
168{
169 return { nullptr };
170}
171
173{
175}
176
178{
179 return true;
180}
181
183{
184 return false;
185}
186
187// EffectPlugin implementation
188
190{
191 return *this;
192}
193
195{
196 if( !IsBatchProcessing() && FindProject() )
199}
200
202{
203 return wxT("SavedState");
204}
205
206// Effect implementation
207
209 const EffectSettings &settings, wxString & parms) const
210{
213 S.mpEap = &eap;
214 if( VisitSettings( S, settings ) ){
215 ;// got eap value using VisitSettings.
216 }
217 // Won't be needed in future
218 else if (!SaveSettings(settings, eap))
219 {
220 return false;
221 }
222
223 return eap.GetParameters(parms);
224}
225
227 const wxString & parms, EffectSettings &settings) const
228{
229 // If the string starts with one of certain significant substrings,
230 // then the rest of the string is reinterpreted as part of a registry key,
231 // and a user or factory preset is then loaded.
232 // (Where did these prefixes come from? See EffectPresetsDialog; and
233 // ultimately the uses of it by EffectManager::GetPreset, which is used by
234 // the macro management dialog)
235 wxString preset = parms;
236 OptionalMessage result;
237 if (preset.StartsWith(kUserPresetIdent))
238 {
239 preset.Replace(kUserPresetIdent, wxEmptyString, false);
241 }
242 else if (preset.StartsWith(kFactoryPresetIdent))
243 {
244 preset.Replace(kFactoryPresetIdent, wxEmptyString, false);
245 auto presets = GetFactoryPresets();
246 result = LoadFactoryPreset(
247 make_iterator_range( presets ).index( preset ), settings );
248 }
249 else if (preset.StartsWith(kCurrentSettingsIdent))
250 {
251 preset.Replace(kCurrentSettingsIdent, wxEmptyString, false);
253 }
254 else if (preset.StartsWith(kFactoryDefaultsIdent))
255 {
256 preset.Replace(kFactoryDefaultsIdent, wxEmptyString, false);
258 }
259 else
260 {
261 // If the string did not start with any of the significant substrings,
262 // then use VisitSettings or LoadSettings to reinterpret it,
263 // or use LoadSettings.
264 // This interprets what was written by SaveSettings, above.
265 CommandParameters eap(parms);
267 S.SetForValidating( &eap );
268 // VisitSettings returns false if not defined for this effect.
269 // To do: fix const_cast in use of VisitSettings
270 if ( !const_cast<Effect*>(this)->VisitSettings(S, settings) ) {
271 // the old method...
272 if (LoadSettings(eap, settings))
273 return { nullptr };
274 }
275 else if( !S.bOK )
276 result = {};
277 else{
278 result = { nullptr };
279 S.SetForWriting( &eap );
280 const_cast<Effect*>(this)->VisitSettings(S, settings);
281 }
282 }
283
284 if (!result)
285 {
286 using namespace BasicUI;
288 XO("%s: Could not load settings below. Default settings will be used.\n\n%s")
289 .Format( GetName(), preset ),
291 // We are using default settings and we still wish to continue.
292 result = { nullptr };
293 }
294 return result;
295}
296
297unsigned Effect::TestUIFlags(unsigned mask) {
298 return mask & mUIFlags;
299}
300
302{
303 return mIsBatch;
304}
305
307{
308 mIsBatch = true;
309 // Save effect's internal state in a special registry path
310 // just for this purpose
311 // If effect is not stateful, this step doesn't really matter, and the
312 // settings object is a dummy
313 auto dummySettings = MakeSettings();
314 SaveUserPreset(GetSavedStateGroup(), dummySettings);
315}
316
318{
319 mIsBatch = false;
320 // Restore effect's internal state from registry
321 // If effect is not stateful, this call doesn't really matter, and the
322 // settings object is a dummy
323 auto dummySettings = MakeSettings();
324 // Ignore failure
325 (void ) LoadUserPreset(GetSavedStateGroup(), dummySettings);
326}
327
329 InstanceFinder finder)
330{
331 if (!finder)
332 finder = DefaultInstanceFinder(delegate);
333
335 region.setTimes( mT0, mT1 );
336
337 return delegate.DoEffect(settings, finder, mProjectRate, mTracks.get(),
338 mFactory, region, mUIFlags, nullptr);
339}
340
341bool Effect::TotalProgress(double frac, const TranslatableString &msg) const
342{
343 auto updateResult = (mProgress ?
344 mProgress->Poll(frac * 1000, 1000, msg) :
346 return (updateResult != BasicUI::ProgressResult::Success);
347}
348
350 int whichTrack, double frac, const TranslatableString &msg) const
351{
352 auto updateResult = (mProgress ?
353 mProgress->Poll((whichTrack + frac) * 1000,
354 (double) mNumTracks * 1000, msg) :
356 return (updateResult != BasicUI::ProgressResult::Success);
357}
358
360 int whichGroup, double frac, const TranslatableString &msg) const
361{
362 auto updateResult = (mProgress ?
363 mProgress->Poll((whichGroup + frac) * 1000,
364 (double) mNumGroups * 1000, msg) :
366 return (updateResult != BasicUI::ProgressResult::Success);
367}
368
370 const WaveTrack &track, sampleCount *start, sampleCount *len)
371{
372 assert(track.IsLeader());
373 const auto t0 = std::max(mT0, track.GetStartTime());
374 const auto t1 = std::min(mT1, track.GetEndTime());
375 if (t1 > t0) {
376 *start = track.TimeToLongSamples(t0);
377 auto end = track.TimeToLongSamples(t1);
378 *len = end - *start;
379 }
380 else {
381 *start = 0;
382 *len = 0;
383 }
384}
385
387{
388 return false;
389}
390
392 const EffectSettings &, double previewLength) const
393{
394 return previewLength;
395}
wxT("CloseDown"))
Toolkit-neutral facade for basic user interface services.
int min(int a, int b)
const TranslatableString name
Definition: Distortion.cpp:76
#define BUILTIN_EFFECT_PREFIX
Definition: Effect.h:17
RegistryPath UserPresetsGroup(const RegistryPath &name)
Compute part of a registry path, given a name which may be empty.
const RegistryPath & FactoryDefaultsGroup()
Component of a configuration key path, for default state of MakeSettings()
const RegistryPath & CurrentSettingsGroup()
Component of a configuration key path, for last-used destructive settings.
EffectType
@ EffectTypeNone
std::optional< std::unique_ptr< EffectSettingsAccess::Message > > OptionalMessage
XO("Cut/Copy/Paste")
wxString RegistryPath
Definition: Identifier.h:218
wxString PluginPath
type alias for identifying a Plugin supplied by a module, each module defining its own interpretation...
Definition: Identifier.h:214
std::vector< RegistryPath > RegistryPaths
Definition: Identifier.h:219
IteratorRange< Iterator > make_iterator_range(const Iterator &i1, const Iterator &i2)
Definition: MemoryX.h:448
EffectReverbSettings preset
Definition: Reverb.cpp:44
#define S(N)
Definition: ToChars.cpp:64
static Settings & settings()
Definition: TrackInfo.cpp:83
virtual ProgressResult Poll(unsigned long long numerator, unsigned long long denominator, const TranslatableString &message={})=0
Update the bar and poll for clicks. Call only on the main thread.
Generates EffectParameterMethods overrides from variadic template arguments.
CommandParameters, derived from wxFileConfig, is essentially doing the same things as the SettingsVis...
bool GetParameters(wxString &parms)
TranslatableString GetName() const
ComponentInterfaceSymbol pairs a persistent string identifier used internally with an optional,...
const wxString & Internal() const
int mNumTracks
Definition: EffectBase.h:110
double mT1
Definition: EffectBase.h:116
WaveTrackFactory * mFactory
Definition: EffectBase.h:114
double mProjectRate
Definition: EffectBase.h:112
BasicUI::ProgressDialog * mProgress
Definition: EffectBase.h:111
int mNumGroups
Definition: EffectBase.h:127
bool DoEffect(EffectSettings &settings, const InstanceFinder &finder, double projectRate, TrackList *list, WaveTrackFactory *factory, NotifyingSelectedRegion &selectedRegion, unsigned flags, const EffectSettingsAccessPtr &pAccess) override
Definition: EffectBase.cpp:57
std::shared_ptr< TrackList > mTracks
Definition: EffectBase.h:109
static InstanceFinder DefaultInstanceFinder(EffectPlugin &plugin)
Definition: EffectBase.cpp:253
double mT0
Definition: EffectBase.h:115
unsigned mUIFlags
Definition: EffectBase.h:100
const AudacityProject * FindProject() const
Definition: EffectBase.cpp:224
RealtimeSince
In which versions of Audacity was an effect realtime capable?
Base class for many of the effects in Audacity.
Definition: Effect.h:26
bool SaveSettings(const EffectSettings &settings, CommandParameters &parms) const override
Store settings as keys and values.
Definition: Effect.cpp:122
RealtimeSince RealtimeSupport() const override
Since which version of Audacity has the effect supported realtime?
Definition: Effect.cpp:93
const EffectSettingsManager & GetDefinition() const override
Definition: Effect.cpp:189
bool TrackGroupProgress(int whichGroup, double frac, const TranslatableString &={}) const
Definition: Effect.cpp:359
bool SaveUserPreset(const RegistryPath &name, const EffectSettings &settings) const override
Save settings in the configuration file as a user-named preset.
Definition: Effect.cpp:150
void SetBatchProcessing() override
Definition: Effect.cpp:306
OptionalMessage LoadFactoryDefaults(EffectSettings &settings) const override
Definition: Effect.cpp:172
bool Delegate(Effect &delegate, EffectSettings &settings, InstanceFinder finder={})
Re-invoke DoEffect on another Effect object that implements the work.
Definition: Effect.cpp:328
bool VisitSettings(SettingsVisitor &visitor, EffectSettings &settings) override
Definition: Effect.cpp:109
bool SaveSettingsAsString(const EffectSettings &settings, wxString &parms) const override
Definition: Effect.cpp:208
void GetBounds(const WaveTrack &track, sampleCount *start, sampleCount *len)
Definition: Effect.cpp:369
OptionalMessage LoadSettingsFromString(const wxString &parms, EffectSettings &settings) const override
Definition: Effect.cpp:226
Effect()
Definition: Effect.cpp:34
bool SupportsAutomation() const override
Whether the effect has any automatable controls.
Definition: Effect.cpp:98
bool LoadSettings(const CommandParameters &parms, EffectSettings &settings) const override
Restore settings from keys and values.
Definition: Effect.cpp:129
virtual const EffectParameterMethods & Parameters() const
Definition: Effect.cpp:103
TranslatableString GetDescription() const override
Definition: Effect.cpp:64
virtual NumericFormatSymbol GetSelectionFormat()
Definition: Effect.cpp:194
bool mIsBatch
Definition: Effect.h:151
double CalcPreviewInputLength(const EffectSettings &settings, double previewLength) const override
Default implementation returns previewLength
Definition: Effect.cpp:391
OptionalMessage LoadFactoryPreset(int id, EffectSettings &settings) const override
Definition: Effect.cpp:167
bool TotalProgress(double frac, const TranslatableString &={}) const
Definition: Effect.cpp:341
bool TrackProgress(int whichTrack, double frac, const TranslatableString &={}) const
Definition: Effect.cpp:349
bool HasOptions() const override
Definition: Effect.cpp:182
wxString GetVersion() const override
Definition: Effect.cpp:59
bool CheckWhetherSkipEffect(const EffectSettings &settings) const override
Default implementation returns false.
Definition: Effect.cpp:386
PluginPath GetPath() const override
Definition: Effect.cpp:44
EffectType GetType() const override
Type determines how it behaves.
Definition: Effect.cpp:71
wxString GetSavedStateGroup()
Definition: Effect.cpp:201
bool IsBatchProcessing() const override
Definition: Effect.cpp:301
virtual ~Effect()
Definition: Effect.cpp:38
VendorSymbol GetVendor() const override
Definition: Effect.cpp:54
OptionalMessage LoadUserPreset(const RegistryPath &name, EffectSettings &settings) const override
Definition: Effect.cpp:137
bool CanExportPresets() const override
Whether the effect supports export of presets to files, and importing too.
Definition: Effect.cpp:177
ComponentInterfaceSymbol GetSymbol() const override
Definition: Effect.cpp:49
EffectFamilySymbol GetFamily() const override
Report identifier and user-visible name of the effect protocol.
Definition: Effect.cpp:76
void UnsetBatchProcessing() override
Definition: Effect.cpp:317
bool IsDefault() const override
Whether the effect sorts "above the line" in the menus.
Definition: Effect.cpp:88
unsigned TestUIFlags(unsigned mask)
Definition: Effect.cpp:297
RegistryPaths GetFactoryPresets() const override
Report names of factory presets.
Definition: Effect.cpp:162
bool IsInteractive() const override
Whether the effect needs a dialog for entry of settings.
Definition: Effect.cpp:83
Interface for manipulations of an Effect's settings.
virtual bool Set(Effect &effect, const CommandParameters &parms, EffectSettings &settings) const =0
virtual void Get(const Effect &effect, const EffectSettings &settings, CommandParameters &parms) const =0
virtual void Visit(Effect &effect, SettingsVisitor &visitor, EffectSettings &settings) const =0
static const wxString kUserPresetIdent
Definition: EffectPlugin.h:40
std::function< std::optional< InstancePointer >(EffectSettings &settings) > InstanceFinder
Definition: EffectPlugin.h:72
static const wxString kFactoryPresetIdent
Definition: EffectPlugin.h:41
static const wxString kCurrentSettingsIdent
Definition: EffectPlugin.h:42
static const wxString kFactoryDefaultsIdent
Definition: EffectPlugin.h:43
EffectSettingsManager is an EffectDefinitionInterface that adds a factory function for EffectSettings...
virtual EffectSettings MakeSettings() const
Abstract base class used in importing a file.
bool setTimes(double t0, double t1)
Definition: ViewInfo.cpp:51
const NumericFormatSymbol & GetSelectionFormat() const
static ProjectNumericFormats & Get(AudacityProject &project)
Visitor of effect or command parameters. This is a base class with lots of virtual functions that do ...
SettingsVisitor that gets parameter values into a string.
SettingsVisitor that sets parameters to a value (from a string)
Holds a msgid for the translation catalog; may also bind format arguments.
A Track that contains audio waveform data.
Definition: WaveTrack.h:221
double GetStartTime() const override
Implement WideSampleSequence.
Definition: WaveTrack.cpp:2602
bool IsLeader() const override
Definition: WaveTrack.cpp:2333
double GetEndTime() const override
Implement WideSampleSequence.
Definition: WaveTrack.cpp:2607
sampleCount TimeToLongSamples(double t0) const
Positions or offsets within audio files need a wide type.
Definition: SampleCount.h:19
MessageBoxResult ShowMessageBox(const TranslatableString &message, MessageBoxOptions options={})
Show a modal message box with either Ok or Yes and No, and optionally Cancel.
Definition: BasicUI.h:274
NUMERIC_FORMATS_API NumericFormatSymbol HoursMinsSecondsFormat()
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
Definition: PackedArray.h:159
bool SetConfig(const EffectDefinitionInterface &ident, ConfigurationType type, const RegistryPath &group, const RegistryPath &key, const Value &value)
bool GetConfig(const EffectDefinitionInterface &ident, ConfigurationType type, const RegistryPath &group, const RegistryPath &key, Value &var, const Value &defval)
MessageBoxOptions && Caption(TranslatableString caption_) &&
Definition: BasicUI.h:100
Externalized state of a plug-in.