Audacity  3.0.3
LadspaEffect.cpp
Go to the documentation of this file.
1 /**********************************************************************
2 
3  Audacity: A Digital Audio Editor
4 
5  LadspaEffect.cpp
6 
7  Dominic Mazzoni
8 
9  This class implements a LADSPA Plug-in effect.
10 
11 *******************************************************************//****************************************************************//*******************************************************************/
23 
24 
25 
26 #include "LadspaEffect.h" // This class's header file
27 #include "SampleCount.h"
28 
29 #include <float.h>
30 
31 #if !defined(__WXMSW__)
32 #include <dlfcn.h>
33 
34 #ifndef RTLD_DEEPBIND
35 #define RTLD_DEEPBIND 0
36 #endif
37 #endif
38 
39 #include <wx/setup.h> // for wxUSE_* macros
40 #include <wx/wxprec.h>
41 #include <wx/button.h>
42 #include <wx/checkbox.h>
43 #include <wx/dcclient.h>
44 #include <wx/filename.h>
45 #include <wx/log.h>
46 #include <wx/menu.h>
47 #include <wx/sizer.h>
48 #include <wx/slider.h>
49 #include <wx/statbox.h>
50 #include <wx/stattext.h>
51 #include <wx/textctrl.h>
52 #include <wx/tokenzr.h>
53 #include <wx/intl.h>
54 #include <wx/scrolwin.h>
55 #include <wx/version.h>
56 
57 #include "FileNames.h"
58 #include "../../ShuttleGui.h"
59 #include "../../widgets/NumericTextCtrl.h"
60 #include "../../widgets/valnum.h"
61 #include "../../widgets/wxPanelWrapper.h"
62 #include "../../ModuleManager.h"
63 
64 #if wxUSE_ACCESSIBILITY
65 #include "../../widgets/WindowAccessible.h"
66 #endif
67 
68 // ============================================================================
69 // List of effects that ship with Audacity. These will be autoregistered.
70 // ============================================================================
71 const static wxChar *kShippedEffects[] =
72 {
73  wxT("sc4_1882.dll"),
74 };
75 
76 // ============================================================================
77 // Module registration entry point
78 //
79 // This is the symbol that Audacity looks for when the module is built as a
80 // dynamic library.
81 //
82 // When the module is builtin to Audacity, we use the same function, but it is
83 // declared static so as not to clash with other builtin modules.
84 // ============================================================================
85 DECLARE_MODULE_ENTRY(AudacityModule)
86 {
87  // Create and register the importer
88  // Trust the module manager not to leak this
90 }
91 
92 // ============================================================================
93 // Register this as a builtin module
94 // ============================================================================
95 DECLARE_BUILTIN_MODULE(LadspaBuiltin);
96 
98 //
99 // LadspaEffectsModule
100 //
102 
104 {
105 }
106 
108 {
109 }
110 
111 // ============================================================================
112 // ComponentInterface implementation
113 // ============================================================================
114 
116 {
117  return {};
118 }
119 
121 {
122  /* i18n-hint: abbreviates "Linux Audio Developer's Simple Plugin API"
123  (Application programming interface)
124  */
125  return XO("LADSPA Effects");
126 }
127 
129 {
130  return XO("The Audacity Team");
131 }
132 
134 {
135  // This "may" be different if this were to be maintained as a separate DLL
136  return LADSPAEFFECTS_VERSION;
137 }
138 
140 {
141  return XO("Provides LADSPA Effects");
142 }
143 
144 // ============================================================================
145 // ModuleInterface implementation
146 // ============================================================================
147 
149 {
150  // Nothing to do here
151  return true;
152 }
153 
155 {
156  // Nothing to do here
157  return;
158 }
159 
161 {
162 #if USE_LADSPA
163  return LADSPAEFFECTS_FAMILY;
164 #else
165  return {};
166 #endif
167 }
168 
170 {
171  static FileExtensions result{{
172 
173 #ifdef __WXMSW__
174 
175  _T("dll")
176 
177 #else
178 
179  _T("so")
180 
181  #ifdef __WXMAC__
182  // Is it correct that these are candidate plug-in files too for macOs?
183  , _T("dylib")
184  #endif
185 
186 #endif
187 
188  }};
189  return result;
190 }
191 
193 {
194  // To do: better choice
195  return FileNames::PlugInDir();
196 }
197 
199 {
200  // Autoregister effects that we "think" are ones that have been shipped with
201  // Audacity. A little simplistic, but it should suffice for now.
202  auto pathList = GetSearchPaths();
203  FilePaths files;
204  TranslatableString ignoredErrMsg;
205 
206  for (int i = 0; i < (int)WXSIZEOF(kShippedEffects); i++)
207  {
208  files.clear();
209  pm.FindFilesInPathList(kShippedEffects[i], pathList, files);
210  for (size_t j = 0, cnt = files.size(); j < cnt; j++)
211  {
212  if (!pm.IsPluginRegistered(files[j]))
213  {
214  // No checking for error ?
215  DiscoverPluginsAtPath(files[j], ignoredErrMsg,
217  }
218  }
219  }
220 
221  // We still want to be called during the normal registration process
222  return false;
223 }
224 
226 {
227  auto pathList = GetSearchPaths();
228  FilePaths files;
229 
230 #if defined(__WXMAC__)
231 
232  // Recursively scan for all shared objects
233  pm.FindFilesInPathList(wxT("*.so"), pathList, files, true);
234 
235 #elif defined(__WXMSW__)
236 
237  // Recursively scan for all DLLs
238  pm.FindFilesInPathList(wxT("*.dll"), pathList, files, true);
239 
240 #else
241 
242  // Recursively scan for all shared objects
243  pm.FindFilesInPathList(wxT("*.so"), pathList, files, true);
244 
245 #endif
246 
247  return { files.begin(), files.end() };
248 }
249 
251  const PluginPath & path, TranslatableString &errMsg,
252  const RegistrationCallback &callback)
253 {
254  errMsg = {};
255  // Since we now have builtin VST support, ignore the VST bridge as it
256  // causes duplicate menu entries to appear.
257  wxFileName ff(path);
258  if (ff.GetName().CmpNoCase(wxT("vst-bridge")) == 0) {
259  errMsg = XO("Audacity no longer uses vst-bridge");
260  return 0;
261  }
262 
263  // As a courtesy to some plug-ins that might be bridges to
264  // open other plug-ins, we set the current working
265  // directory to be the plug-in's directory.
266  wxString envpath;
267  bool hadpath = wxGetEnv(wxT("PATH"), &envpath);
268  wxSetEnv(wxT("PATH"), ff.GetPath() + wxFILE_SEP_PATH + envpath);
269  wxString saveOldCWD = ff.GetCwd();
270  ff.SetCwd();
271 
272  int index = 0;
273  int nLoaded = 0;
274  LADSPA_Descriptor_Function mainFn = NULL;
275 #if defined(__WXMSW__)
276  wxDynamicLibrary lib;
277  if (lib.Load(path, wxDL_NOW)) {
278  wxLogNull logNo;
279 
280  mainFn = (LADSPA_Descriptor_Function) lib.GetSymbol(wxT("ladspa_descriptor"));
281 #else
282  void *lib = dlopen((const char *)path.ToUTF8(), RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND);
283  if (lib) {
284  mainFn = (LADSPA_Descriptor_Function) dlsym(lib, "ladspa_descriptor");
285 #endif
286 
287  if (mainFn) {
288  const LADSPA_Descriptor *data;
289 
290  for (data = mainFn(index); data; data = mainFn(++index)) {
291  LadspaEffect effect(path, index);
292  if (effect.SetHost(NULL)) {
293  ++nLoaded;
294  if (callback)
295  callback( this, &effect );
296  }
297  else
298  errMsg = XO("Could not load the library");
299  }
300  }
301  }
302  else
303  errMsg = XO("Could not load the library");
304 
305 #if defined(__WXMSW__)
306  if (lib.IsLoaded()) {
307  // PRL: I suspect Bug1257 -- Crash when enabling Amplio2 -- is the fault of a timing-
308  // dependent multi-threading bug in the Amplio2 library itself, in case the unload of the .dll
309  // comes too soon after the load. I saw the bug in Release builds but not Debug.
310  // A sleep of even 1 ms was enough to fix the problem for me, but let's be even more generous.
311  ::wxMilliSleep(10);
312  lib.Unload();
313  }
314 #else
315  if (lib) {
316  dlclose(lib);
317  }
318 #endif
319 
320  wxSetWorkingDirectory(saveOldCWD);
321  hadpath ? wxSetEnv(wxT("PATH"), envpath) : wxUnsetEnv(wxT("PATH"));
322 
323  return nLoaded;
324 }
325 
326 bool LadspaEffectsModule::IsPluginValid(const PluginPath & path, bool bFast)
327 {
328  if( bFast )
329  return true;
330  wxString realPath = path.BeforeFirst(wxT(';'));
331  return wxFileName::FileExists(realPath);
332 }
333 
334 std::unique_ptr<ComponentInterface>
336 {
337  // Acquires a resource for the application.
338  // For us, the path is two words.
339  // 1) The library's path
340  // 2) The LADSPA descriptor index
341  long index;
342  wxString realPath = path.BeforeFirst(wxT(';'));
343  path.AfterFirst(wxT(';')).ToLong(&index);
344  return std::make_unique<LadspaEffect>(realPath, (int)index);
345 }
346 
348 {
349  FilePaths pathList;
350  wxString pathVar;
351 
352  // Check for the LADSPA_PATH environment variable
353  pathVar = wxString::FromUTF8(getenv("LADSPA_PATH"));
354  if (!pathVar.empty())
355  {
356  wxStringTokenizer tok(pathVar, wxPATH_SEP);
357  while (tok.HasMoreTokens())
358  {
359  pathList.push_back(tok.GetNextToken());
360  }
361  }
362 
363 #if defined(__WXMAC__)
364 #define LADSPAPATH wxT("/Library/Audio/Plug-Ins/LADSPA")
365 
366  // Look in ~/Library/Audio/Plug-Ins/LADSPA and /Library/Audio/Plug-Ins/LADSPA
367  pathList.push_back(wxGetHomeDir() + wxFILE_SEP_PATH + LADSPAPATH);
368  pathList.push_back(LADSPAPATH);
369 
370 #elif defined(__WXMSW__)
371 
372  // No special paths...probably should look in %CommonProgramFiles%\LADSPA
373 
374 #else
375 
376  pathList.push_back(wxGetHomeDir() + wxFILE_SEP_PATH + wxT(".ladspa"));
377 #if defined(__LP64__)
378  pathList.push_back(wxT("/usr/local/lib64/ladspa"));
379  pathList.push_back(wxT("/usr/lib64/ladspa"));
380 #endif
381  pathList.push_back(wxT("/usr/local/lib/ladspa"));
382  pathList.push_back(wxT("/usr/lib/ladspa"));
383  pathList.push_back(wxT(LIBDIR) wxT("/ladspa"));
384 
385 #endif
386 
387  return pathList;
388 }
389 
391 //
392 // LadspaEffectOptionsDialog
393 //
395 
397 {
398 public:
399  LadspaEffectOptionsDialog(wxWindow * parent, EffectHostInterface *host);
400  virtual ~LadspaEffectOptionsDialog();
401 
402  void PopulateOrExchange(ShuttleGui & S);
403 
404  void OnOk(wxCommandEvent & evt);
405 
406 private:
409 
410  DECLARE_EVENT_TABLE()
411 };
412 
413 BEGIN_EVENT_TABLE(LadspaEffectOptionsDialog, wxDialogWrapper)
416 
418 : wxDialogWrapper(parent, wxID_ANY, XO("LADSPA Effect Options"))
419 {
420  mHost = host;
421 
422  mHost->GetSharedConfig(wxT("Options"), wxT("UseLatency"), mUseLatency, true);
423 
424  ShuttleGui S(this, eIsCreating);
425  PopulateOrExchange(S);
426 }
427 
429 {
430 }
431 
433 {
434  S.SetBorder(5);
435  S.StartHorizontalLay(wxEXPAND, 1);
436  {
437  S.StartVerticalLay(false);
438  {
439  S.StartStatic(XO("Latency Compensation"));
440  {
441  S.AddVariableText( XO(
442 "As part of their processing, some LADSPA effects must delay returning "
443 "audio to Audacity. When not compensating for this delay, you will "
444 "notice that small silences have been inserted into the audio. "
445 "Enabling this option will provide that compensation, but it may "
446 "not work for all LADSPA effects."),
447  false, 0, 650);
448 
449  S.StartHorizontalLay(wxALIGN_LEFT);
450  {
451  S.TieCheckBox(XXO("Enable &compensation"),
452  mUseLatency);
453  }
454  S.EndHorizontalLay();
455  }
456  S.EndStatic();
457  }
458  S.EndVerticalLay();
459  }
460  S.EndHorizontalLay();
461 
462  S.AddStandardButtons();
463 
464  Layout();
465  Fit();
466  Center();
467 }
468 
469 void LadspaEffectOptionsDialog::OnOk(wxCommandEvent & WXUNUSED(evt))
470 {
471  if (!Validate())
472  {
473  return;
474  }
475 
477  PopulateOrExchange(S);
478 
479  mHost->SetSharedConfig(wxT("Options"), wxT("UseLatency"), mUseLatency);
480 
481  EndModal(wxID_OK);
482 }
483 
484 enum
485 {
486  ID_Duration = 20000,
487  ID_Toggles = 21000,
488  ID_Sliders = 22000,
489  ID_Texts = 23000,
490 };
491 
493 //
494 // LadspaEffectMeter
495 //
497 
498 class LadspaEffectMeter final : public wxWindow
499 {
500 public:
501  LadspaEffectMeter(wxWindow *parent, const float & val, float min, float max);
502  virtual ~LadspaEffectMeter();
503 
504 private:
505  void OnErase(wxEraseEvent & evt);
506  void OnPaint(wxPaintEvent & evt);
507  void OnIdle(wxIdleEvent & evt);
508  void OnSize(wxSizeEvent & evt);
509 
510 private:
511  const float & mVal;
512  float mMin;
513  float mMax;
514  float mLastValue;
515 
516  DECLARE_EVENT_TABLE()
517 };
518 
519 BEGIN_EVENT_TABLE(LadspaEffectMeter, wxWindow)
520  EVT_IDLE(LadspaEffectMeter::OnIdle)
521  EVT_ERASE_BACKGROUND(LadspaEffectMeter::OnErase)
522  EVT_PAINT(LadspaEffectMeter::OnPaint)
523  EVT_SIZE(LadspaEffectMeter::OnSize)
525 
526 LadspaEffectMeter::LadspaEffectMeter(wxWindow *parent, const float & val, float min, float max)
527 : wxWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDEFAULT_CONTROL_BORDER),
528  mVal(val)
529 {
530  mMin = min;
531  mMax = max;
532  mLastValue = -mVal;
533 
534  SetBackgroundColour(*wxWHITE);
535 }
536 
538 {
539 }
540 
541 void LadspaEffectMeter::OnIdle(wxIdleEvent &evt)
542 {
543  evt.Skip();
544  if (mLastValue != mVal)
545  {
546  Refresh(false);
547  }
548 }
549 
550 void LadspaEffectMeter::OnErase(wxEraseEvent & WXUNUSED(evt))
551 {
552  // Just ignore it to prevent flashing
553 }
554 
555 void LadspaEffectMeter::OnPaint(wxPaintEvent & WXUNUSED(evt))
556 {
557  wxPaintDC dc(this);
558 
559  // Cache some metrics
560  wxRect r = GetClientRect();
561  wxCoord x = r.GetLeft();
562  wxCoord y = r.GetTop();
563  wxCoord w = r.GetWidth();
564  wxCoord h = r.GetHeight();
565 
566  // These use unscaled value, min, and max
567  float val = mVal;
568  if (val > mMax)
569  {
570  val = mMax;
571  }
572  if (val < mMin)
573  {
574  val = mMin;
575  }
576  val -= mMin;
577 
578  // Setup for erasing the background
579  dc.SetPen(*wxTRANSPARENT_PEN);
580  dc.SetBrush(wxColour(100, 100, 220));
581 
582  dc.Clear();
583  dc.DrawRectangle(x, y, (w * (val / fabs(mMax - mMin))), h);
584 
585  mLastValue = mVal;
586 }
587 
588 void LadspaEffectMeter::OnSize(wxSizeEvent & WXUNUSED(evt))
589 {
590  Refresh(false);
591 }
592 
594 //
595 // LadspaEffect
596 //
598 
599 BEGIN_EVENT_TABLE(LadspaEffect, wxEvtHandler)
600  EVT_COMMAND_RANGE(ID_Toggles, ID_Toggles + 999, wxEVT_COMMAND_CHECKBOX_CLICKED, LadspaEffect::OnCheckBox)
601  EVT_COMMAND_RANGE(ID_Sliders, ID_Sliders + 999, wxEVT_COMMAND_SLIDER_UPDATED, LadspaEffect::OnSlider)
604 
605 LadspaEffect::LadspaEffect(const wxString & path, int index)
606 {
607  mPath = path;
608  mIndex = index;
609  mData = NULL;
610 
611  mHost = NULL;
612  mMaster = NULL;
613  mReady = false;
614 
615  mInteractive = false;
616 
617  mAudioIns = 0;
618  mAudioOuts = 0;
619  mNumInputControls = 0;
620  mNumOutputControls = 0;
621  mSampleRate = 44100;
622  mBlockSize = 0;
623 
624  mLatencyPort = -1;
625 
626  mDialog = NULL;
627  mParent = NULL;
628 }
629 
631 {
632 }
633 
634 // ============================================================================
635 // ComponentInterface implementation
636 // ============================================================================
637 
639 {
640  return wxString::Format(wxT("%s;%d"), mPath, mIndex);
641 }
642 
644 {
645  return LAT1CTOWX(mData->Name);
646 }
647 
649 {
650  return { LAT1CTOWX(mData->Maker) };
651 }
652 
654 {
655  return _("n/a");
656 }
657 
659 {
660  return Verbatim( LAT1CTOWX(mData->Copyright) );
661 }
662 
663 // ============================================================================
664 // EffectDefinitionInterface implementation
665 // ============================================================================
666 
668 {
669  if (mAudioIns == 0 && mAudioOuts == 0)
670  {
671  return EffectTypeTool;
672  }
673 
674  if (mAudioIns == 0)
675  {
676  return EffectTypeGenerate;
677  }
678 
679  if (mAudioOuts == 0)
680  {
681  return EffectTypeAnalyze;
682  }
683 
684  return EffectTypeProcess;
685 }
686 
688 {
689  return LADSPAEFFECTS_FAMILY;
690 }
691 
693 {
694  return mInteractive;
695 }
696 
698 {
699  return false;
700 }
701 
703 {
704  return false;
705 }
706 
708 {
709  return GetType() != EffectTypeGenerate;
710 }
711 
713 {
714  return mNumInputControls > 0;
715 }
716 
717 // ============================================================================
718 // EffectClientInterface Implementation
719 // ============================================================================
720 
722 {
723  mHost = host;
724 
725  if (!Load())
726  {
727  return false;
728  }
729 
730  mInputPorts.reinit( mData->PortCount );
731  mOutputPorts.reinit( mData->PortCount );
732  mInputControls.reinit( mData->PortCount );
733  mOutputControls.reinit( mData->PortCount );
734 
735  for (unsigned long p = 0; p < mData->PortCount; p++)
736  {
737  LADSPA_PortDescriptor d = mData->PortDescriptors[p];
738 
739  // Collect the audio ports
740  if (LADSPA_IS_PORT_AUDIO(d))
741  {
742  if (LADSPA_IS_PORT_INPUT(d))
743  {
744  mInputPorts[mAudioIns++] = p;
745  }
746  else if (LADSPA_IS_PORT_OUTPUT(d))
747  {
748  mOutputPorts[mAudioOuts++] = p;
749  }
750  }
751  // Determine the port's default value
753  {
754  mInteractive = true;
755 
756  LADSPA_PortRangeHint hint = mData->PortRangeHints[p];
757  float val = float(1.0);
758  float lower = hint.LowerBound;
759  float upper = hint.UpperBound;
760 
762  {
763  lower *= mSampleRate;
764  upper *= mSampleRate;
765  }
766 
767  if (LADSPA_IS_HINT_BOUNDED_BELOW(hint.HintDescriptor) && val < lower)
768  {
769  val = lower;
770  }
771 
772  if (LADSPA_IS_HINT_BOUNDED_ABOVE(hint.HintDescriptor) && val > upper)
773  {
774  val = upper;
775  }
776 
778  {
779  val = lower;
780  }
781 
783  {
784  val = upper;
785  }
786 
788  {
790  {
791  val = exp(log(lower) * 0.75f + log(upper) * 0.25f);
792  }
793  else
794  {
795  val = lower * 0.75f + upper * 0.25f;
796  }
797  }
798 
800  {
802  {
803  val = exp(log(lower) * 0.5f + log(upper) * 0.5f);
804  }
805  else
806  {
807  val = lower * 0.5f + upper * 0.5f;
808  }
809  }
810 
812  {
814  {
815  val = exp(log(lower) * 0.25f + log(upper) * 0.75f);
816  }
817  else
818  {
819  val = lower * 0.25f + upper * 0.75f;
820  }
821  }
822 
824  {
825  val = 0.0f;
826  }
827 
829  {
830  val = 1.0f;
831  }
832 
834  {
835  val = 100.0f;
836  }
837 
839  {
840  val = 440.0f;
841  }
842 
843  mNumInputControls++;
844  mInputControls[p] = val;
845  }
847  {
848  mOutputControls[p] = 0.0;
849 
850  // LADSPA effects have a convention of providing latency on an output
851  // control port whose name is "latency".
852  if (strcmp(mData->PortNames[p], "latency") == 0)
853  {
854  mLatencyPort = p;
855  }
856  else
857  {
858  mInteractive = true;
859  mNumOutputControls++;
860  }
861  }
862  }
863 
864  // mHost will be null during registration
865  if (mHost)
866  {
867  mHost->GetSharedConfig(wxT("Options"), wxT("UseLatency"), mUseLatency, true);
868 
869  bool haveDefaults;
870  mHost->GetPrivateConfig(mHost->GetFactoryDefaultsGroup(), wxT("Initialized"), haveDefaults, false);
871  if (!haveDefaults)
872  {
873  SaveParameters(mHost->GetFactoryDefaultsGroup());
874  mHost->SetPrivateConfig(mHost->GetFactoryDefaultsGroup(), wxT("Initialized"), true);
875  }
876 
877  LoadParameters(mHost->GetCurrentSettingsGroup());
878  }
879 
880  return true;
881 }
882 
884 {
885  return mAudioIns;
886 }
887 
889 {
890  return mAudioOuts;
891 }
892 
894 {
895  return 0;
896 }
897 
899 {
900  return 0;
901 }
902 
904 {
905  mSampleRate = rate;
906 }
907 
908 size_t LadspaEffect::SetBlockSize(size_t maxBlockSize)
909 {
910  mBlockSize = maxBlockSize;
911 
912  return mBlockSize;
913 }
914 
916 {
917  return mBlockSize;
918 }
919 
921 {
922  if (mUseLatency && mLatencyPort >= 0 && !mLatencyDone)
923  {
924  mLatencyDone = true;
925  return sampleCount ( mOutputControls[mLatencyPort] );
926  }
927 
928  return 0;
929 }
930 
932 {
933  return 0;
934 }
935 
937 {
938  return mReady;
939 }
940 
941 bool LadspaEffect::ProcessInitialize(sampleCount WXUNUSED(totalLen), ChannelNames WXUNUSED(chanMap))
942 {
943  /* Instantiate the plugin */
944  if (!mReady)
945  {
946  mMaster = InitInstance(mSampleRate);
947  if (!mMaster)
948  {
949  return false;
950  }
951  mReady = true;
952  }
953 
954  mLatencyDone = false;
955 
956  return true;
957 }
958 
960 {
961  if (mReady)
962  {
963  mReady = false;
964 
965  FreeInstance(mMaster);
966  mMaster = NULL;
967  }
968 
969  return true;
970 }
971 
972 size_t LadspaEffect::ProcessBlock(float **inBlock, float **outBlock, size_t blockLen)
973 {
974  for (int i = 0; i < (int)mAudioIns; i++)
975  {
976  mData->connect_port(mMaster, mInputPorts[i], inBlock[i]);
977  }
978 
979  for (int i = 0; i < (int)mAudioOuts; i++)
980  {
981  mData->connect_port(mMaster, mOutputPorts[i], outBlock[i]);
982  }
983 
984  mData->run(mMaster, blockLen);
985 
986  RefreshControls(true);
987 
988  return blockLen;
989 }
990 
992 {
993  return true;
994 }
995 
996 bool LadspaEffect::RealtimeAddProcessor(unsigned WXUNUSED(numChannels), float sampleRate)
997 {
998  LADSPA_Handle slave = InitInstance(sampleRate);
999  if (!slave)
1000  {
1001  return false;
1002  }
1003 
1004  mSlaves.push_back(slave);
1005 
1006  return true;
1007 }
1008 
1010 {
1011  for (size_t i = 0, cnt = mSlaves.size(); i < cnt; i++)
1012  {
1013  FreeInstance(mSlaves[i]);
1014  }
1015  mSlaves.clear();
1016 
1017  return true;
1018 }
1019 
1021 {
1022  return true;
1023 }
1024 
1026 {
1027  return true;
1028 }
1029 
1031 {
1032  return true;
1033 }
1034 
1036  float **inbuf,
1037  float **outbuf,
1038  size_t numSamples)
1039 {
1040  for (int i = 0; i < (int)mAudioIns; i++)
1041  {
1042  mData->connect_port(mSlaves[group], mInputPorts[i], inbuf[i]);
1043  }
1044 
1045  for (int i = 0; i < (int)mAudioOuts; i++)
1046  {
1047  mData->connect_port(mSlaves[group], mOutputPorts[i], outbuf[i]);
1048  }
1049 
1050  mData->run(mSlaves[group], numSamples);
1051 
1052  return numSamples;
1053 }
1054 
1056 {
1057  return true;
1058 }
1059 
1061  wxWindow &parent, const EffectDialogFactory &factory, bool forceModal)
1062 {
1063  if (mDialog)
1064  {
1065  if ( mDialog->Close(true) )
1066  mDialog = nullptr;
1067  return false;
1068  }
1069 
1070  // mDialog is null
1071  auto cleanup = valueRestorer( mDialog );
1072 
1073  if ( factory )
1074  mDialog = factory(parent, mHost, this);
1075  if (!mDialog)
1076  {
1077  return false;
1078  }
1079 
1080  mDialog->Layout();
1081  mDialog->Fit();
1082  mDialog->SetMinSize(mDialog->GetSize());
1083 
1084  if ((SupportsRealtime() || GetType() == EffectTypeAnalyze) && !forceModal)
1085  {
1086  mDialog->Show();
1087  cleanup.release();
1088 
1089  return false;
1090  }
1091 
1092  bool res = mDialog->ShowModal() != 0;
1093 
1094  return res;
1095 }
1096 
1098 {
1099  for (unsigned long p = 0; p < mData->PortCount; p++)
1100  {
1101  LADSPA_PortDescriptor d = mData->PortDescriptors[p];
1102 
1104  {
1105  if (!parms.Write(LAT1CTOWX(mData->PortNames[p]), mInputControls[p]))
1106  {
1107  return false;
1108  }
1109  }
1110  }
1111 
1112  return true;
1113 }
1114 
1116 {
1117  for (unsigned long p = 0; p < mData->PortCount; p++)
1118  {
1119  LADSPA_PortDescriptor descriptor = mData->PortDescriptors[p];
1120 
1121  if (LADSPA_IS_PORT_CONTROL(descriptor) && LADSPA_IS_PORT_INPUT(descriptor))
1122  {
1123  wxString labelText = LAT1CTOWX(mData->PortNames[p]);
1124  double d = 0.0;
1125  if (!parms.Read(labelText, &d))
1126  {
1127  return false;
1128  }
1129 
1130  mInputControls[p] = d;
1131  }
1132  }
1133 
1134  return true;
1135 }
1136 
1138 {
1139  if (!LoadParameters(name))
1140  {
1141  return false;
1142  }
1143 
1144  RefreshControls();
1145 
1146  return true;
1147 }
1148 
1150 {
1151  return SaveParameters(name);
1152 }
1153 
1155 {
1156  return {};
1157 }
1158 
1159 bool LadspaEffect::LoadFactoryPreset(int WXUNUSED(id))
1160 {
1161  return true;
1162 }
1163 
1165 {
1166  if (!LoadParameters(mHost->GetFactoryDefaultsGroup()))
1167  {
1168  return false;
1169  }
1170 
1171  RefreshControls();
1172 
1173  return true;
1174 }
1175 
1176 // ============================================================================
1177 // EffectUIClientInterface Implementation
1178 // ============================================================================
1179 
1181 {
1182  mUIHost = host;
1183 }
1184 
1186 {
1187  auto parent = S.GetParent();
1188 
1189  mParent = parent;
1190 
1191  mParent->PushEventHandler(this);
1192 
1193  mToggles.reinit( mData->PortCount );
1194  mSliders.reinit( mData->PortCount );
1195  mFields.reinit( mData->PortCount, true);
1196  mLabels.reinit( mData->PortCount );
1197  mMeters.reinit( mData->PortCount );
1198 
1199  wxASSERT(mParent); // To justify safenew
1200  wxScrolledWindow *const w = safenew wxScrolledWindow(mParent,
1201  wxID_ANY,
1202  wxDefaultPosition,
1203  wxDefaultSize,
1204  wxVSCROLL | wxTAB_TRAVERSAL);
1205 
1206  {
1207  auto mainSizer = std::make_unique<wxBoxSizer>(wxVERTICAL);
1208  w->SetScrollRate(0, 20);
1209 
1210  // This fools NVDA into not saying "Panel" when the dialog gets focus
1211  w->SetName(wxT("\a"));
1212  w->SetLabel(wxT("\a"));
1213 
1214  mainSizer->Add(w, 1, wxEXPAND);
1215  mParent->SetSizer(mainSizer.release());
1216  }
1217 
1218  wxSizer *marginSizer;
1219  {
1220  auto uMarginSizer = std::make_unique<wxBoxSizer>(wxVERTICAL);
1221  marginSizer = uMarginSizer.get();
1222 
1223  if (mNumInputControls)
1224  {
1225  auto paramSizer = std::make_unique<wxStaticBoxSizer>(wxVERTICAL, w, _("Effect Settings"));
1226 
1227  auto gridSizer = std::make_unique<wxFlexGridSizer>(5, 0, 0);
1228  gridSizer->AddGrowableCol(3);
1229 
1230  wxControl *item;
1231 
1232  // Add the duration control for generators
1233  if (GetType() == EffectTypeGenerate)
1234  {
1235  item = safenew wxStaticText(w, 0, _("Duration:"));
1236  gridSizer->Add(item, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 5);
1237  mDuration = safenew
1240  mHost->GetDurationFormat(),
1241  mHost->GetDuration(),
1242  mSampleRate,
1244  .AutoPos(true));
1245  mDuration->SetName( XO("Duration") );
1246  gridSizer->Add(mDuration, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
1247  gridSizer->Add(1, 1, 0);
1248  gridSizer->Add(1, 1, 0);
1249  gridSizer->Add(1, 1, 0);
1250  }
1251 
1252  for (unsigned long p = 0; p < mData->PortCount; p++)
1253  {
1254  LADSPA_PortDescriptor d = mData->PortDescriptors[p];
1256  {
1257  continue;
1258  }
1259 
1260  wxString labelText = LAT1CTOWX(mData->PortNames[p]);
1261  item = safenew wxStaticText(w, 0, wxString::Format(_("%s:"), labelText));
1262  gridSizer->Add(item, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 5);
1263 
1264  wxString fieldText;
1265  LADSPA_PortRangeHint hint = mData->PortRangeHints[p];
1266 
1268  {
1269  mToggles[p] = safenew wxCheckBox(w, ID_Toggles + p, wxT(""));
1270  mToggles[p]->SetName(labelText);
1271  mToggles[p]->SetValue(mInputControls[p] > 0);
1272  gridSizer->Add(mToggles[p], 0, wxALL, 5);
1273 
1274  gridSizer->Add(1, 1, 0);
1275  gridSizer->Add(1, 1, 0);
1276  gridSizer->Add(1, 1, 0);
1277  continue;
1278  }
1279 
1280  wxString bound;
1281  float lower = -FLT_MAX;
1282  float upper = FLT_MAX;
1283  bool haslo = false;
1284  bool hashi = false;
1285  bool forceint = false;
1286 
1288  {
1289  lower = hint.LowerBound;
1290  haslo = true;
1291  }
1292 
1294  {
1295  upper = hint.UpperBound;
1296  hashi = true;
1297  }
1298 
1300  {
1301  lower *= mSampleRate;
1302  upper *= mSampleRate;
1303  forceint = true;
1304  }
1305 
1306  // Limit to the UI precision
1307  lower = ceilf(lower * 1000000.0) / 1000000.0;
1308  upper = floorf(upper * 1000000.0) / 1000000.0;
1309  mInputControls[p] = roundf(mInputControls[p] * 1000000.0) / 1000000.0;
1310 
1311  if (haslo && mInputControls[p] < lower)
1312  {
1313  mInputControls[p] = lower;
1314  }
1315 
1316  if (hashi && mInputControls[p] > upper)
1317  {
1318  mInputControls[p] = lower;
1319  }
1320 
1321  // Don't specify a value at creation time. This prevents unwanted events
1322  // being sent to the OnTextCtrl() handler before the associated slider
1323  // has been created.
1324  mFields[p] = safenew wxTextCtrl(w, ID_Texts + p);
1325  mFields[p]->SetName(labelText);
1326  gridSizer->Add(mFields[p], 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
1327 
1328  wxString str;
1329  if (haslo)
1330  {
1331  if (LADSPA_IS_HINT_INTEGER(hint.HintDescriptor) || forceint)
1332  {
1333  str.Printf(wxT("%d"), (int)(lower + 0.5));
1334  }
1335  else
1336  {
1337  str = Internat::ToDisplayString(lower);
1338  }
1339  item = safenew wxStaticText(w, 0, str);
1340  gridSizer->Add(item, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 5);
1341  }
1342  else
1343  {
1344  gridSizer->Add(1, 1, 0);
1345  }
1346 
1347  mSliders[p] = safenew wxSliderWrapper(w, ID_Sliders + p,
1348  0, 0, 1000,
1349  wxDefaultPosition,
1350  wxSize(200, -1));
1351 #if wxUSE_ACCESSIBILITY
1352  // so that name can be set on a standard control
1353  mSliders[p]->SetAccessible(safenew WindowAccessible(mSliders[p]));
1354 #endif
1355  mSliders[p]->SetName(labelText);
1356  gridSizer->Add(mSliders[p], 0, wxALIGN_CENTER_VERTICAL | wxEXPAND | wxALL, 5);
1357 
1358  if (hashi)
1359  {
1360  if (LADSPA_IS_HINT_INTEGER(hint.HintDescriptor) || forceint)
1361  {
1362  str.Printf(wxT("%d"), (int)(upper + 0.5));
1363  }
1364  else
1365  {
1366  str = Internat::ToDisplayString(upper);
1367  }
1368  item = safenew wxStaticText(w, 0, str);
1369  gridSizer->Add(item, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxALL, 5);
1370  }
1371  else
1372  {
1373  gridSizer->Add(1, 1, 0);
1374  }
1375 
1376  if (LADSPA_IS_HINT_INTEGER(hint.HintDescriptor) || forceint)
1377  {
1378  fieldText.Printf(wxT("%d"), (int)(mInputControls[p] + 0.5));
1379 
1380  IntegerValidator<float> vld(&mInputControls[p]);
1381  vld.SetRange(haslo ? lower : INT_MIN,
1382  hashi ? upper : INT_MAX);
1383  mFields[p]->SetValidator(vld);
1384  }
1385  else
1386  {
1387  fieldText = Internat::ToDisplayString(mInputControls[p]);
1388 
1389  // > 12 decimal places can cause rounding errors in display.
1390  FloatingPointValidator<float> vld(6, &mInputControls[p]);
1391  vld.SetRange(lower, upper);
1392 
1393  // Set number of decimal places
1394  if (upper - lower < 10.0)
1395  {
1396  vld.SetStyle(NumValidatorStyle::THREE_TRAILING_ZEROES);
1397  }
1398  else if (upper - lower < 100.0)
1399  {
1400  vld.SetStyle(NumValidatorStyle::TWO_TRAILING_ZEROES);
1401  }
1402  else
1403  {
1404  vld.SetStyle(NumValidatorStyle::ONE_TRAILING_ZERO);
1405  }
1406 
1407  mFields[p]->SetValidator(vld);
1408  }
1409 
1410  // Set the textctrl value. This will trigger an event so OnTextCtrl()
1411  // can update the slider.
1412  mFields[p]->SetValue(fieldText);
1413  }
1414 
1415  paramSizer->Add(gridSizer.release(), 0, wxEXPAND | wxALL, 5);
1416  marginSizer->Add(paramSizer.release(), 0, wxEXPAND | wxALL, 5);
1417  }
1418 
1419  if (mNumOutputControls > 0)
1420  {
1421  auto paramSizer = std::make_unique<wxStaticBoxSizer>(wxVERTICAL, w, _("Effect Output"));
1422 
1423  auto gridSizer = std::make_unique<wxFlexGridSizer>(2, 0, 0);
1424  gridSizer->AddGrowableCol(1);
1425 
1426  wxControl *item;
1427 
1428  for (unsigned long p = 0; p < mData->PortCount; p++)
1429  {
1430  LADSPA_PortDescriptor d = mData->PortDescriptors[p];
1432  {
1433  continue;
1434  }
1435 
1436  wxString labelText = LAT1CTOWX(mData->PortNames[p]);
1437  item = safenew wxStaticText(w, 0, wxString::Format(_("%s:"), labelText));
1438  gridSizer->Add(item, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 5);
1439 
1440  //LADSPA_PortRangeHint hint = mData->PortRangeHints[p];
1441 
1442  wxString bound;
1443  float lower = 0.0;
1444  float upper = 1.0;
1445 
1446  /*
1447  bool haslo = false;
1448  bool hashi = false;
1449  bool forceint = false;
1450 
1451  if (LADSPA_IS_HINT_BOUNDED_BELOW(hint.HintDescriptor))
1452  {
1453  lower = hint.LowerBound;
1454  haslo = true;
1455  }
1456 
1457  if (LADSPA_IS_HINT_BOUNDED_ABOVE(hint.HintDescriptor))
1458  {
1459  upper = hint.UpperBound;
1460  hashi = true;
1461  }
1462 
1463  if (LADSPA_IS_HINT_SAMPLE_RATE(hint.HintDescriptor))
1464  {
1465  lower *= mSampleRate;
1466  upper *= mSampleRate;
1467  forceint = true;
1468  }
1469  */
1470 
1471  // Limit to the UI precision
1472  lower = ceilf(lower * 1000000.0) / 1000000.0;
1473  upper = floorf(upper * 1000000.0) / 1000000.0;
1474  mInputControls[p] = roundf(mInputControls[p] * 1000000.0) / 1000000.0;
1475 
1476  mMeters[p] = safenew LadspaEffectMeter(w, mOutputControls[p], lower, upper);
1477  mMeters[p]->SetLabel(labelText); // for screen readers
1478  gridSizer->Add(mMeters[p], 1, wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1479  }
1480 
1481  paramSizer->Add(gridSizer.release(), 0, wxEXPAND | wxALL, 5);
1482  marginSizer->Add(paramSizer.release(), 0, wxEXPAND | wxALL, 5);
1483 
1484  RefreshControls(true);
1485  }
1486 
1487  w->SetSizer(uMarginSizer.release());
1488  }
1489 
1490  w->Layout();
1491 
1492  // Try to give the window a sensible default/minimum size
1493  wxSize sz1 = marginSizer->GetMinSize();
1494  wxSize sz2 = mParent->GetMinSize();
1495  w->SetMinSize( { std::min(sz1.x, sz2.x), std::min(sz1.y, sz2.y) } );
1496 
1497  // And let the parent reduce to the NEW minimum if possible
1498  mParent->SetMinSize({ -1, -1 });
1499 
1500  return true;
1501 }
1502 
1504 {
1505  return false;
1506 }
1507 
1509 {
1510  if (!mParent->Validate())
1511  {
1512  return false;
1513  }
1514 
1515  if (GetType() == EffectTypeGenerate)
1516  {
1517  mHost->SetDuration(mDuration->GetValue());
1518  }
1519 
1520  return true;
1521 }
1522 
1524 {
1525  return true;
1526 }
1527 
1529 {
1530  mParent->RemoveEventHandler(this);
1531 
1532  mToggles.reset();
1533  mSliders.reset();
1534  mFields.reset();
1535  mLabels.reset();
1536 
1537  mUIHost = NULL;
1538  mParent = NULL;
1539  mDialog = NULL;
1540 
1541  return true;
1542 }
1543 
1545 {
1546  return false;
1547 }
1548 
1550 {
1551 }
1552 
1554 {
1555 }
1556 
1558 {
1559  return true;
1560 }
1561 
1563 {
1564  LadspaEffectOptionsDialog dlg(mParent, mHost);
1565  if (dlg.ShowModal())
1566  {
1567  // Reinitialize configuration options
1568  mHost->GetSharedConfig(wxT("Options"), wxT("UseLatency"), mUseLatency, true);
1569  }
1570 }
1571 
1572 // ============================================================================
1573 // LadspaEffect Implementation
1574 // ============================================================================
1575 
1577 {
1578  if (mLib.IsLoaded())
1579  {
1580  return true;
1581  }
1582 
1583  wxFileName ff = mPath;
1584  wxString envpath;
1585  bool hadpath = wxGetEnv(wxT("PATH"), &envpath);
1586  wxSetEnv(wxT("PATH"), ff.GetPath() + wxFILE_SEP_PATH + envpath);
1587  wxString saveOldCWD = ff.GetCwd();
1588  ff.SetCwd();
1589 
1590  LADSPA_Descriptor_Function mainFn = NULL;
1591 
1592  if (mLib.Load(mPath, wxDL_NOW))
1593  {
1594  wxLogNull logNo;
1595 
1596  mainFn = (LADSPA_Descriptor_Function) mLib.GetSymbol(wxT("ladspa_descriptor"));
1597  if (mainFn)
1598  {
1599  mData = mainFn(mIndex);
1600  return true;
1601  }
1602  }
1603 
1604  if (mLib.IsLoaded())
1605  {
1606  mLib.Unload();
1607  }
1608 
1609  wxSetWorkingDirectory(saveOldCWD);
1610  hadpath ? wxSetEnv(wxT("PATH"), envpath) : wxUnsetEnv(wxT("PATH"));
1611 
1612  return false;
1613 }
1614 
1616 {
1617  if (mLib.IsLoaded())
1618  {
1619  mLib.Unload();
1620  }
1621 }
1622 
1624 {
1625  wxString parms;
1626  if (!mHost->GetPrivateConfig(group, wxT("Parameters"), parms, wxEmptyString))
1627  {
1628  return false;
1629  }
1630 
1631  CommandParameters eap;
1632  if (!eap.SetParameters(parms))
1633  {
1634  return false;
1635  }
1636 
1637  return SetAutomationParameters(eap);
1638 }
1639 
1641 {
1642  CommandParameters eap;
1643  if (!GetAutomationParameters(eap))
1644  {
1645  return false;
1646  }
1647 
1648  wxString parms;
1649  if (!eap.GetParameters(parms))
1650  {
1651  return false;
1652  }
1653 
1654  return mHost->SetPrivateConfig(group, wxT("Parameters"), parms);
1655 }
1656 
1658 {
1659  /* Instantiate the plugin */
1660  LADSPA_Handle handle = mData->instantiate(mData, sampleRate);
1661  if (!handle)
1662  {
1663  return NULL;
1664  }
1665 
1666  for (unsigned long p = 0; p < mData->PortCount; p++)
1667  {
1668  LADSPA_PortDescriptor d = mData->PortDescriptors[p];
1669  if (LADSPA_IS_PORT_CONTROL(d))
1670  {
1671  if (LADSPA_IS_PORT_INPUT(d))
1672  {
1673  mData->connect_port(handle, p, &mInputControls[p]);
1674  }
1675  else
1676  {
1677  mData->connect_port(handle, p, &mOutputControls[p]);
1678  }
1679  }
1680  }
1681 
1682  if (mData->activate)
1683  {
1684  mData->activate(handle);
1685  }
1686 
1687  return handle;
1688 }
1689 
1691 {
1692  if (mData->deactivate)
1693  {
1694  mData->deactivate(handle);
1695  }
1696 
1697  mData->cleanup(handle);
1698 }
1699 
1700 void LadspaEffect::OnCheckBox(wxCommandEvent & evt)
1701 {
1702  int p = evt.GetId() - ID_Toggles;
1703 
1704  mInputControls[p] = mToggles[p]->GetValue();
1705 }
1706 
1707 void LadspaEffect::OnSlider(wxCommandEvent & evt)
1708 {
1709  int p = evt.GetId() - ID_Sliders;
1710 
1711  float val;
1712  float lower = float(0.0);
1713  float upper = float(10.0);
1714  float range;
1715  bool forceint = false;
1716 
1717  LADSPA_PortRangeHint hint = mData->PortRangeHints[p];
1719  lower = hint.LowerBound;
1721  upper = hint.UpperBound;
1723  lower *= mSampleRate;
1724  upper *= mSampleRate;
1725  forceint = true;
1726  }
1727 
1728  range = upper - lower;
1729 
1730  val = (mSliders[p]->GetValue() / 1000.0) * range + lower;
1731 
1732  wxString str;
1733  if (LADSPA_IS_HINT_INTEGER(hint.HintDescriptor) || forceint)
1734  str.Printf(wxT("%d"), (int)(val + 0.5));
1735  else
1737 
1738  mFields[p]->SetValue(str);
1739 
1740  mInputControls[p] = val;
1741 }
1742 
1743 void LadspaEffect::OnTextCtrl(wxCommandEvent & evt)
1744 {
1745  LadspaEffect *that = this;
1746  int p = evt.GetId() - ID_Texts;
1747 
1748  float val;
1749  float lower = float(0.0);
1750  float upper = float(10.0);
1751  float range;
1752 
1753  val = Internat::CompatibleToDouble(that->mFields[p]->GetValue());
1754 
1755  LADSPA_PortRangeHint hint = that->mData->PortRangeHints[p];
1757  lower = hint.LowerBound;
1759  upper = hint.UpperBound;
1761  lower *= mSampleRate;
1762  upper *= mSampleRate;
1763  }
1764  range = upper - lower;
1765 
1766  if (val < lower)
1767  val = lower;
1768  if (val > upper)
1769  val = upper;
1770 
1771  mInputControls[p] = val;
1772 
1773  that->mSliders[p]->SetValue((int)(((val-lower)/range) * 1000.0 + 0.5));
1774 }
1775 
1776 void LadspaEffect::RefreshControls(bool outputOnly)
1777 {
1778  if (!mParent)
1779  {
1780  return;
1781  }
1782 
1783  for (unsigned long p = 0; p < mData->PortCount; p++)
1784  {
1785  LADSPA_PortDescriptor d = mData->PortDescriptors[p];
1786  if (!(LADSPA_IS_PORT_CONTROL(d)))
1787  {
1788  continue;
1789  }
1790 
1791  wxString fieldText;
1792  LADSPA_PortRangeHint hint = mData->PortRangeHints[p];
1793 
1794  bool forceint = false;
1796  {
1797  forceint = true;
1798  }
1799 
1800  if (LADSPA_IS_PORT_OUTPUT(d))
1801  {
1802  continue;
1803  }
1804 
1805  if (outputOnly)
1806  {
1807  continue;
1808  }
1809 
1811  {
1812  mToggles[p]->SetValue(mInputControls[p] > 0);
1813  continue;
1814  }
1815 
1816  if (LADSPA_IS_HINT_INTEGER(hint.HintDescriptor) || forceint)
1817  {
1818  fieldText.Printf(wxT("%d"), (int)(mInputControls[p] + 0.5));
1819  }
1820  else
1821  {
1822  fieldText = Internat::ToDisplayString(mInputControls[p]);
1823  }
1824 
1825  // Set the textctrl value. This will trigger an event so OnTextCtrl()
1826  // can update the slider.
1827  mFields[p]->SetValue(fieldText);
1828  }
1829 }
LadspaEffectsModule::Initialize
bool Initialize() override
Definition: LadspaEffect.cpp:148
LadspaEffect::GetBlockSize
size_t GetBlockSize() const override
Definition: LadspaEffect.cpp:915
EVT_BUTTON
EVT_BUTTON(wxID_NO, DependencyDialog::OnNo) EVT_BUTTON(wxID_YES
LadspaEffect::IsGraphicalUI
bool IsGraphicalUI() override
Definition: LadspaEffect.cpp:1503
LadspaEffect::FreeInstance
void FreeInstance(LADSPA_Handle handle)
Definition: LadspaEffect.cpp:1690
TranslatableString
Holds a msgid for the translation catalog; may also bind format arguments.
Definition: TranslatableString.h:32
LadspaEffect::SetHost
bool SetHost(EffectHostInterface *host) override
Definition: LadspaEffect.cpp:721
CommandParameters
CommandParameters, derived from wxFileConfig, is essentially doing the same things as the Shuttle cla...
Definition: EffectAutomationParameters.h:67
eIsCreating
@ eIsCreating
Definition: ShuttleGui.h:38
CommandParameters::SetParameters
bool SetParameters(const wxString &parms)
Definition: EffectAutomationParameters.h:286
valueRestorer
ValueRestorer< T > valueRestorer(T &var)
inline functions provide convenient parameter type deduction
Definition: MemoryX.h:354
LadspaEffectMeter::OnErase
void OnErase(wxEraseEvent &evt)
Definition: LadspaEffect.cpp:550
LadspaEffect::~LadspaEffect
virtual ~LadspaEffect()
Definition: LadspaEffect.cpp:630
ShuttleGuiBase::StartVerticalLay
void StartVerticalLay(int iProp=1)
Definition: ShuttleGui.cpp:1184
LadspaEffectOptionsDialog
Definition: LadspaEffect.cpp:397
LadspaEffect::RefreshControls
void RefreshControls(bool outputOnly=false)
Definition: LadspaEffect.cpp:1776
EffectTypeProcess
@ EffectTypeProcess
Definition: EffectInterface.h:59
wxSliderWrapper
wxSlider wxSliderWrapper
Definition: ShuttleGui.h:105
NumericTextCtrl::Options::AutoPos
Options & AutoPos(bool enable)
Definition: NumericTextCtrl.h:190
eIsGettingFromDialog
@ eIsGettingFromDialog
Definition: ShuttleGui.h:39
LadspaEffect::InitInstance
LADSPA_Handle InitInstance(float sampleRate)
Definition: LadspaEffect.cpp:1657
EffectHostInterface
EffectHostInterface is a decorator of a EffectUIClientInterface. It adds virtual (abstract) functions...
Definition: EffectInterface.h:121
LadspaEffect::SaveUserPreset
bool SaveUserPreset(const RegistryPath &name) override
Definition: LadspaEffect.cpp:1149
LadspaEffectMeter::mMin
float mMin
Definition: LadspaEffect.cpp:512
LadspaEffect::RealtimeResume
bool RealtimeResume() override
Definition: LadspaEffect.cpp:1025
LADSPA_IS_HINT_INTEGER
#define LADSPA_IS_HINT_INTEGER(x)
Definition: ladspa.h:315
LadspaEffect::LoadFactoryDefaults
bool LoadFactoryDefaults() override
Definition: LadspaEffect.cpp:1164
LADSPA_IS_HINT_DEFAULT_1
#define LADSPA_IS_HINT_DEFAULT_1(x)
Definition: ladspa.h:330
LadspaEffect::CloseUI
bool CloseUI() override
Definition: LadspaEffect.cpp:1528
str
#define str(a)
Definition: DBConnection.cpp:30
LadspaEffect::GetAudioOutCount
unsigned GetAudioOutCount() override
Definition: LadspaEffect.cpp:888
LADSPA_PortDescriptor
int LADSPA_PortDescriptor
Definition: ladspa.h:152
Effect
Base class for many of the effects in Audacity.
Definition: Effect.h:72
EffectTypeGenerate
@ EffectTypeGenerate
Definition: EffectInterface.h:58
LadspaEffect::LoadUserPreset
bool LoadUserPreset(const RegistryPath &name) override
Definition: LadspaEffect.cpp:1137
LadspaEffectsModule::IsPluginValid
bool IsPluginValid(const PluginPath &path, bool bFast) override
Definition: LadspaEffect.cpp:326
RegistryPaths
std::vector< RegistryPath > RegistryPaths
Definition: Identifier.h:219
LadspaEffect::SupportsRealtime
bool SupportsRealtime() override
Definition: LadspaEffect.cpp:707
ShuttleGuiBase::TieCheckBox
wxCheckBox * TieCheckBox(const TranslatableString &Prompt, bool &Var)
Definition: ShuttleGui.cpp:1629
PluginPath
wxString PluginPath
type alias for identifying a Plugin supplied by a module, each module defining its own interpretation...
Definition: Identifier.h:214
LadspaEffect::GetLatency
sampleCount GetLatency() override
Definition: LadspaEffect.cpp:920
LadspaEffect::GetFamily
EffectFamilySymbol GetFamily() override
Definition: LadspaEffect.cpp:687
LadspaEffect::GetAudioInCount
unsigned GetAudioInCount() override
Definition: LadspaEffect.cpp:883
LadspaEffect::ImportPresets
void ImportPresets() override
Definition: LadspaEffect.cpp:1553
LadspaEffect::LoadFactoryPreset
bool LoadFactoryPreset(int id) override
Definition: LadspaEffect.cpp:1159
LadspaEffect::SetAutomationParameters
bool SetAutomationParameters(CommandParameters &parms) override
Definition: LadspaEffect.cpp:1115
LadspaEffect::IsLegacy
bool IsLegacy() override
Definition: LadspaEffect.cpp:702
LadspaEffectOptionsDialog::mHost
EffectHostInterface * mHost
Definition: LadspaEffect.cpp:407
DECLARE_BUILTIN_MODULE
DECLARE_BUILTIN_MODULE(LadspaBuiltin)
XO
#define XO(s)
Definition: Internat.h:31
LadspaEffect::SetBlockSize
size_t SetBlockSize(size_t maxBlockSize) override
Definition: LadspaEffect.cpp:908
LadspaEffectsModule::FindPluginPaths
PluginPaths FindPluginPaths(PluginManagerInterface &pm) override
Definition: LadspaEffect.cpp:225
LadspaEffect::mData
const LADSPA_Descriptor * mData
Definition: LadspaEffect.h:155
FileNames::PlugInDir
FILES_API FilePath PlugInDir()
The user plug-in directory (not a system one)
LadspaEffectsModule::GetFileExtensions
const FileExtensions & GetFileExtensions() override
Definition: LadspaEffect.cpp:169
LadspaEffect::HideUI
bool HideUI() override
Definition: LadspaEffect.cpp:1523
LadspaEffect::PopulateUI
bool PopulateUI(ShuttleGui &S) override
Definition: LadspaEffect.cpp:1185
LADSPA_IS_HINT_TOGGLED
#define LADSPA_IS_HINT_TOGGLED(x)
Definition: ladspa.h:312
LadspaEffect::GetMidiInCount
int GetMidiInCount() override
Definition: LadspaEffect.cpp:893
CommandParameters::GetParameters
bool GetParameters(wxString &parms)
Definition: EffectAutomationParameters.h:258
LadspaEffectsModule::Terminate
void Terminate() override
Definition: LadspaEffect.cpp:154
LadspaEffect::ShowInterface
bool ShowInterface(wxWindow &parent, const EffectDialogFactory &factory, bool forceModal=false) override
Definition: LadspaEffect.cpp:1060
LadspaEffect::SetSampleRate
void SetSampleRate(double rate) override
Definition: LadspaEffect.cpp:903
LadspaEffectMeter::mVal
const float & mVal
Definition: LadspaEffect.cpp:511
_LADSPA_PortRangeHint::UpperBound
LADSPA_Data UpperBound
Definition: ladspa.h:350
LadspaEffectMeter::OnIdle
void OnIdle(wxIdleEvent &evt)
Definition: LadspaEffect.cpp:541
_LADSPA_PortRangeHint::HintDescriptor
LADSPA_PortRangeHintDescriptor HintDescriptor
Definition: ladspa.h:340
LADSPA_Descriptor_Function
const LADSPA_Descriptor *(* LADSPA_Descriptor_Function)(unsigned long Index)
Definition: ladspa.h:593
LadspaEffect::IsDefault
bool IsDefault() override
Definition: LadspaEffect.cpp:697
LADSPA_IS_HINT_DEFAULT_MIDDLE
#define LADSPA_IS_HINT_DEFAULT_MIDDLE(x)
Definition: ladspa.h:322
NumericTextCtrl
Definition: NumericTextCtrl.h:172
LadspaEffectsModule::GetSymbol
ComponentInterfaceSymbol GetSymbol() override
Definition: LadspaEffect.cpp:120
LadspaEffect::IsInteractive
bool IsInteractive() override
Definition: LadspaEffect.cpp:692
LadspaEffect::IsReady
bool IsReady() override
Definition: LadspaEffect.cpp:936
OnSize
static void OnSize(wxSizeEvent &evt)
Definition: VSTEffect.cpp:2784
wxArrayStringEx
Extend wxArrayString with move operations and construction and insertion fromstd::initializer_list.
Definition: wxArrayStringEx.h:18
LadspaEffect::Unload
void Unload()
Definition: LadspaEffect.cpp:1615
LadspaEffect::GetSymbol
ComponentInterfaceSymbol GetSymbol() override
Definition: LadspaEffect.cpp:643
wxEVT_COMMAND_TEXT_UPDATED
wxEVT_COMMAND_TEXT_UPDATED
Definition: Nyquist.cpp:129
LADSPA_IS_HINT_DEFAULT_LOW
#define LADSPA_IS_HINT_DEFAULT_LOW(x)
Definition: ladspa.h:320
ComponentInterfaceSymbol
ComponentInterfaceSymbol pairs a persistent string identifier used internally with an optional,...
Definition: ComponentInterfaceSymbol.h:27
LadspaEffectOptionsDialog::OnOk
void OnOk(wxCommandEvent &evt)
Definition: LadspaEffect.cpp:469
NumericTextCtrl::Options
Definition: NumericTextCtrl.h:178
LadspaEffect::RealtimeFinalize
bool RealtimeFinalize() override
Definition: LadspaEffect.cpp:1009
LadspaEffect::RealtimeAddProcessor
bool RealtimeAddProcessor(unsigned numChannels, float sampleRate) override
Definition: LadspaEffect.cpp:996
LadspaEffect::mFields
ArrayOf< wxTextCtrl * > mFields
Definition: LadspaEffect.h:192
LADSPA_IS_HINT_DEFAULT_100
#define LADSPA_IS_HINT_DEFAULT_100(x)
Definition: ladspa.h:332
LadspaEffect::GetAutomationParameters
bool GetAutomationParameters(CommandParameters &parms) override
Definition: LadspaEffect.cpp:1097
SampleCount.h
LadspaEffect::ProcessInitialize
bool ProcessInitialize(sampleCount totalLen, ChannelNames chanMap=NULL) override
Definition: LadspaEffect.cpp:941
LadspaEffect::RealtimeProcessEnd
bool RealtimeProcessEnd() override
Definition: LadspaEffect.cpp:1055
LADSPA_IS_HINT_SAMPLE_RATE
#define LADSPA_IS_HINT_SAMPLE_RATE(x)
Definition: ladspa.h:313
PluginManagerInterface::IsPluginRegistered
virtual bool IsPluginRegistered(const PluginPath &path, const TranslatableString *pName=nullptr)=0
Was the plugin registry already populated for a path (maybe from loading the config file)?
LadspaEffect::OnCheckBox
void OnCheckBox(wxCommandEvent &evt)
Definition: LadspaEffect.cpp:1700
XXO
#define XXO(s)
Definition: Internat.h:44
ShuttleGuiBase::EndHorizontalLay
void EndHorizontalLay()
Definition: ShuttleGui.cpp:1177
FilePath
wxString FilePath
Definition: Project.h:20
PluginManagerInterface
Definition: PluginInterface.h:55
LadspaEffect::GetVersion
wxString GetVersion() override
Definition: LadspaEffect.cpp:653
factory
static RegisteredToolbarFactory factory
Definition: ControlToolBar.cpp:817
LadspaEffectsModule::AutoRegisterPlugins
bool AutoRegisterPlugins(PluginManagerInterface &pm) override
Definition: LadspaEffect.cpp:198
LadspaEffect::ProcessFinalize
bool ProcessFinalize() override
Definition: LadspaEffect.cpp:959
LadspaEffect::SetHostUI
void SetHostUI(EffectUIHostInterface *host) override
Definition: LadspaEffect.cpp:1180
LadspaEffect::ValidateUI
bool ValidateUI() override
Definition: LadspaEffect.cpp:1508
LadspaEffectsModule::~LadspaEffectsModule
virtual ~LadspaEffectsModule()
Definition: LadspaEffect.cpp:107
ShuttleGuiBase::StartHorizontalLay
void StartHorizontalLay(int PositionFlags=wxALIGN_CENTRE, int iProp=1)
Definition: ShuttleGui.cpp:1167
LadspaEffectMeter::OnSize
void OnSize(wxSizeEvent &evt)
Definition: LadspaEffect.cpp:588
ShuttleGuiBase::EndVerticalLay
void EndVerticalLay()
Definition: ShuttleGui.cpp:1203
LadspaEffectsModule::GetSearchPaths
FilePaths GetSearchPaths()
Definition: LadspaEffect.cpp:347
ID_Toggles
@ ID_Toggles
Definition: LadspaEffect.cpp:487
LadspaEffectOptionsDialog::PopulateOrExchange
void PopulateOrExchange(ShuttleGui &S)
Definition: LadspaEffect.cpp:432
LADSPA_IS_PORT_OUTPUT
#define LADSPA_IS_PORT_OUTPUT(x)
Definition: ladspa.h:169
LADSPA_IS_HINT_DEFAULT_MAXIMUM
#define LADSPA_IS_HINT_DEFAULT_MAXIMUM(x)
Definition: ladspa.h:326
LadspaEffect::ExportPresets
void ExportPresets() override
Definition: LadspaEffect.cpp:1549
LadspaEffect::SaveParameters
bool SaveParameters(const RegistryPath &group)
Definition: LadspaEffect.cpp:1640
name
const TranslatableString name
Definition: Distortion.cpp:98
LadspaEffectsModule::GetVersion
wxString GetVersion() override
Definition: LadspaEffect.cpp:133
NumericConverter::TIME
@ TIME
Definition: NumericTextCtrl.h:52
LadspaEffectsModule::GetVendor
VendorSymbol GetVendor() override
Definition: LadspaEffect.cpp:128
EffectTypeTool
@ EffectTypeTool
Definition: EffectInterface.h:61
ShuttleGuiBase::GetParent
wxWindow * GetParent()
Definition: ShuttleGui.h:496
LADSPA_IS_HINT_LOGARITHMIC
#define LADSPA_IS_HINT_LOGARITHMIC(x)
Definition: ladspa.h:314
LadspaEffect::LoadParameters
bool LoadParameters(const RegistryPath &group)
Definition: LadspaEffect.cpp:1623
LADSPAEFFECTS_FAMILY
#define LADSPAEFFECTS_FAMILY
Definition: LadspaEffect.h:32
WindowAccessible
An alternative to using wxWindowAccessible, which in wxWidgets 3.1.1 contained GetParent() which was ...
PluginManagerInterface::FindFilesInPathList
virtual void FindFilesInPathList(const wxString &pattern, const FilePaths &pathList, FilePaths &files, bool directories=false)=0
_LADSPA_PortRangeHint::LowerBound
LADSPA_Data LowerBound
Definition: ladspa.h:345
EffectClientInterface::EffectDialogFactory
std::function< wxDialog *(wxWindow &parent, EffectHostInterface *, EffectUIClientInterface *) > EffectDialogFactory
Definition: EffectInterface.h:190
LadspaEffect::Load
bool Load()
Definition: LadspaEffect.cpp:1576
ChannelNames
enum ChannelName * ChannelNames
LadspaEffect::SupportsAutomation
bool SupportsAutomation() override
Definition: LadspaEffect.cpp:712
LadspaEffect::ProcessBlock
size_t ProcessBlock(float **inBlock, float **outBlock, size_t blockLen) override
Definition: LadspaEffect.cpp:972
LadspaEffectsModule::GetDescription
TranslatableString GetDescription() override
Definition: LadspaEffect.cpp:139
LadspaEffect::HasOptions
bool HasOptions() override
Definition: LadspaEffect.cpp:1557
EffectUIHostInterface
EffectUIHostInterface has nothing in it. It is provided so that an Effect can call SetHostUI passing ...
Definition: EffectInterface.h:257
LADSPA_IS_PORT_INPUT
#define LADSPA_IS_PORT_INPUT(x)
Definition: ladspa.h:168
LADSPA_IS_HINT_DEFAULT_0
#define LADSPA_IS_HINT_DEFAULT_0(x)
Definition: ladspa.h:328
LadspaEffect::GetType
EffectType GetType() override
Definition: LadspaEffect.cpp:667
LadspaEffectsModule
Definition: LadspaEffect.h:209
RegistryPath
wxString RegistryPath
Definition: Identifier.h:218
LadspaEffectMeter::mMax
float mMax
Definition: LadspaEffect.cpp:513
ShuttleGuiBase::StartStatic
wxStaticBox * StartStatic(const TranslatableString &Str, int iProp=0)
Definition: ShuttleGui.cpp:893
_LADSPA_PortRangeHint
_LADSPA_PortRangeHint is a structure that gives parameter validation information for a LADSPA (Linux ...
Definition: ladspa.h:337
LadspaEffect::GetFactoryPresets
RegistryPaths GetFactoryPresets() override
Definition: LadspaEffect.cpp:1154
LadspaEffect::mSliders
ArrayOf< wxSlider * > mSliders
Definition: LadspaEffect.h:191
LAT1CTOWX
#define LAT1CTOWX(X)
Definition: Internat.h:160
_LADSPA_Descriptor::PortRangeHints
const LADSPA_PortRangeHint * PortRangeHints
Definition: ladspa.h:419
min
int min(int a, int b)
Definition: CompareAudioCommand.cpp:106
PluginManagerInterface::DefaultRegistrationCallback
static const PluginID & DefaultRegistrationCallback(ModuleInterface *provider, ComponentInterface *ident)
Definition: PluginManager.cpp:329
wxDialogWrapper
Definition: wxPanelWrapper.h:81
LadspaEffect::RealtimeInitialize
bool RealtimeInitialize() override
Definition: LadspaEffect.cpp:991
PluginPaths
std::vector< PluginPath > PluginPaths
Definition: Identifier.h:215
LadspaEffect::OnSlider
void OnSlider(wxCommandEvent &evt)
Definition: LadspaEffect.cpp:1707
LADSPAEFFECTS_VERSION
#define LADSPAEFFECTS_VERSION
Definition: LadspaEffect.h:28
LadspaEffectMeter::~LadspaEffectMeter
virtual ~LadspaEffectMeter()
Definition: LadspaEffect.cpp:537
LadspaEffect::OnTextCtrl
void OnTextCtrl(wxCommandEvent &evt)
Definition: LadspaEffect.cpp:1743
LadspaEffect::RealtimeProcessStart
bool RealtimeProcessStart() override
Definition: LadspaEffect.cpp:1030
LADSPA_IS_HINT_BOUNDED_ABOVE
#define LADSPA_IS_HINT_BOUNDED_ABOVE(x)
Definition: ladspa.h:311
LadspaEffect
An Effect that calls up a LADSPA plug in, i.e. many possible effects from this one class.
Definition: LadspaEffect.h:45
_
#define _(s)
Definition: Internat.h:75
sampleCount
Positions or offsets within audio files need a wide type.
Definition: SampleCount.h:18
EffectTypeAnalyze
@ EffectTypeAnalyze
Definition: EffectInterface.h:60
RTLD_DEEPBIND
#define RTLD_DEEPBIND
Definition: LadspaEffect.cpp:35
LadspaEffect::RealtimeProcess
size_t RealtimeProcess(int group, float **inbuf, float **outbuf, size_t numSamples) override
Definition: LadspaEffect.cpp:1035
FileNames.h
LadspaEffect::GetDescription
TranslatableString GetDescription() override
Definition: LadspaEffect.cpp:658
LADSPA_IS_HINT_DEFAULT_HIGH
#define LADSPA_IS_HINT_DEFAULT_HIGH(x)
Definition: ladspa.h:324
LadspaEffectsModule::CreateInstance
std::unique_ptr< ComponentInterface > CreateInstance(const PluginPath &path) override
Definition: LadspaEffect.cpp:335
LADSPA_IS_HINT_DEFAULT_MINIMUM
#define LADSPA_IS_HINT_DEFAULT_MINIMUM(x)
Definition: ladspa.h:318
Verbatim
TranslatableString Verbatim(wxString str)
Require calls to the one-argument constructor to go through this distinct global function name.
Definition: TranslatableString.h:321
LadspaEffectOptionsDialog::~LadspaEffectOptionsDialog
virtual ~LadspaEffectOptionsDialog()
Definition: LadspaEffect.cpp:428
ShuttleGui::AddStandardButtons
void AddStandardButtons(long buttons=eOkButton|eCancelButton, wxWindow *extra=NULL)
Definition: ShuttleGui.cpp:2444
LadspaEffectMeter
Definition: LadspaEffect.cpp:499
LADSPA_Handle
void * LADSPA_Handle
Definition: ladspa.h:363
LadspaEffect::RealtimeSuspend
bool RealtimeSuspend() override
Definition: LadspaEffect.cpp:1020
ShuttleGuiBase::SetBorder
void SetBorder(int Border)
Definition: ShuttleGui.h:489
Internat::ToDisplayString
static wxString ToDisplayString(double numberToConvert, int digitsAfterDecimalPoint=-1)
Convert a number to a string, uses the user's locale's decimal separator.
Definition: Internat.cpp:162
ID_Texts
@ ID_Texts
Definition: LadspaEffect.cpp:489
ShuttleGuiBase::AddVariableText
wxStaticText * AddVariableText(const TranslatableString &Str, bool bCenter=false, int PositionFlags=0, int wrapWidth=0)
Definition: ShuttleGui.cpp:463
LadspaEffect::ShowOptions
void ShowOptions() override
Definition: LadspaEffect.cpp:1562
LadspaEffectsModule::LadspaEffectsModule
LadspaEffectsModule()
Definition: LadspaEffect.cpp:103
LadspaEffectsModule::GetPath
PluginPath GetPath() override
Definition: LadspaEffect.cpp:115
ID_Sliders
@ ID_Sliders
Definition: LadspaEffect.cpp:488
LadspaEffect::CanExportPresets
bool CanExportPresets() override
Definition: LadspaEffect.cpp:1544
ModuleInterface::RegistrationCallback
std::function< const PluginID &(ModuleInterface *, ComponentInterface *) > RegistrationCallback
Definition: ModuleInterface.h:123
ShuttleGuiBase::EndStatic
void EndStatic()
Definition: ShuttleGui.cpp:922
EffectType
EffectType
Definition: EffectInterface.h:55
safenew
#define safenew
Definition: MemoryX.h:10
LadspaEffectMeter::OnPaint
void OnPaint(wxPaintEvent &evt)
Definition: LadspaEffect.cpp:555
LadspaEffect::GetTailSize
size_t GetTailSize() override
Definition: LadspaEffect.cpp:931
LADSPA_IS_HINT_BOUNDED_BELOW
#define LADSPA_IS_HINT_BOUNDED_BELOW(x)
Definition: ladspa.h:310
LadspaEffect::GetMidiOutCount
int GetMidiOutCount() override
Definition: LadspaEffect.cpp:898
DECLARE_MODULE_ENTRY
DECLARE_MODULE_ENTRY(AudacityModule)
Definition: LadspaEffect.cpp:85
LADSPA_IS_PORT_AUDIO
#define LADSPA_IS_PORT_AUDIO(x)
Definition: ladspa.h:171
_LADSPA_Descriptor
_LADSPA_Descriptor is a structure that provides the API to a LADSPA (Linux Audio Plugin Architecture)...
Definition: ladspa.h:373
anonymous_namespace{Menus.cpp}::Options
std::vector< CommandFlagOptions > & Options()
Definition: Menus.cpp:527
LadspaEffectsModule::InstallPath
FilePath InstallPath() override
Definition: LadspaEffect.cpp:192
LadspaEffect::GetPath
PluginPath GetPath() override
Definition: LadspaEffect.cpp:638
END_EVENT_TABLE
END_EVENT_TABLE()
LADSPA_IS_PORT_CONTROL
#define LADSPA_IS_PORT_CONTROL(x)
Definition: ladspa.h:170
LadspaEffectsModule::DiscoverPluginsAtPath
unsigned DiscoverPluginsAtPath(const PluginPath &path, TranslatableString &errMsg, const RegistrationCallback &callback) override
Definition: LadspaEffect.cpp:250
EVT_COMMAND_RANGE
EVT_COMMAND_RANGE(ID_Slider, ID_Slider+NUMBER_OF_BANDS - 1, wxEVT_COMMAND_SLIDER_UPDATED, EffectEqualization::OnSlider) EffectEqualization
Definition: Equalization.cpp:218
LadspaEffect.h
LadspaEffectMeter::mLastValue
float mLastValue
Definition: LadspaEffect.cpp:514
ShuttleGui
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Definition: ShuttleGui.h:631
Internat::CompatibleToDouble
static bool CompatibleToDouble(const wxString &stringToConvert, double *result)
Convert a string to a number.
Definition: Internat.cpp:134
ID_Duration
@ ID_Duration
Definition: LadspaEffect.cpp:486
LadspaEffectOptionsDialog::mUseLatency
bool mUseLatency
Definition: LadspaEffect.cpp:408
LADSPA_IS_HINT_DEFAULT_440
#define LADSPA_IS_HINT_DEFAULT_440(x)
Definition: ladspa.h:334
LadspaEffectsModule::GetOptionalFamilySymbol
EffectFamilySymbol GetOptionalFamilySymbol() override
Definition: LadspaEffect.cpp:160
LadspaEffect::GetVendor
VendorSymbol GetVendor() override
Definition: LadspaEffect.cpp:648
kShippedEffects
static const wxChar * kShippedEffects[]
Definition: LadspaEffect.cpp:71