Audacity  2.2.2
Reverb.cpp
Go to the documentation of this file.
1 /**********************************************************************
2 
3  Audacity: A Digital Audio Editor
4  Audacity(R) is copyright (c) 1999-2013 Audacity Team.
5  License: GPL v2. See License.txt.
6 
7  Reverb.cpp
8  Rob Sykes, Vaughan Johnson
9 
10 ******************************************************************//*******************************************************************/
16 
17 #include "../Audacity.h"
18 #include "Reverb.h"
19 
20 #include <wx/arrstr.h>
21 #include <wx/intl.h>
22 
23 #include "../Audacity.h"
24 #include "../Prefs.h"
25 #include "../ShuttleGui.h"
26 #include "../widgets/valnum.h"
27 
28 #include "Reverb_libSoX.h"
29 
30 enum
31 {
32  ID_RoomSize = 10000,
42 };
43 
44 // Define keys, defaults, minimums, and maximums for the effect parameters
45 //
46 // Name Type Key Def Min Max Scale
47 Param( RoomSize, double, wxT("RoomSize"), 75, 0, 100, 1 );
48 Param( PreDelay, double, wxT("Delay"), 10, 0, 200, 1 );
49 Param( Reverberance, double, wxT("Reverberance"), 50, 0, 100, 1 );
50 Param( HfDamping, double, wxT("HfDamping"), 50, 0, 100, 1 );
51 Param( ToneLow, double, wxT("ToneLow"), 100, 0, 100, 1 );
52 Param( ToneHigh, double, wxT("ToneHigh"), 100, 0, 100, 1 );
53 Param( WetGain, double, wxT("WetGain"), -1, -20, 10, 1 );
54 Param( DryGain, double, wxT("DryGain"), -1, -20, 10, 1 );
55 Param( StereoWidth, double, wxT("StereoWidth"), 100, 0, 100, 1 );
56 Param( WetOnly, bool, wxT("WetOnly"), false, false, true, 1 );
57 
58 static const struct
59 {
60  const wxChar *name;
62 }
64 {
65  // Room Pre Hf Tone Tone Wet Dry Stereo Wet
66  // Name Size, Delay, Reverb, Damping, Low, High, Gain, Gain, Width, Only
67  { XO("Vocal I" ), { 70, 20, 40, 99, 100, 50, -12, 0, 70, false } },
68  { XO("Vocal II"), { 50, 0, 50, 99, 50, 100, -1, -1, 70, false } },
69  { XO("Bathroom"), { 16, 8, 80, 0, 0, 100, -6, 0, 100, false } },
70  { XO("Small Room Bright"), { 30, 10, 50, 50, 50, 100, -1, -1, 100, false } },
71  { XO("Small Room Dark"), { 30, 10, 50, 50, 100, 0, -1, -1, 100, false } },
72  { XO("Medium Room"), { 75, 10, 40, 50, 100, 70, -1, -1, 70, false } },
73  { XO("Large Room"), { 85, 10, 40, 50, 100, 80, 0, -6, 90, false } },
74  { XO("Church Hall"), { 90, 32, 60, 50, 100, 50, 0, -12, 100, false } },
75  { XO("Cathedral"), { 90, 16, 90, 50, 100, 0, 0, -20, 100, false } },
76 };
77 
79 {
81  float *dry;
82  float *wet[2];
83 };
84 
85 //
86 // EffectReverb
87 //
88 
89 BEGIN_EVENT_TABLE(EffectReverb, wxEvtHandler)
90 
91 #define SpinSliderEvent(n) \
92  EVT_SLIDER(ID_ ## n, EffectReverb::On ## n ## Slider) \
93  EVT_TEXT(ID_ ## n, EffectReverb::On ## n ## Text)
94 
95  SpinSliderEvent(RoomSize)
96  SpinSliderEvent(PreDelay)
97  SpinSliderEvent(Reverberance)
98  SpinSliderEvent(HfDamping)
99  SpinSliderEvent(ToneLow)
100  SpinSliderEvent(ToneHigh)
101  SpinSliderEvent(WetGain)
102  SpinSliderEvent(DryGain)
103  SpinSliderEvent(StereoWidth)
104 
105 #undef SpinSliderEvent
106 
108 
110 {
111  mParams.mRoomSize = DEF_RoomSize;
112  mParams.mPreDelay = DEF_PreDelay;
113  mParams.mReverberance = DEF_Reverberance;
114  mParams.mHfDamping = DEF_HfDamping;
115  mParams.mToneLow = DEF_ToneLow;
116  mParams.mToneHigh = DEF_ToneHigh;
117  mParams.mWetGain = DEF_WetGain;
118  mParams.mDryGain = DEF_DryGain;
119  mParams.mStereoWidth = DEF_StereoWidth;
120  mParams.mWetOnly = DEF_WetOnly;
121 
122  mProcessingEvent = false;
123 
124  SetLinearEffectFlag(true);
125 }
126 
128 {
129 }
130 
131 // IdentInterface implementation
132 
134 {
135  return REVERB_PLUGIN_SYMBOL;
136 }
137 
139 {
140  return _("Adds ambience or a \"hall effect\"");
141 }
142 
144 {
145  return wxT("Reverb");
146 }
147 
148 // EffectDefinitionInterface implementation
149 
151 {
152  return EffectTypeProcess;
153 }
154 
155 // EffectClientInterface implementation
156 
158 {
159  return mParams.mStereoWidth ? 2 : 1;
160 }
161 
163 {
164  return mParams.mStereoWidth ? 2 : 1;
165 }
166 
167 static size_t BLOCK = 16384;
168 
170 {
171  bool isStereo = false;
172  mNumChans = 1;
173  if (chanMap && chanMap[0] != ChannelNameEOL && chanMap[1] == ChannelNameFrontRight)
174  {
175  isStereo = true;
176  mNumChans = 2;
177  }
178 
179  mP = (Reverb_priv_t *) calloc(sizeof(*mP), mNumChans);
180 
181  for (unsigned int i = 0; i < mNumChans; i++)
182  {
183  reverb_create(&mP[i].reverb,
184  mSampleRate,
190  mParams.mStereoWidth * (isStereo ? 1 : 0),
193  BLOCK,
194  mP[i].wet);
195  }
196 
197  return true;
198 }
199 
201 {
202  for (unsigned int i = 0; i < mNumChans; i++)
203  {
204  reverb_delete(&mP[i].reverb);
205  }
206 
207  free(mP);
208 
209  return true;
210 }
211 
212 size_t EffectReverb::ProcessBlock(float **inBlock, float **outBlock, size_t blockLen)
213 {
214  float *ichans[2] = {NULL, NULL};
215  float *ochans[2] = {NULL, NULL};
216 
217  for (unsigned int c = 0; c < mNumChans; c++)
218  {
219  ichans[c] = inBlock[c];
220  ochans[c] = outBlock[c];
221  }
222 
223  float const dryMult = mParams.mWetOnly ? 0 : dB_to_linear(mParams.mDryGain);
224 
225  auto remaining = blockLen;
226 
227  while (remaining)
228  {
229  auto len = std::min(remaining, decltype(remaining)(BLOCK));
230  for (unsigned int c = 0; c < mNumChans; c++)
231  {
232  // Write the input samples to the reverb fifo. Returned value is the address of the
233  // fifo buffer which contains a copy of the input samples.
234  mP[c].dry = (float *) fifo_write(&mP[c].reverb.input_fifo, len, ichans[c]);
235  reverb_process(&mP[c].reverb, len);
236  }
237 
238  if (mNumChans == 2)
239  {
240  for (decltype(len) i = 0; i < len; i++)
241  {
242  for (int w = 0; w < 2; w++)
243  {
244  ochans[w][i] = dryMult *
245  mP[w].dry[i] +
246  0.5 *
247  (mP[0].wet[w][i] + mP[1].wet[w][i]);
248  }
249  }
250  }
251  else
252  {
253  for (decltype(len) i = 0; i < len; i++)
254  {
255  ochans[0][i] = dryMult *
256  mP[0].dry[i] +
257  mP[0].wet[0][i];
258  }
259  }
260 
261  remaining -= len;
262 
263  for (unsigned int c = 0; c < mNumChans; c++)
264  {
265  ichans[c] += len;
266  ochans[c] += len;
267  }
268  }
269 
270  return blockLen;
271 }
273  S.SHUTTLE_PARAM( mParams.mRoomSize, RoomSize );
274  S.SHUTTLE_PARAM( mParams.mPreDelay, PreDelay );
275  S.SHUTTLE_PARAM( mParams.mReverberance, Reverberance );
276  S.SHUTTLE_PARAM( mParams.mHfDamping, HfDamping );
277  S.SHUTTLE_PARAM( mParams.mToneLow, ToneLow );
278  S.SHUTTLE_PARAM( mParams.mToneHigh, ToneHigh );
279  S.SHUTTLE_PARAM( mParams.mWetGain, WetGain );
280  S.SHUTTLE_PARAM( mParams.mDryGain, DryGain );
281  S.SHUTTLE_PARAM( mParams.mStereoWidth, StereoWidth );
282  S.SHUTTLE_PARAM( mParams.mWetOnly, WetOnly );
283  return true;
284 }
285 
287 {
288  parms.Write(KEY_RoomSize, mParams.mRoomSize);
289  parms.Write(KEY_PreDelay, mParams.mPreDelay);
290  parms.Write(KEY_Reverberance, mParams.mReverberance);
291  parms.Write(KEY_HfDamping, mParams.mHfDamping);
292  parms.Write(KEY_ToneLow, mParams.mToneLow);
293  parms.Write(KEY_ToneHigh, mParams.mToneHigh);
294  parms.Write(KEY_WetGain, mParams.mWetGain);
295  parms.Write(KEY_DryGain, mParams.mDryGain);
296  parms.Write(KEY_StereoWidth, mParams.mStereoWidth);
297  parms.Write(KEY_WetOnly, mParams.mWetOnly);
298 
299  return true;
300 }
301 
303 {
304  ReadAndVerifyDouble(RoomSize);
305  ReadAndVerifyDouble(PreDelay);
306  ReadAndVerifyDouble(Reverberance);
307  ReadAndVerifyDouble(HfDamping);
308  ReadAndVerifyDouble(ToneLow);
309  ReadAndVerifyDouble(ToneHigh);
310  ReadAndVerifyDouble(WetGain);
311  ReadAndVerifyDouble(DryGain);
312  ReadAndVerifyDouble(StereoWidth);
313  ReadAndVerifyBool(WetOnly);
314 
315  mParams.mRoomSize = RoomSize;
316  mParams.mPreDelay = PreDelay;
317  mParams.mReverberance = Reverberance;
318  mParams.mHfDamping = HfDamping;
319  mParams.mToneLow = ToneLow;
320  mParams.mToneHigh = ToneHigh;
321  mParams.mWetGain = WetGain;
322  mParams.mDryGain = DryGain;
323  mParams.mStereoWidth = StereoWidth;
324  mParams.mWetOnly = WetOnly;
325 
326  return true;
327 }
328 
330 {
331  wxArrayString names;
332 
333  for (size_t i = 0; i < WXSIZEOF(FactoryPresets); i++)
334  {
335  names.Add(wxGetTranslation(FactoryPresets[i].name));
336  }
337 
338  return names;
339 }
340 
342 {
343  if (id < 0 || id >= (int) WXSIZEOF(FactoryPresets))
344  {
345  return false;
346  }
347 
348  mParams = FactoryPresets[id].params;
349 
350  if (mUIDialog)
351  {
353  }
354 
355  return true;
356 }
357 
358 // Effect implementation
359 
361 {
362  wxString base = wxT("/Effects/Reverb/");
363 
364  // Migrate settings from 2.1.0 or before
365 
366  // Already migrated, so bail
367  if (gPrefs->Exists(base + wxT("Migrated")))
368  {
369  return true;
370  }
371 
372  // Load the old "current" settings
373  if (gPrefs->Exists(base))
374  {
375  gPrefs->Read(base + wxT("RoomSize"), &mParams.mRoomSize, DEF_RoomSize);
376  gPrefs->Read(base + wxT("Delay"), &mParams.mPreDelay, DEF_PreDelay);
377  gPrefs->Read(base + wxT("Reverberance"), &mParams.mReverberance, DEF_Reverberance);
378  gPrefs->Read(base + wxT("HfDamping"), &mParams.mHfDamping, DEF_HfDamping);
379  gPrefs->Read(base + wxT("ToneLow"), &mParams.mToneLow, DEF_ToneLow);
380  gPrefs->Read(base + wxT("ToneHigh"), &mParams.mToneHigh, DEF_ToneHigh);
381  gPrefs->Read(base + wxT("WetGain"), &mParams.mWetGain, DEF_WetGain);
382  gPrefs->Read(base + wxT("DryGain"), &mParams.mDryGain, DEF_DryGain);
383  gPrefs->Read(base + wxT("StereoWidth"), &mParams.mStereoWidth, DEF_StereoWidth);
384  gPrefs->Read(base + wxT("WetOnly"), &mParams.mWetOnly, DEF_WetOnly);
385 
387 
388  // Do not migrate again
389  gPrefs->Write(base + wxT("Migrated"), true);
390  }
391 
392  // Load the previous user presets
393  for (int i = 0; i < 10; i++)
394  {
395  wxString path = base + wxString::Format(wxT("%d/"), i);
396  if (gPrefs->Exists(path))
397  {
398  Params save = mParams;
399  wxString name;
400 
401  gPrefs->Read(path + wxT("RoomSize"), &mParams.mRoomSize, DEF_RoomSize);
402  gPrefs->Read(path + wxT("Delay"), &mParams.mPreDelay, DEF_PreDelay);
403  gPrefs->Read(path + wxT("Reverberance"), &mParams.mReverberance, DEF_Reverberance);
404  gPrefs->Read(path + wxT("HfDamping"), &mParams.mHfDamping, DEF_HfDamping);
405  gPrefs->Read(path + wxT("ToneLow"), &mParams.mToneLow, DEF_ToneLow);
406  gPrefs->Read(path + wxT("ToneHigh"), &mParams.mToneHigh, DEF_ToneHigh);
407  gPrefs->Read(path + wxT("WetGain"), &mParams.mWetGain, DEF_WetGain);
408  gPrefs->Read(path + wxT("DryGain"), &mParams.mDryGain, DEF_DryGain);
409  gPrefs->Read(path + wxT("StereoWidth"), &mParams.mStereoWidth, DEF_StereoWidth);
410  gPrefs->Read(path + wxT("WetOnly"), &mParams.mWetOnly, DEF_WetOnly);
411  gPrefs->Read(path + wxT("name"), &name, wxEmptyString);
412 
413  if (!name.IsEmpty())
414  {
415  name.Prepend(wxT(" - "));
416  }
417  name.Prepend(wxString::Format(wxT("Settings%d"), i));
418 
420 
421  mParams = save;
422  }
423  }
424 
425  return true;
426 }
427 
429 {
430  S.AddSpace(0, 5);
431 
432  S.StartMultiColumn(3, wxEXPAND);
433  {
434  S.SetStretchyCol(2);
435 
436 #define SpinSlider(n, p) \
437  m ## n ## T = S.Id(ID_ ## n). \
438  AddSpinCtrl( p, DEF_ ## n, MAX_ ## n, MIN_ ## n); \
439  S.SetStyle(wxSL_HORIZONTAL); \
440  m ## n ## S = S.Id(ID_ ## n). \
441  AddSlider( {}, DEF_ ## n, MAX_ ## n, MIN_ ## n);
442 
443  SpinSlider(RoomSize, _("&Room Size (%):"))
444  SpinSlider(PreDelay, _("&Pre-delay (ms):"))
445  SpinSlider(Reverberance, _("Rever&berance (%):"))
446  SpinSlider(HfDamping, _("Da&mping (%):"))
447  SpinSlider(ToneLow, _("Tone &Low (%):"))
448  SpinSlider(ToneHigh, _("Tone &High (%):"))
449  SpinSlider(WetGain, _("Wet &Gain (dB):"))
450  SpinSlider(DryGain, _("Dr&y Gain (dB):"))
451  SpinSlider(StereoWidth, _("Stereo Wid&th (%):"))
452 
453 #undef SpinSlider
454 
455  }
456  S.EndMultiColumn();
457 
458  S.StartHorizontalLay(wxCENTER, false);
459  {
460  mWetOnlyC = S.Id(ID_WetOnly).
461  AddCheckBox(_("Wet O&nly"), DEF_WetOnly ? wxT("true") : wxT("false"));
462  }
463  S.EndHorizontalLay();
464 
465  return;
466 }
467 
469 {
470 #define SetSpinSlider(n) \
471  m ## n ## S->SetValue((int) mParams.m ## n); \
472  m ## n ## T->SetValue(wxString::Format(wxT("%d"), (int) mParams.m ## n));
473 
474  SetSpinSlider(RoomSize);
475  SetSpinSlider(PreDelay);
476  SetSpinSlider(Reverberance);
477  SetSpinSlider(HfDamping);
478  SetSpinSlider(ToneLow);
479  SetSpinSlider(ToneHigh);
480  SetSpinSlider(WetGain);
481  SetSpinSlider(DryGain);
482  SetSpinSlider(StereoWidth);
483 
484 #undef SetSpinSlider
485 
486  mWetOnlyC->SetValue((int) mParams.mWetOnly);
487 
488  return true;
489 }
490 
492 {
493  if (!mUIParent->Validate())
494  {
495  return false;
496  }
497 
498  mParams.mRoomSize = mRoomSizeS->GetValue();
499  mParams.mPreDelay = mPreDelayS->GetValue();
500  mParams.mReverberance = mReverberanceS->GetValue();
501  mParams.mHfDamping = mHfDampingS->GetValue();
502  mParams.mToneLow = mToneLowS->GetValue();
503  mParams.mToneHigh = mToneHighS->GetValue();
504  mParams.mWetGain = mWetGainS->GetValue();
505  mParams.mDryGain = mDryGainS->GetValue();
506  mParams.mStereoWidth = mStereoWidthS->GetValue();
507  mParams.mWetOnly = mWetOnlyC->GetValue();
508 
509  return true;
510 }
511 
512 #define SpinSliderHandlers(n) \
513  void EffectReverb::On ## n ## Slider(wxCommandEvent & evt) \
514  { \
515  if (mProcessingEvent) return; \
516  mProcessingEvent = true; \
517  m ## n ## T->SetValue(wxString::Format(wxT("%d"), evt.GetInt())); \
518  mProcessingEvent = false; \
519  } \
520  void EffectReverb::On ## n ## Text(wxCommandEvent & evt) \
521  { \
522  if (mProcessingEvent) return; \
523  mProcessingEvent = true; \
524  m ## n ## S->SetValue(TrapLong(evt.GetInt(), MIN_ ## n, MAX_ ## n)); \
525  mProcessingEvent = false; \
526  }
527 
529 SpinSliderHandlers(PreDelay)
530 SpinSliderHandlers(Reverberance)
531 SpinSliderHandlers(HfDamping)
532 SpinSliderHandlers(ToneLow)
533 SpinSliderHandlers(ToneHigh)
534 SpinSliderHandlers(WetGain)
535 SpinSliderHandlers(DryGain)
536 SpinSliderHandlers(StereoWidth)
537 
538 #undef SpinSliderHandlers
539 
540 void EffectReverb::SetTitle(const wxString & name)
541 {
542  wxString title(_("Reverb"));
543 
544  if (!name.IsEmpty())
545  {
546  title += wxT(": ") + name;
547  }
548 
549  mUIDialog->SetTitle(title);
550 }
wxString GetUserPresetsGroup(const wxString &name) override
Definition: Effect.cpp:790
float * dry
Definition: Reverb.cpp:81
static wxArrayString names()
Definition: Tags.cpp:697
AudacityPrefs * gPrefs
Definition: Prefs.cpp:73
bool SaveUserPreset(const wxString &name) override
Definition: Effect.cpp:600
wxArrayString GetFactoryPresets() override
Definition: Reverb.cpp:329
reverb_t reverb
Definition: Reverb.cpp:80
IdentInterfaceSymbol GetSymbol() override
Definition: Reverb.cpp:133
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI...
Definition: ShuttleGui.h:409
wxString GetCurrentSettingsGroup() override
Definition: Effect.cpp:801
bool Startup() override
Definition: Reverb.cpp:360
A reverberation effect.
Definition: Reverb.h:29
bool TransferDataToWindow() override
Definition: Reverb.cpp:468
void PopulateOrExchange(ShuttleGui &S) override
Definition: Reverb.cpp:428
void EndMultiColumn()
wxString ManualPage() override
Definition: Reverb.cpp:143
wxString GetDescription() override
Definition: Reverb.cpp:138
bool GetAutomationParameters(CommandParameters &parms) override
Definition: Reverb.cpp:286
#define XO(s)
Definition: Internat.h:33
Shuttle that deals with parameters. This is a base class with lots of virtual functions that do nothi...
Definition: Shuttle.h:60
void SetTitle(const wxString &name=wxT(""))
static void reverb_process(reverb_t *p, size_t length)
SpinSlider(RoomSize) SpinSlider(PreDelay) SpinSlider(Reverberance) SpinSlider(HfDamping) SpinSlider(ToneLow) SpinSlider(ToneHigh) SpinSlider(WetGain) SpinSlider(DryGain) SpinSlider(StereoWidth) wxCheckBox *mWetOnlyC
unsigned GetAudioOutCount() override
Definition: Reverb.cpp:162
double mSampleRate
Definition: Effect.h:455
static const struct @35 FactoryPresets[]
#define dB_to_linear(x)
Definition: Reverb_libSoX.h:27
void EndHorizontalLay()
static void reverb_delete(reverb_t *p)
unsigned GetAudioInCount() override
Definition: Reverb.cpp:157
size_t ProcessBlock(float **inBlock, float **outBlock, size_t blockLen) override
Definition: Reverb.cpp:212
#define REVERB_PLUGIN_SYMBOL
Definition: Reverb.h:25
bool LoadFactoryPreset(int id) override
Definition: Reverb.cpp:341
void StartHorizontalLay(int PositionFlags=wxALIGN_CENTRE, int iProp=1)
void StartMultiColumn(int nCols, int PositionFlags=wxALIGN_LEFT)
CommandParameters, derived from wxFileConfig, is essentially doing the same things as the Shuttle cla...
ShuttleGui & Id(int id)
#define ReadAndVerifyDouble(name)
Definition: Effect.h:798
int min(int a, int b)
double mStereoWidth
Definition: Reverb.h:45
double mReverberance
Definition: Reverb.h:39
IdentInterfaceSymbol pairs a persistent string identifier used internally with an optional...
#define SetSpinSlider(n)
enum ChannelName * ChannelNames
#define SpinSliderEvent(n)
Definition: Reverb.cpp:91
#define SpinSliderHandlers(n)
Definition: Reverb.cpp:512
EffectType GetType() override
Definition: Reverb.cpp:150
wxWindow * mUIParent
Definition: Effect.h:472
Params mParams
Definition: Reverb.h:104
double mPreDelay
Definition: Reverb.h:38
bool ProcessInitialize(sampleCount totalLen, ChannelNames chanMap=NULL) override
Definition: Reverb.cpp:169
double mHfDamping
Definition: Reverb.h:40
SpinSliderHandlers(RoomSize) SpinSliderHandlers(PreDelay) SpinSliderHandlers(Reverberance) SpinSliderHandlers(HfDamping) SpinSliderHandlers(ToneLow) SpinSliderHandlers(ToneHigh) SpinSliderHandlers(WetGain) SpinSliderHandlers(DryGain) SpinSliderHandlers(StereoWidth) private Reverb_priv_t * mP
Definition: Reverb.h:88
_("Move Track &Down")+wxT("\t")+(GetActiveProject() -> GetCommandManager() ->GetKeyFromName(wxT("TrackMoveDown")).Raw()), OnMoveTrack) POPUP_MENU_ITEM(OnMoveTopID, _("Move Track to &Top")+wxT("\t")+(GetActiveProject() ->GetCommandManager() ->GetKeyFromName(wxT("TrackMoveTop")).Raw()), OnMoveTrack) POPUP_MENU_ITEM(OnMoveBottomID, _("Move Track to &Bottom")+wxT("\t")+(GetActiveProject() ->GetCommandManager() ->GetKeyFromName(wxT("TrackMoveBottom")).Raw()), OnMoveTrack)#define SET_TRACK_NAME_PLUGIN_SYMBOLclass SetTrackNameCommand:public AudacityCommand
Param(RoomSize, double, wxT("RoomSize"), 75, 0, 100, 1)
EffectType
wxDialog * mUIDialog
Definition: Effect.h:471
double mToneHigh
Definition: Reverb.h:42
float * wet[2]
Definition: Reverb.cpp:82
bool ProcessFinalize() override
Definition: Reverb.cpp:200
bool SetAutomationParameters(CommandParameters &parms) override
Definition: Reverb.cpp:302
#define ReadAndVerifyBool(name)
Definition: Effect.h:800
EffectReverb::Params params
Definition: Reverb.cpp:61
virtual ~EffectReverb()
Definition: Reverb.cpp:127
static void reverb_create(reverb_t *p, double sample_rate_Hz, double wet_gain_dB, double room_scale, double reverberance, double hf_damping, double pre_delay_ms, double stereo_depth, double tone_low, double tone_high, size_t buffer_size, float **out)
END_EVENT_TABLE()
wxSizerItem * AddSpace(int width, int height)
bool TransferDataFromWindow() override
Definition: Reverb.cpp:491
const wxChar * name
Definition: Reverb.cpp:60
static void * fifo_write(fifo_t *f, FIFO_SIZE_T n, void const *data)
Definition: Reverb_libSoX.h:74
double mRoomSize
Definition: Reverb.h:37
bool DefineParams(ShuttleParams &S) override
Definition: Reverb.cpp:272
void SetStretchyCol(int i)
Used to modify an already placed FlexGridSizer to make a column stretchy.
Definition: ShuttleGui.cpp:203
static size_t BLOCK
Definition: Reverb.cpp:167