Audacity 3.2.0
Nyquist.h
Go to the documentation of this file.
1/**********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 Nyquist.h
6
7 Dominic Mazzoni
8
9**********************************************************************/
10
11#ifndef __AUDACITY_EFFECT_NYQUIST__
12#define __AUDACITY_EFFECT_NYQUIST__
13
14#include "../StatefulEffect.h"
15#include "FileNames.h"
16#include "SampleCount.h"
17#include "wxPanelWrapper.h"
18
19#include "nyx.h"
20
21class wxArrayString;
22class wxFileName;
23class wxCheckBox;
24class wxTextCtrl;
25
26#define NYQUISTEFFECTS_VERSION wxT("1.0.0.0")
27
29{
39};
40
42{
43public:
44 NyqControl() = default;
45 NyqControl( const NyqControl& ) = default;
46 NyqControl &operator = ( const NyqControl & ) = default;
47 //NyqControl( NyqControl && ) = default;
48 //NyqControl &operator = ( NyqControl && ) = default;
49
50 int type;
51 wxString var;
52 wxString name;
53 wxString label;
54 std::vector<EnumValueSymbol> choices;
56 wxString valStr;
57 wxString lowStr;
58 wxString highStr;
59 double val;
60 double low;
61 double high;
62 int ticks;
63};
64
66 // other settings, for the Nyquist prompt; else null
68 bool proxyDebug{ false };
69 std::vector<NyqControl> controls;
70
71 // Other fields, to do
72};
73
74class AUDACITY_DLL_API NyquistEffect final
75 : public EffectWithSettings<NyquistSettings, StatefulEffect>
76{
77public:
78
82 NyquistEffect(const wxString &fName);
83 virtual ~NyquistEffect();
84
85 // ComponentInterface implementation
86
87 PluginPath GetPath() const override;
88 ComponentInterfaceSymbol GetSymbol() const override;
89 VendorSymbol GetVendor() const override;
90 wxString GetVersion() const override;
91 TranslatableString GetDescription() const override;
92
93 ManualPageID ManualPage() const override;
94 FilePath HelpPage() const override;
95
96 // EffectDefinitionInterface implementation
97
98 EffectType GetType() const override;
99 EffectType GetClassification() const override;
100 EffectFamilySymbol GetFamily() const override;
101 bool IsInteractive() const override;
102 bool IsDefault() const override;
103 bool EnablesDebug() const override;
104
105 bool SaveSettings(
106 const EffectSettings &settings, CommandParameters & parms) const override;
107 bool LoadSettings(
108 const CommandParameters & parms, EffectSettings &settings) const override;
109 bool DoLoadSettings(
111
112 bool VisitSettings(SettingsVisitor &visitor, EffectSettings &settings)
113 override;
114 bool VisitSettings(
116 const override;
117 int SetLispVarsFromParameters(const CommandParameters & parms, bool bTestOnly);
118
119 // Effect implementation
120
121 bool Init() override;
122 bool Process(EffectInstance &instance, EffectSettings &settings) override;
123 int ShowHostInterface(EffectPlugin &plugin, wxWindow &parent,
125 std::shared_ptr<EffectInstance> &pInstance, EffectSettingsAccess &access,
126 bool forceModal = false) override;
127 std::unique_ptr<EffectEditor> PopulateOrExchange(
128 ShuttleGui & S, EffectInstance &instance,
129 EffectSettingsAccess &access, const EffectOutputs *pOutputs) override;
130 bool TransferDataToWindow(const EffectSettings &settings) override;
131 bool TransferDataFromWindow(EffectSettings &settings) override;
132
133 // NyquistEffect implementation
134 // For Nyquist Workbench support
135 void RedirectOutput();
136 void SetCommand(const wxString &cmd);
137 void Continue();
138 void Break();
139 void Stop();
140
141private:
142 wxWeakRef<wxWindow> mUIParent{};
143
144 static int mReentryCount;
145 // NyquistEffect implementation
146
147 bool ProcessOne();
148
149 void BuildPromptWindow(ShuttleGui & S);
150 void BuildEffectWindow(ShuttleGui & S);
151
152 bool TransferDataToPromptWindow();
153 bool TransferDataToEffectWindow();
154
155 bool TransferDataFromPromptWindow();
156 bool TransferDataFromEffectWindow();
157
158 bool IsOk();
159 const TranslatableString &InitializationError() const { return mInitError; }
160
161 static FilePaths GetNyquistSearchPath();
162
163 static wxString NyquistToWxString(const char *nyqString);
164 wxString EscapeString(const wxString & inStr);
165 static std::vector<EnumValueSymbol> ParseChoice(const wxString & text);
166
167 FileExtensions ParseFileExtensions(const wxString & text);
168 FileNames::FileType ParseFileType(const wxString & text);
169 FileNames::FileTypes ParseFileTypes(const wxString & text);
170
171 static int StaticGetCallback(float *buffer, int channel,
172 int64_t start, int64_t len, int64_t totlen,
173 void *userdata);
174 static int StaticPutCallback(float *buffer, int channel,
175 int64_t start, int64_t len, int64_t totlen,
176 void *userdata);
177 static void StaticOutputCallback(int c, void *userdata);
178 static void StaticOSCallback(void *userdata);
179
180 int GetCallback(float *buffer, int channel,
181 int64_t start, int64_t len, int64_t totlen);
182 int PutCallback(float *buffer, int channel,
183 int64_t start, int64_t len, int64_t totlen);
184 void OutputCallback(int c);
185 void OSCallback();
186
187 void ParseFile();
188 bool ParseCommand(const wxString & cmd);
189 bool ParseProgram(wxInputStream & stream);
190 struct Tokenizer {
191 bool sl { false };
192 bool q { false };
193 int paren{ 0 };
194 wxString tok;
196
197 bool Tokenize(
198 const wxString &line, bool eof,
199 size_t trimStart, size_t trimEnd);
200 };
201 bool Parse(Tokenizer &tokenizer, const wxString &line, bool eof, bool first);
202
203 static TranslatableString UnQuoteMsgid(const wxString &s, bool allowParens = true,
204 wxString *pExtraString = nullptr);
205 static wxString UnQuote(const wxString &s, bool allowParens = true,
206 wxString *pExtraString = nullptr);
207 static double GetCtrlValue(const wxString &s);
208
209 void OnLoad(wxCommandEvent & evt);
210 void OnSave(wxCommandEvent & evt);
211 void OnDebug(wxCommandEvent & evt);
212
213 void OnText(wxCommandEvent & evt);
214 void OnSlider(wxCommandEvent & evt);
215 void OnChoice(wxCommandEvent & evt);
216 void OnTime(wxCommandEvent & evt);
217 void OnFileButton(wxCommandEvent & evt);
218
219 static void resolveFilePath(wxString & path, FileExtension extension = {});
220 bool validatePath(wxString path);
221 wxString ToTimeFormat(double t);
222
223 std::pair<bool, FilePath> CheckHelpPage() const;
224
225private:
226
227 wxString mXlispPath;
228
229 wxFileName mFileName;
230 wxDateTime mFileModified;
231
232 bool mStop;
233 bool mBreak;
234 bool mCont;
235
238 bool mTrace; // True when *tracenable* or *sal-traceback* are enabled
239 bool mIsSal;
247 const bool mIsPrompt;
248 bool mOK;
250 wxString mInputCmd; // history: exactly what the user typed
251 wxString mParameters; // The parameters of to be fed to a nested prompt
252 wxString mCmd; // the command to be processed
254 TranslatableString mPromptName; // If a prompt, we need to remember original name.
258 // Version number of the specific plug-in (not to be confused with mVersion)
259 // For shipped plug-ins this will be the same as the Audacity release version
260 // when the plug-in was last modified.
263 wxString mManPage; // ONLY use if a help page exists in the manual.
264 wxString mHelpFile;
268 EffectType mPromptType; // If a prompt, need to remember original type.
269
271 bool mDebugButton; // Set to false to disable Debug button.
272
273 bool mDebug; // When true, debug window is shown.
278
279 int mVersion; // Syntactic version of Nyquist plug-in (not to be confused with mReleaseVersion)
280 std::vector<NyqControl> mControls;
281
283 WaveTrack *mCurTrack[2];
284 sampleCount mCurStart[2];
290 unsigned mCount;
295 double mScale;
296
297 using Buffer = std::unique_ptr<float[]>;
298 Buffer mCurBuffer[2];
299 sampleCount mCurBufferStart[2];
300 size_t mCurBufferLen[2];
301
302 WaveTrack *mOutputTrack[2];
303
304 wxArrayString mCategories;
305
306 wxString mProps;
308
311
312 wxTextCtrl *mCommandText;
313
314 std::exception_ptr mpException {};
315
316 DECLARE_EVENT_TABLE()
317
319};
320
322{
323public:
324 NyquistOutputDialog(wxWindow * parent, wxWindowID id,
326 const TranslatableString & prompt,
327 const TranslatableString &message);
328
329private:
330 void OnOk(wxCommandEvent & event);
331
332private:
333 DECLARE_EVENT_TABLE()
334};
335
336
337#endif
EffectType
std::function< DialogFactoryResults(wxWindow &parent, EffectPlugin &, EffectUIServices &, EffectSettingsAccess &) > EffectDialogFactory
Type of function that creates a dialog for an effect.
wxString FileExtension
File extension, not including any leading dot.
Definition: Identifier.h:224
wxString PluginPath
type alias for identifying a Plugin supplied by a module, each module defining its own interpretation...
Definition: Identifier.h:214
static const auto title
NyqControlType
Definition: Nyquist.h:29
@ NYQ_CTRL_STRING
Definition: Nyquist.h:32
@ NYQ_CTRL_TEXT
Definition: Nyquist.h:36
@ NYQ_CTRL_TIME
Definition: Nyquist.h:37
@ NYQ_CTRL_INT_TEXT
Definition: Nyquist.h:34
@ NYQ_CTRL_INT
Definition: Nyquist.h:30
@ NYQ_CTRL_CHOICE
Definition: Nyquist.h:33
@ NYQ_CTRL_FLOAT_TEXT
Definition: Nyquist.h:35
@ NYQ_CTRL_FILE
Definition: Nyquist.h:38
@ NYQ_CTRL_FLOAT
Definition: Nyquist.h:31
wxString FilePath
Definition: Project.h:21
#define S(N)
Definition: ToChars.cpp:64
static Settings & settings()
Definition: TrackInfo.cpp:87
CommandParameters, derived from wxFileConfig, is essentially doing the same things as the SettingsVis...
ComponentInterfaceSymbol pairs a persistent string identifier used internally with an optional,...
Performs effect computation.
Hold values to send to effect output meters.
Factory of instances of an effect.
Definition: EffectPlugin.h:36
std::vector< FileType > FileTypes
Definition: FileNames.h:75
A control on a NyquistDialog.
Definition: Nyquist.h:42
wxString highStr
Definition: Nyquist.h:58
double high
Definition: Nyquist.h:61
NyqControl & operator=(const NyqControl &)=default
wxString label
Definition: Nyquist.h:53
wxString name
Definition: Nyquist.h:52
wxString var
Definition: Nyquist.h:51
NyqControl(const NyqControl &)=default
int ticks
Definition: Nyquist.h:62
NyqControl()=default
std::vector< EnumValueSymbol > choices
Definition: Nyquist.h:54
int type
Definition: Nyquist.h:50
wxString valStr
Definition: Nyquist.h:56
double low
Definition: Nyquist.h:60
double val
Definition: Nyquist.h:59
FileNames::FileTypes fileTypes
Definition: Nyquist.h:55
wxString lowStr
Definition: Nyquist.h:57
An Effect that calls up a Nyquist (XLISP) plug-in, i.e. many possible effects from this one class.
Definition: Nyquist.h:76
bool mDebugButton
Definition: Nyquist.h:271
bool mIsSpectral
Definition: Nyquist.h:241
EffectType mType
Definition: Nyquist.h:267
wxTextCtrl * mCommandText
Definition: Nyquist.h:312
bool mBreak
Definition: Nyquist.h:233
TranslatableString mDebugOutput
Definition: Nyquist.h:277
bool mEnablePreview
Definition: Nyquist.h:270
bool mRestoreSplits
Definition: Nyquist.h:309
TranslatableString mCopyright
Definition: Nyquist.h:262
int mVersion
Definition: Nyquist.h:279
TranslatableString mPromptName
Definition: Nyquist.h:254
bool mFoundType
Definition: Nyquist.h:236
const TranslatableString & InitializationError() const
Definition: Nyquist.h:159
double mProgressOut
Definition: Nyquist.h:293
bool mHelpFileExists
Definition: Nyquist.h:265
double mScale
Definition: Nyquist.h:295
wxString mManPage
Definition: Nyquist.h:263
bool mDebug
Definition: Nyquist.h:273
bool mCont
Definition: Nyquist.h:234
wxString mXlispPath
Definition: Nyquist.h:227
unsigned mCurNumChannels
Definition: Nyquist.h:282
wxString mPerTrackProps
Definition: Nyquist.h:307
double mProgressIn
Definition: Nyquist.h:292
wxDateTime mFileModified
When the script was last modified on disk.
Definition: Nyquist.h:230
static int mReentryCount
Definition: Nyquist.h:144
bool mStop
Definition: Nyquist.h:232
TranslatableString mAuthor
Definition: Nyquist.h:257
FilePath mHelpPage
Definition: Nyquist.h:266
std::unique_ptr< float[]> Buffer
Definition: Nyquist.h:297
unsigned mNumSelectedChannels
Definition: Nyquist.h:291
wxString mHelpFile
Definition: Nyquist.h:264
int mMergeClips
Definition: Nyquist.h:310
bool mRedirectOutput
Definition: Nyquist.h:274
const bool mIsPrompt
Definition: Nyquist.h:247
sampleCount mMaxLen
Definition: Nyquist.h:286
wxFileName mFileName
Name of the Nyquist script file this effect is loaded from.
Definition: Nyquist.h:229
wxString mDebugOutputStr
Definition: Nyquist.h:276
wxString mInputCmd
Definition: Nyquist.h:250
bool mProjectChanged
Definition: Nyquist.h:275
bool mExternal
Definition: Nyquist.h:240
bool mFirstInGroup
Definition: Nyquist.h:288
sampleCount mCurLen
Definition: Nyquist.h:285
TranslatableString mName
Name of the Effect (untranslated)
Definition: Nyquist.h:253
NyquistEffect(const wxString &fName)
TranslatableString mAction
Definition: Nyquist.h:255
wxString mProps
Definition: Nyquist.h:306
std::vector< NyqControl > mControls
Definition: Nyquist.h:280
int mTrackIndex
Definition: Nyquist.h:287
bool mCompiler
Definition: Nyquist.h:237
wxArrayString mCategories
Definition: Nyquist.h:304
TranslatableString mReleaseVersion
Definition: Nyquist.h:261
double mOutputTime
Definition: Nyquist.h:289
double mProgressTot
Definition: Nyquist.h:294
void OnDebug(wxCommandEvent &evt)
bool mIsTool
Definition: Nyquist.h:242
wxString mCmd
Definition: Nyquist.h:252
TranslatableString mInitError
Definition: Nyquist.h:249
wxString mParameters
Definition: Nyquist.h:251
bool mTrace
Definition: Nyquist.h:238
bool mIsSal
Definition: Nyquist.h:239
TranslatableString mInfo
Definition: Nyquist.h:256
EffectType mPromptType
Definition: Nyquist.h:268
unsigned mCount
Definition: Nyquist.h:290
Dialog used with NyquistEffect.
Definition: Nyquist.h:322
Visitor of effect or command parameters. This is a base class with lots of virtual functions that do ...
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Definition: ShuttleGui.h:625
Holds a msgid for the translation catalog; may also bind format arguments.
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
Extend wxArrayString with move operations and construction and insertion fromstd::initializer_list.
void OnSave(const CommandContext &context)
Definition: FileMenus.cpp:227
static RegisteredToolbarFactory factory
Externalized state of a plug-in.
wxArrayStringEx tokens
Definition: Nyquist.h:195
std::vector< NyqControl > controls
Definition: Nyquist.h:69
EffectSettings proxySettings
Definition: Nyquist.h:67
bool proxyDebug
Definition: Nyquist.h:68