Audacity  2.2.2
Public Member Functions | Private Member Functions | Private Attributes | List of all members
EffectDtmf Class Referencefinal

An effect that generates DTMF tones. More...

#include <DtmfGen.h>

Inheritance diagram for EffectDtmf:
Effect EffectClientInterface EffectUIClientInterface EffectHostInterface EffectDefinitionInterface ConfigClientInterface IdentInterface ParamsInterface

Public Member Functions

 EffectDtmf ()
 
virtual ~EffectDtmf ()
 
IdentInterfaceSymbol GetSymbol () override
 
wxString GetDescription () override
 
wxString ManualPage () override
 
EffectType GetType () override
 
unsigned GetAudioOutCount () override
 
bool ProcessInitialize (sampleCount totalLen, ChannelNames chanMap=NULL) override
 
size_t ProcessBlock (float **inBlock, float **outBlock, size_t blockLen) override
 
bool DefineParams (ShuttleParams &S) override
 
bool GetAutomationParameters (CommandParameters &parms) override
 
bool SetAutomationParameters (CommandParameters &parms) override
 
bool Startup () override
 
bool Init () override
 
void PopulateOrExchange (ShuttleGui &S) override
 
bool TransferDataFromWindow () override
 
bool TransferDataToWindow () override
 
- Public Member Functions inherited from Effect
 Effect ()
 
virtual ~Effect ()
 
wxString GetPath () override
 
IdentInterfaceSymbol GetSymbol () override
 
IdentInterfaceSymbol GetVendor () override
 
wxString GetVersion () override
 
wxString GetDescription () override
 
EffectType GetType () override
 
IdentInterfaceSymbol GetFamilyId () override
 
bool IsInteractive () override
 
bool IsDefault () override
 
bool IsLegacy () override
 
bool SupportsRealtime () override
 
bool SupportsAutomation () override
 
bool SetHost (EffectHostInterface *host) override
 
unsigned GetAudioInCount () override
 
unsigned GetAudioOutCount () override
 
int GetMidiInCount () override
 
int GetMidiOutCount () override
 
sampleCount GetLatency () override
 
size_t GetTailSize () override
 
void SetSampleRate (double rate) override
 
size_t SetBlockSize (size_t maxBlockSize) override
 
bool IsReady () override
 
bool ProcessInitialize (sampleCount totalLen, ChannelNames chanMap=NULL) override
 
bool ProcessFinalize () override
 
size_t ProcessBlock (float **inBlock, float **outBlock, size_t blockLen) override
 
bool RealtimeInitialize () override
 
bool RealtimeAddProcessor (unsigned numChannels, float sampleRate) override
 
bool RealtimeFinalize () override
 
bool RealtimeSuspend () override
 
bool RealtimeResume () override
 
bool RealtimeProcessStart () override
 
size_t RealtimeProcess (int group, float **inbuf, float **outbuf, size_t numSamples) override
 
bool RealtimeProcessEnd () override
 
bool ShowInterface (wxWindow *parent, bool forceModal=false) override
 
bool GetAutomationParameters (CommandParameters &parms) override
 
bool SetAutomationParameters (CommandParameters &parms) override
 
bool LoadUserPreset (const wxString &name) override
 
bool SaveUserPreset (const wxString &name) override
 
wxArrayString GetFactoryPresets () override
 
bool LoadFactoryPreset (int id) override
 
bool LoadFactoryDefaults () override
 
void SetHostUI (EffectUIHostInterface *host) override
 
bool PopulateUI (wxWindow *parent) override
 
bool IsGraphicalUI () override
 
bool ValidateUI () override
 
bool HideUI () override
 
bool CloseUI () override
 
bool CanExportPresets () override
 
void ExportPresets () override
 
void ImportPresets () override
 
bool HasOptions () override
 
void ShowOptions () override
 
double GetDefaultDuration () override
 
double GetDuration () override
 
NumericFormatId GetDurationFormat () override
 
virtual NumericFormatId GetSelectionFormat ()
 
void SetDuration (double duration) override
 
bool Apply () override
 
void Preview () override
 
wxDialog * CreateUI (wxWindow *parent, EffectUIClientInterface *client) override
 
wxString GetUserPresetsGroup (const wxString &name) override
 
wxString GetCurrentSettingsGroup () override
 
wxString GetFactoryDefaultsGroup () override
 
virtual wxString GetSavedStateGroup ()
 
bool HasSharedConfigGroup (const wxString &group) override
 
bool GetSharedConfigSubgroups (const wxString &group, wxArrayString &subgroups) override
 
bool GetSharedConfig (const wxString &group, const wxString &key, wxString &value, const wxString &defval=wxEmptyString) override
 
bool GetSharedConfig (const wxString &group, const wxString &key, int &value, int defval=0) override
 
bool GetSharedConfig (const wxString &group, const wxString &key, bool &value, bool defval=false) override
 
bool GetSharedConfig (const wxString &group, const wxString &key, float &value, float defval=0.0) override
 
bool GetSharedConfig (const wxString &group, const wxString &key, double &value, double defval=0.0) override
 
bool SetSharedConfig (const wxString &group, const wxString &key, const wxString &value) override
 
bool SetSharedConfig (const wxString &group, const wxString &key, const int &value) override
 
bool SetSharedConfig (const wxString &group, const wxString &key, const bool &value) override
 
bool SetSharedConfig (const wxString &group, const wxString &key, const float &value) override
 
bool SetSharedConfig (const wxString &group, const wxString &key, const double &value) override
 
bool RemoveSharedConfigSubgroup (const wxString &group) override
 
bool RemoveSharedConfig (const wxString &group, const wxString &key) override
 
bool HasPrivateConfigGroup (const wxString &group) override
 
bool GetPrivateConfigSubgroups (const wxString &group, wxArrayString &subgroups) override
 
bool GetPrivateConfig (const wxString &group, const wxString &key, wxString &value, const wxString &defval=wxEmptyString) override
 
bool GetPrivateConfig (const wxString &group, const wxString &key, int &value, int defval=0) override
 
bool GetPrivateConfig (const wxString &group, const wxString &key, bool &value, bool defval=false) override
 
bool GetPrivateConfig (const wxString &group, const wxString &key, float &value, float defval=0.0) override
 
bool GetPrivateConfig (const wxString &group, const wxString &key, double &value, double defval=0.0) override
 
bool SetPrivateConfig (const wxString &group, const wxString &key, const wxString &value) override
 
bool SetPrivateConfig (const wxString &group, const wxString &key, const int &value) override
 
bool SetPrivateConfig (const wxString &group, const wxString &key, const bool &value) override
 
bool SetPrivateConfig (const wxString &group, const wxString &key, const float &value) override
 
bool SetPrivateConfig (const wxString &group, const wxString &key, const double &value) override
 
bool RemovePrivateConfigSubgroup (const wxString &group) override
 
bool RemovePrivateConfig (const wxString &group, const wxString &key) override
 
virtual PluginID GetID ()
 
virtual bool Startup (EffectClientInterface *client)
 
virtual bool GetAutomationParameters (wxString &parms)
 
virtual bool SetAutomationParameters (const wxString &parms)
 
virtual wxArrayString GetUserPresets ()
 
virtual bool HasCurrentSettings ()
 
virtual bool HasFactoryDefaults ()
 
virtual wxString GetPreset (wxWindow *parent, const wxString &parms)
 
virtual wxString HelpPage ()
 
virtual bool IsBatchProcessing ()
 
virtual void SetBatchProcessing (bool start)
 
void SetPresetParameters (const wxArrayString *Names, const wxArrayString *Values)
 
bool DoEffect (wxWindow *parent, double projectRate, TrackList *list, TrackFactory *factory, SelectedRegion *selectedRegion, bool shouldPrompt=true)
 
bool Delegate (Effect &delegate, wxWindow *parent, bool shouldPrompt)
 
bool RealtimeAddProcessor (int group, unsigned chans, float rate)
 
size_t RealtimeProcess (int group, unsigned chans, float **inbuf, float **outbuf, size_t numSamples)
 
bool IsRealtimeActive ()
 
virtual bool IsHidden ()
 
int MessageBox (const wxString &message, long style=DefaultMessageBoxStyle, const wxString &titleStr=wxString{})
 
- Public Member Functions inherited from EffectClientInterface
virtual ~EffectClientInterface ()
 
- Public Member Functions inherited from EffectDefinitionInterface
virtual ~EffectDefinitionInterface ()
 
- Public Member Functions inherited from IdentInterface
virtual ~IdentInterface ()
 
const wxString & GetTranslatedName ()
 
- Public Member Functions inherited from ParamsInterface
virtual ~ParamsInterface ()
 
virtual bool DefineParams (ShuttleParams &WXUNUSED(S))
 
- Public Member Functions inherited from EffectUIClientInterface
virtual ~EffectUIClientInterface ()
 
- Public Member Functions inherited from EffectHostInterface
virtual ~EffectHostInterface ()
 
- Public Member Functions inherited from ConfigClientInterface
virtual ~ConfigClientInterface ()
 

Private Member Functions

bool MakeDtmfTone (float *buffer, size_t len, float fs, wxChar tone, sampleCount last, sampleCount total, float amplitude)
 
void Recalculate ()
 
void UpdateUI ()
 
void OnSequence (wxCommandEvent &evt)
 
void OnAmplitude (wxCommandEvent &evt)
 
void OnDuration (wxCommandEvent &evt)
 
void OnDutyCycle (wxCommandEvent &evt)
 

Private Attributes

sampleCount numSamplesSequence
 
sampleCount numSamplesTone
 
sampleCount numSamplesSilence
 
sampleCount diff
 
sampleCount numRemaining
 
sampleCount curTonePos
 
bool isTone
 
int curSeqPos
 
wxString dtmfSequence
 
int dtmfNTones
 
double dtmfTone
 
double dtmfSilence
 
double dtmfDutyCycle
 
double dtmfAmplitude
 
wxTextCtrl * mDtmfSequenceT
 
wxTextCtrl * mDtmfAmplitudeT
 
wxSlider * mDtmfDutyCycleS
 
NumericTextCtrlmDtmfDurationT
 
wxStaticText * mDtmfToneT
 
wxStaticText * mDtmfSilenceT
 
wxStaticText * mDtmfDutyT
 

Additional Inherited Members

- Public Types inherited from Effect
enum  : long { DefaultMessageBoxStyle = wxOK | wxCENTRE }
 
- Protected Member Functions inherited from Effect
virtual bool PromptUser (wxWindow *parent)
 
virtual bool CheckWhetherSkipEffect ()
 
virtual bool Process ()
 
virtual bool ProcessPass ()
 
virtual bool InitPass1 ()
 
virtual bool InitPass2 ()
 
virtual int GetPass ()
 
virtual void End ()
 
virtual double CalcPreviewInputLength (double previewLength)
 
virtual void Preview (bool dryOnly)
 
virtual bool EnableApply (bool enable=true)
 
virtual bool EnablePreview (bool enable=true)
 
virtual void EnableDebug (bool enable=true)
 
bool TotalProgress (double frac)
 
bool TrackProgress (int whichTrack, double frac, const wxString &=wxEmptyString)
 
bool TrackGroupProgress (int whichGroup, double frac, const wxString &=wxEmptyString)
 
int GetNumWaveTracks ()
 
int GetNumWaveGroups ()
 
void GetSamples (const WaveTrack *track, sampleCount *start, sampleCount *len)
 
void SetLinearEffectFlag (bool linearEffectFlag)
 
void SetPreviewFullSelectionFlag (bool previewDurationFlag)
 
bool IsPreviewing ()
 
void IncludeNotSelectedPreviewTracks (bool includeNotSelected)
 
void CopyInputTracks ()
 
void CopyInputTracks (int trackType)
 
std::shared_ptr
< AddedAnalysisTrack
AddAnalysisTrack (const wxString &name=wxString())
 
ModifiedAnalysisTrack ModifyAnalysisTrack (const LabelTrack *pOrigTrack, const wxString &name=wxString())
 
void ReplaceProcessedTracks (const bool bGoodResult)
 
TrackAddToOutputTracks (std::unique_ptr< Track > &&t)
 
TrackListinputTracks () const
 
- Protected Attributes inherited from Effect
ProgressDialogmProgress
 
double mProjectRate
 
double mSampleRate
 
SelectedRegionmpSelectedRegion {}
 
TrackFactorymFactory
 
std::shared_ptr< TrackListmOutputTracks
 
double mT0
 
double mT1
 
double mF0
 
double mF1
 
wxArrayString mPresetNames
 
wxArrayString mPresetValues
 
int mPass
 
wxDialog * mUIDialog
 
wxWindow * mUIParent
 
int mUIResultID
 
sampleCount mSampleCnt
 
int mOutputTracksType
 

Detailed Description

An effect that generates DTMF tones.

Definition at line 30 of file DtmfGen.h.

Constructor & Destructor Documentation

EffectDtmf::EffectDtmf ( )

Definition at line 79 of file DtmfGen.cpp.

80 {
81  dtmfDutyCycle = DEF_DutyCycle;
82  dtmfAmplitude = DEF_Amplitude;
83  dtmfSequence = DEF_Sequence;
84  dtmfTone = 0.0;
85  dtmfSilence = 0.0;
86 }
wxString dtmfSequence
Definition: DtmfGen.h:88
double dtmfAmplitude
Definition: DtmfGen.h:93
double dtmfSilence
Definition: DtmfGen.h:91
double dtmfDutyCycle
Definition: DtmfGen.h:92
double dtmfTone
Definition: DtmfGen.h:90
EffectDtmf::~EffectDtmf ( )
virtual

Definition at line 88 of file DtmfGen.cpp.

89 {
90 }

Member Function Documentation

bool EffectDtmf::DefineParams ( ShuttleParams S)
override

Definition at line 232 of file DtmfGen.cpp.

References dtmfAmplitude, dtmfDutyCycle, and dtmfSequence.

232  {
233  S.SHUTTLE_PARAM( dtmfSequence, Sequence );
234  S.SHUTTLE_PARAM( dtmfDutyCycle, DutyCycle );
235  S.SHUTTLE_PARAM( dtmfAmplitude, Amplitude );
236  return true;
237 }
A WaveTrack contains WaveClip(s). A WaveClip contains a Sequence. A Sequence is primarily an interfac...
Definition: Sequence.h:54
wxString dtmfSequence
Definition: DtmfGen.h:88
double dtmfAmplitude
Definition: DtmfGen.h:93
double dtmfDutyCycle
Definition: DtmfGen.h:92
unsigned EffectDtmf::GetAudioOutCount ( )
overridevirtual

Implements EffectClientInterface.

Definition at line 118 of file DtmfGen.cpp.

119 {
120  return 1;
121 }
bool EffectDtmf::GetAutomationParameters ( CommandParameters parms)
overridevirtual

Implements EffectClientInterface.

Definition at line 239 of file DtmfGen.cpp.

References dtmfAmplitude, dtmfDutyCycle, and dtmfSequence.

240 {
241  parms.Write(KEY_Sequence, dtmfSequence);
242  parms.Write(KEY_DutyCycle, dtmfDutyCycle);
243  parms.Write(KEY_Amplitude, dtmfAmplitude);
244 
245  return true;
246 }
wxString dtmfSequence
Definition: DtmfGen.h:88
double dtmfAmplitude
Definition: DtmfGen.h:93
double dtmfDutyCycle
Definition: DtmfGen.h:92
wxString EffectDtmf::GetDescription ( )
overridevirtual

Implements IdentInterface.

Definition at line 99 of file DtmfGen.cpp.

References _().

100 {
101  return _("Generates dual-tone multi-frequency (DTMF) tones like those produced by the keypad on telephones");
102 }
_("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
IdentInterfaceSymbol EffectDtmf::GetSymbol ( )
overridevirtual

Implements IdentInterface.

Definition at line 94 of file DtmfGen.cpp.

References DTMFTONES_PLUGIN_SYMBOL.

95 {
97 }
#define DTMFTONES_PLUGIN_SYMBOL
Definition: DtmfGen.h:28
EffectType EffectDtmf::GetType ( )
overridevirtual

Implements EffectDefinitionInterface.

Definition at line 111 of file DtmfGen.cpp.

References EffectTypeGenerate.

112 {
113  return EffectTypeGenerate;
114 }
bool EffectDtmf::Init ( )
overridevirtual

Reimplemented from Effect.

Definition at line 305 of file DtmfGen.cpp.

References Recalculate().

306 {
307  Recalculate();
308 
309  return true;
310 }
void Recalculate()
Definition: DtmfGen.cpp:406
bool EffectDtmf::MakeDtmfTone ( float *  buffer,
size_t  len,
float  fs,
wxChar  tone,
sampleCount  last,
sampleCount  total,
float  amplitude 
)
private

Definition at line 448 of file DtmfGen.cpp.

References kFadeInOut, and M_PI.

Referenced by ProcessBlock().

449 {
450 /*
451  --------------------------------------------
452  1209 Hz 1336 Hz 1477 Hz 1633 Hz
453 
454  ABC DEF
455  697 Hz 1 2 3 A
456 
457  GHI JKL MNO
458  770 Hz 4 5 6 B
459 
460  PQRS TUV WXYZ
461  852 Hz 7 8 9 C
462 
463  oper
464  941 Hz * 0 # D
465  --------------------------------------------
466  Essentially we need to generate two sin with
467  frequencies according to this table, and sum
468  them up.
469  sin wave is generated by:
470  s(n)=sin(2*pi*n*f/fs)
471 
472  We will precalculate:
473  A= 2*pi*f1/fs
474  B= 2*pi*f2/fs
475 
476  And use two switch statements to select the frequency
477 
478  Note: added support for letters, like those on the keypad
479  This support is only for lowercase letters: uppercase
480  are still considered to be the 'military'/carrier extra
481  tones.
482 */
483 
484  float f1, f2=0.0;
485  double A,B;
486 
487  // select low tone: left column
488  switch (tone) {
489  case '1': case '2': case '3': case 'A':
490  case 'a': case 'b': case 'c':
491  case 'd': case 'e': case 'f':
492  f1=697;
493  break;
494  case '4': case '5': case '6': case 'B':
495  case 'g': case 'h': case 'i':
496  case 'j': case 'k': case 'l':
497  case 'm': case 'n': case 'o':
498  f1=770;
499  break;
500  case '7': case '8': case '9': case 'C':
501  case 'p': case 'q': case 'r': case 's':
502  case 't': case 'u': case 'v':
503  case 'w': case 'x': case 'y': case 'z':
504  f1=852;
505  break;
506  case '*': case '0': case '#': case 'D':
507  f1=941;
508  break;
509  default:
510  f1=0;
511  }
512 
513  // select high tone: top row
514  switch (tone) {
515  case '1': case '4': case '7': case '*':
516  case 'g': case 'h': case 'i':
517  case 'p': case 'q': case 'r': case 's':
518  f2=1209;
519  break;
520  case '2': case '5': case '8': case '0':
521  case 'a': case 'b': case 'c':
522  case 'j': case 'k': case 'l':
523  case 't': case 'u': case 'v':
524  f2=1336;
525  break;
526  case '3': case '6': case '9': case '#':
527  case 'd': case 'e': case 'f':
528  case 'm': case 'n': case 'o':
529  case 'w': case 'x': case 'y': case 'z':
530  f2=1477;
531  break;
532  case 'A': case 'B': case 'C': case 'D':
533  f2=1633;
534  break;
535  default:
536  f2=0;
537  }
538 
539  // precalculations
540  A=B=2*M_PI/fs;
541  A*=f1;
542  B*=f2;
543 
544  // now generate the wave: 'last' is used to avoid phase errors
545  // when inside the inner for loop of the Process() function.
546  for(decltype(len) i = 0; i < len; i++) {
547  buffer[i] = amplitude * 0.5 *
548  (sin( A * (i + last).as_double() ) +
549  sin( B * (i + last).as_double() ));
550  }
551 
552  // generate a fade-in of duration 1/250th of second
553  if (last == 0) {
554  A = (fs / kFadeInOut);
555  for(size_t i = 0; i < A; i++) {
556  buffer[i] *= i/A;
557  }
558  }
559 
560  // generate a fade-out of duration 1/250th of second
561  if (last == total - len) {
562  // we are at the last buffer of 'len' size, so, offset is to
563  // backup 'A' samples, from 'len'
564  A = (fs / kFadeInOut);
565  auto offset = long(len) - long(fs / kFadeInOut);
566  // protect against negative offset, which can occur if too a
567  // small selection is made
568  if (offset >= 0) {
569  for(size_t i = 0; i < A; i++) {
570  buffer[i + offset] *= (1 - (i / A));
571  }
572  }
573  }
574  return true;
575 }
static const double kFadeInOut
Definition: DtmfGen.cpp:51
#define M_PI
Definition: Distortion.cpp:28
wxString EffectDtmf::ManualPage ( )
overridevirtual

Reimplemented from Effect.

Definition at line 104 of file DtmfGen.cpp.

105 {
106  return wxT("DTMF_Tones");
107 }
void EffectDtmf::OnAmplitude ( wxCommandEvent &  evt)
private

Definition at line 596 of file DtmfGen.cpp.

References mDtmfAmplitudeT, Recalculate(), and UpdateUI().

597 {
598  if (!mDtmfAmplitudeT->GetValidator()->TransferFromWindow())
599  {
600  return;
601  }
602  Recalculate();
603  UpdateUI();
604 }
void Recalculate()
Definition: DtmfGen.cpp:406
void UpdateUI()
Definition: DtmfGen.cpp:577
wxTextCtrl * mDtmfAmplitudeT
Definition: DtmfGen.h:96
void EffectDtmf::OnDuration ( wxCommandEvent &  evt)
private

Definition at line 605 of file DtmfGen.cpp.

References NumericConverter::GetValue(), mDtmfDurationT, Recalculate(), Effect::SetDuration(), and UpdateUI().

606 {
608  Recalculate();
609  UpdateUI();
610 }
void Recalculate()
Definition: DtmfGen.cpp:406
void UpdateUI()
Definition: DtmfGen.cpp:577
void SetDuration(double duration) override
Definition: Effect.cpp:744
NumericTextCtrl * mDtmfDurationT
Definition: DtmfGen.h:98
void EffectDtmf::OnDutyCycle ( wxCommandEvent &  evt)
private

Definition at line 612 of file DtmfGen.cpp.

References dtmfDutyCycle, Recalculate(), and UpdateUI().

613 {
614  dtmfDutyCycle = (double) evt.GetInt() / SCL_DutyCycle;
615  Recalculate();
616  UpdateUI();
617 }
void Recalculate()
Definition: DtmfGen.cpp:406
void UpdateUI()
Definition: DtmfGen.cpp:577
double dtmfDutyCycle
Definition: DtmfGen.h:92
void EffectDtmf::OnSequence ( wxCommandEvent &  evt)
private

Definition at line 589 of file DtmfGen.cpp.

References dtmfSequence, mDtmfSequenceT, Recalculate(), and UpdateUI().

590 {
591  dtmfSequence = mDtmfSequenceT->GetValue();
592  Recalculate();
593  UpdateUI();
594 }
void Recalculate()
Definition: DtmfGen.cpp:406
wxString dtmfSequence
Definition: DtmfGen.h:88
wxTextCtrl * mDtmfSequenceT
Definition: DtmfGen.h:95
void UpdateUI()
Definition: DtmfGen.cpp:577
void EffectDtmf::PopulateOrExchange ( ShuttleGui S)
overridevirtual

Reimplemented from Effect.

Definition at line 312 of file DtmfGen.cpp.

References _(), ShuttleGuiBase::AddFixedText(), ShuttleGuiBase::AddPrompt(), ShuttleGuiBase::AddSlider(), ShuttleGui::AddSpace(), ShuttleGuiBase::AddTextBox(), ShuttleGuiBase::AddVariableText(), ShuttleGuiBase::AddWindow(), NumericTextCtrl::Options::AutoPos(), dtmfAmplitude, dtmfDutyCycle, dtmfSequence, dtmfSilence, dtmfTone, ShuttleGuiBase::EndMultiColumn(), Effect::GetDuration(), Effect::GetDurationFormat(), ShuttleGuiBase::GetParent(), ShuttleGui::Id(), ID_Amplitude, ID_Duration, ID_DutyCycle, ID_Sequence, mDtmfDurationT, mDtmfDutyCycleS, mDtmfDutyT, mDtmfSequenceT, mDtmfSilenceT, mDtmfToneT, Effect::mProjectRate, safenew, ShuttleGuiBase::SetSizeHints(), ShuttleGuiBase::SetStyle(), ShuttleGuiBase::StartMultiColumn(), and NumericConverter::TIME.

313 {
314  // dialog will be passed values from effect
315  // Effect retrieves values from saved config
316  // Dialog will take care of using them to initialize controls
317  // If there is a selection, use that duration, otherwise use
318  // value from saved config: this is useful is user wants to
319  // replace selection with dtmf sequence
320 
321  S.AddSpace(0, 5);
322  S.StartMultiColumn(2, wxCENTER);
323  {
324  wxTextValidator vldDtmf(wxFILTER_INCLUDE_CHAR_LIST, &dtmfSequence);
325  vldDtmf.SetIncludes(wxArrayString(WXSIZEOF(kSymbols), kSymbols));
326  mDtmfSequenceT = S.Id(ID_Sequence).AddTextBox(_("DTMF sequence:"), wxT(""), 10);
327  mDtmfSequenceT->SetValidator(vldDtmf);
328 
329  FloatingPointValidator<double> vldAmp(3, &dtmfAmplitude, NumValidatorStyle::NO_TRAILING_ZEROES);
330  vldAmp.SetRange(MIN_Amplitude, MAX_Amplitude);
331  S.Id(ID_Amplitude).AddTextBox(_("Amplitude (0-1):"), wxT(""), 10)->SetValidator(vldAmp);
332 
333  S.AddPrompt(_("Duration:"));
338  GetDuration(),
339  mProjectRate,
341  .AutoPos(true));
342  mDtmfDurationT->SetName(_("Duration"));
344 
345  S.AddFixedText(_("Tone/silence ratio:"), false);
346  S.SetStyle(wxSL_HORIZONTAL | wxEXPAND);
348  dtmfDutyCycle * SCL_DutyCycle,
349  MAX_DutyCycle * SCL_DutyCycle,
350  MIN_DutyCycle * SCL_DutyCycle);
351  S.SetSizeHints(-1,-1);
352  }
353  S.EndMultiColumn();
354 
355  S.StartMultiColumn(2, wxCENTER);
356  {
357  S.AddFixedText(_("Duty cycle:"), false);
358  mDtmfDutyT = S.AddVariableText(wxString::Format(wxT("%.1f %%"), dtmfDutyCycle), false);
359 
360  S.AddFixedText(_("Tone duration:"), false);
361  mDtmfSilenceT = S.AddVariableText(wxString::Format(wxString(wxT("%.0f ")) + _("ms"), dtmfTone * 1000.0), false);
362 
363  S.AddFixedText(_("Silence duration:"), false);
364  mDtmfToneT = S.AddVariableText(wxString::Format(wxString(wxT("%0.f ")) + _("ms"), dtmfSilence * 1000.0), false);
365  }
366  S.EndMultiColumn();
367 }
void SetSizeHints(int minX, int minY)
Used to modify an already placed Window.
Definition: ShuttleGui.cpp:194
wxStaticText * mDtmfToneT
Definition: DtmfGen.h:99
static const wxChar * kSymbols[]
Definition: DtmfGen.cpp:53
double GetDuration() override
Definition: Effect.cpp:724
wxWindow * AddWindow(wxWindow *pWindow, int Flags=wxALIGN_CENTRE|wxALL)
Definition: ShuttleGui.cpp:288
wxStaticText * mDtmfDutyT
Definition: DtmfGen.h:101
wxSlider * mDtmfDutyCycleS
Definition: DtmfGen.h:97
void EndMultiColumn()
NumericFormatId GetDurationFormat() override
Definition: Effect.cpp:734
#define safenew
Definition: Audacity.h:230
wxString dtmfSequence
Definition: DtmfGen.h:88
wxTextCtrl * mDtmfSequenceT
Definition: DtmfGen.h:95
void AddPrompt(const wxString &Prompt)
Right aligned text string.
Definition: ShuttleGui.cpp:239
wxTextCtrl * AddTextBox(const wxString &Caption, const wxString &Value, const int nChars)
Definition: ShuttleGui.cpp:540
wxWindow * GetParent()
Definition: ShuttleGui.h:294
double dtmfAmplitude
Definition: DtmfGen.h:93
void StartMultiColumn(int nCols, int PositionFlags=wxALIGN_LEFT)
ShuttleGui & Id(int id)
void SetStyle(int Style)
Definition: ShuttleGui.h:287
double dtmfSilence
Definition: DtmfGen.h:91
void AddFixedText(const wxString &Str, bool bCenter=false)
Definition: ShuttleGui.cpp:397
wxStaticText * mDtmfSilenceT
Definition: DtmfGen.h:100
double mProjectRate
Definition: Effect.h:453
_("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
wxStaticText * AddVariableText(const wxString &Str, bool bCenter=false, int PositionFlags=0)
Definition: ShuttleGui.cpp:414
double dtmfDutyCycle
Definition: DtmfGen.h:92
NumericTextCtrl * mDtmfDurationT
Definition: DtmfGen.h:98
Options & AutoPos(bool value)
wxSizerItem * AddSpace(int width, int height)
double dtmfTone
Definition: DtmfGen.h:90
wxSlider * AddSlider(const wxString &Prompt, int pos, int Max, int Min=0)
Definition: ShuttleGui.cpp:497
size_t EffectDtmf::ProcessBlock ( float **  inBlock,
float **  outBlock,
size_t  blockLen 
)
overridevirtual

Implements EffectClientInterface.

Definition at line 166 of file DtmfGen.cpp.

References curSeqPos, curTonePos, diff, dtmfAmplitude, dtmfSequence, isTone, limitSampleBufferSize(), MakeDtmfTone(), Effect::mSampleRate, numRemaining, numSamplesSilence, and numSamplesTone.

167 {
168  float *buffer = outbuf[0];
169  decltype(size) processed = 0;
170 
171  // for the whole dtmf sequence, we will be generating either tone or silence
172  // according to a bool value, and this might be done in small chunks of size
173  // 'block', as a single tone might sometimes be larger than the block
174  // tone and silence generally have different duration, thus two generation blocks
175  //
176  // Note: to overcome a 'clicking' noise introduced by the abrupt transition from/to
177  // silence, I added a fade in/out of 1/250th of a second (4ms). This can still be
178  // tweaked but gives excellent results at 44.1kHz: I haven't tried other freqs.
179  // A problem might be if the tone duration is very short (<10ms)... (?)
180  //
181  // One more problem is to deal with the approximations done when calculating the duration
182  // of both tone and silence: in some cases the final sum might not be same as the initial
183  // duration. So, to overcome this, we had a redistribution block up, and now we will spread
184  // the remaining samples in every bin in order to achieve the full duration: test case was
185  // to generate an 11 tone DTMF sequence, in 4 seconds, and with DutyCycle=75%: after generation
186  // you ended up with 3.999s or in other units: 3 seconds and 44097 samples.
187  //
188  while (size)
189  {
190  if (numRemaining == 0)
191  {
192  isTone = !isTone;
193 
194  if (isTone)
195  {
196  curSeqPos++;
198  curTonePos = 0;
199  }
200  else
201  {
203  }
204 
205  // the statement takes care of extracting one sample from the diff bin and
206  // adding it into the current block until depletion
207  numRemaining += (diff-- > 0 ? 1 : 0);
208  }
209 
210  const auto len = limitSampleBufferSize( size, numRemaining );
211 
212  if (isTone)
213  {
214  // generate the tone and append
216  curTonePos += len;
217  }
218  else
219  {
220  memset(buffer, 0, sizeof(float) * len);
221  }
222 
223  numRemaining -= len;
224 
225  buffer += len;
226  size -= len;
227  processed += len;
228  }
229 
230  return processed;
231 }
sampleCount numSamplesSilence
Definition: DtmfGen.h:81
double mSampleRate
Definition: Effect.h:455
sampleCount diff
Definition: DtmfGen.h:82
wxString dtmfSequence
Definition: DtmfGen.h:88
int curSeqPos
Definition: DtmfGen.h:86
size_t limitSampleBufferSize(size_t bufferSize, sampleCount limit)
Definition: Types.h:177
double dtmfAmplitude
Definition: DtmfGen.h:93
sampleCount numRemaining
Definition: DtmfGen.h:83
bool MakeDtmfTone(float *buffer, size_t len, float fs, wxChar tone, sampleCount last, sampleCount total, float amplitude)
Definition: DtmfGen.cpp:448
sampleCount curTonePos
Definition: DtmfGen.h:84
sampleCount numSamplesTone
Definition: DtmfGen.h:80
bool isTone
Definition: DtmfGen.h:85
bool EffectDtmf::ProcessInitialize ( sampleCount  totalLen,
ChannelNames  chanMap = NULL 
)
overridevirtual

Implements EffectClientInterface.

Definition at line 123 of file DtmfGen.cpp.

References curSeqPos, diff, dtmfNTones, dtmfSilence, dtmfTone, Effect::GetDuration(), isTone, Effect::mSampleRate, Effect::mT0, numRemaining, numSamplesSequence, numSamplesSilence, and numSamplesTone.

124 {
125  double duration = GetDuration();
126 
127  // all dtmf sequence durations in samples from seconds
128  // MJS: Note that mDuration is in seconds but will have been quantised to the units of the TTC.
129  // If this was 'samples' and the project rate was lower than the track rate,
130  // extra samples may get created as mDuration may now be > mT1 - mT0;
131  // However we are making our best efforts at creating what was asked for.
132 
133  auto nT0 = (sampleCount)floor(mT0 * mSampleRate + 0.5);
134  auto nT1 = (sampleCount)floor((mT0 + duration) * mSampleRate + 0.5);
135  numSamplesSequence = nT1 - nT0; // needs to be exact number of samples selected
136 
137  //make under-estimates if anything, and then redistribute the few remaining samples
140 
141  // recalculate the sum, and spread the difference - due to approximations.
142  // Since diff should be in the order of "some" samples, a division (resulting in zero)
143  // is not sufficient, so we add the additional remaining samples in each tone/silence block,
144  // at least until available.
146  while (diff > 2*dtmfNTones - 1) { // more than one per thingToBeGenerated
147  // in this case, both numSamplesTone and numSamplesSilence would change, so it makes sense
148  // to recalculate diff here, otherwise just keep the value we already have
149 
150  // should always be the case that dtmfNTones>1, as if 0, we don't even start processing,
151  // and with 1 there is no difference to spread (no silence slot)...
152  wxASSERT(dtmfNTones > 1);
156  }
157  wxASSERT(diff >= 0); // should never be negative
158 
159  curSeqPos = -1; // pointer to string in dtmfSequence
160  isTone = false;
161  numRemaining = 0;
162 
163  return true;
164 }
double GetDuration() override
Definition: Effect.cpp:724
sampleCount numSamplesSilence
Definition: DtmfGen.h:81
double mSampleRate
Definition: Effect.h:455
sampleCount diff
Definition: DtmfGen.h:82
int curSeqPos
Definition: DtmfGen.h:86
sampleCount numRemaining
Definition: DtmfGen.h:83
sampleCount numSamplesSequence
Definition: DtmfGen.h:79
double dtmfSilence
Definition: DtmfGen.h:91
int dtmfNTones
Definition: DtmfGen.h:89
sampleCount numSamplesTone
Definition: DtmfGen.h:80
double dtmfTone
Definition: DtmfGen.h:90
bool isTone
Definition: DtmfGen.h:85
double mT0
Definition: Effect.h:460
void EffectDtmf::Recalculate ( )
private

Definition at line 406 of file DtmfGen.cpp.

References dtmfDutyCycle, dtmfNTones, dtmfSequence, dtmfSilence, dtmfTone, Effect::GetDuration(), and Effect::SetDuration().

Referenced by Init(), OnAmplitude(), OnDuration(), OnDutyCycle(), OnSequence(), SetAutomationParameters(), TransferDataFromWindow(), and TransferDataToWindow().

407 {
408  // remember that dtmfDutyCycle is in range (0.0-100.0)
409 
410  dtmfNTones = (int) dtmfSequence.Length();
411 
412  if (dtmfNTones==0) {
413  // no tones, all zero: don't do anything
414  // this should take care of the case where user got an empty
415  // dtmf sequence into the generator: track won't be generated
416  SetDuration(0.0);
417  dtmfTone = 0;
418  dtmfSilence = 0;
419  } else {
420  if (dtmfNTones==1) {
421  // single tone, as long as the sequence
422  dtmfTone = GetDuration();
423  dtmfSilence = 0;
424  } else {
425  // Don't be fooled by the fact that you divide the sequence into dtmfNTones:
426  // the last slot will only contain a tone, not ending with silence.
427  // Given this, the right thing to do is to divide the sequence duration
428  // by dtmfNTones tones and (dtmfNTones-1) silences each sized according to the duty
429  // cycle: original division was:
430  // slot=mDuration / (dtmfNTones*(dtmfDutyCycle/MAX_DutyCycle)+(dtmfNTones-1)*(1.0-dtmfDutyCycle/MAX_DutyCycle))
431  // which can be simplified in the one below.
432  // Then just take the part that belongs to tone or silence.
433  //
434  double slot = GetDuration() / ((double)dtmfNTones + (dtmfDutyCycle / 100.0) - 1);
435  dtmfTone = slot * (dtmfDutyCycle / 100.0); // seconds
436  dtmfSilence = slot * (1.0 - (dtmfDutyCycle / 100.0)); // seconds
437 
438  // Note that in the extremes we have:
439  // - dutyCycle=100%, this means no silence, so each tone will measure mDuration/dtmfNTones
440  // - dutyCycle=0%, this means no tones, so each silence slot will measure mDuration/(NTones-1)
441  // But we always count:
442  // - dtmfNTones tones
443  // - dtmfNTones-1 silences
444  }
445  }
446 }
double GetDuration() override
Definition: Effect.cpp:724
wxString dtmfSequence
Definition: DtmfGen.h:88
double dtmfSilence
Definition: DtmfGen.h:91
void SetDuration(double duration) override
Definition: Effect.cpp:744
double dtmfDutyCycle
Definition: DtmfGen.h:92
int dtmfNTones
Definition: DtmfGen.h:89
double dtmfTone
Definition: DtmfGen.h:90
bool EffectDtmf::SetAutomationParameters ( CommandParameters parms)
overridevirtual

Implements EffectClientInterface.

Definition at line 248 of file DtmfGen.cpp.

References dtmfAmplitude, dtmfDutyCycle, dtmfSequence, ReadAndVerifyDouble, ReadAndVerifyString, and Recalculate().

249 {
250  ReadAndVerifyDouble(DutyCycle);
251  ReadAndVerifyDouble(Amplitude);
253 
254  wxString symbols;
255  for (unsigned int i = 0; i < WXSIZEOF(kSymbols); i++)
256  {
257  symbols += kSymbols[i];
258  }
259 
260  if (Sequence.find_first_not_of(symbols) != wxString::npos)
261  {
262  return false;
263  }
264 
265  dtmfDutyCycle = DutyCycle;
266  dtmfAmplitude = Amplitude;
268 
269  Recalculate();
270 
271  return true;
272 }
static const wxChar * kSymbols[]
Definition: DtmfGen.cpp:53
A WaveTrack contains WaveClip(s). A WaveClip contains a Sequence. A Sequence is primarily an interfac...
Definition: Sequence.h:54
void Recalculate()
Definition: DtmfGen.cpp:406
wxString dtmfSequence
Definition: DtmfGen.h:88
double dtmfAmplitude
Definition: DtmfGen.h:93
#define ReadAndVerifyDouble(name)
Definition: Effect.h:798
#define ReadAndVerifyString(name)
Definition: Effect.h:801
double dtmfDutyCycle
Definition: DtmfGen.h:92
bool EffectDtmf::Startup ( )
overridevirtual

Reimplemented from Effect.

Definition at line 276 of file DtmfGen.cpp.

References dtmfAmplitude, dtmfDutyCycle, dtmfSequence, Effect::GetCurrentSettingsGroup(), gPrefs, Effect::SaveUserPreset(), and SHORT_APP_NAME.

277 {
278  wxString base = wxT("/Effects/DtmfGen/");
279 
280  // Migrate settings from 2.1.0 or before
281 
282  // Already migrated, so bail
283  if (gPrefs->Exists(base + wxT("Migrated")))
284  {
285  return true;
286  }
287 
288  // Load the old "current" settings
289  if (gPrefs->Exists(base))
290  {
291  gPrefs->Read(base + wxT("String"), &dtmfSequence, wxT(SHORT_APP_NAME));
292  gPrefs->Read(base + wxT("DutyCycle"), &dtmfDutyCycle, 550L);
293  gPrefs->Read(base + wxT("Amplitude"), &dtmfAmplitude, 0.8f);
294 
296 
297  // Do not migrate again
298  gPrefs->Write(base + wxT("Migrated"), true);
299  gPrefs->Flush();
300  }
301 
302  return true;
303 }
#define SHORT_APP_NAME
Definition: DtmfGen.cpp:41
AudacityPrefs * gPrefs
Definition: Prefs.cpp:73
bool SaveUserPreset(const wxString &name) override
Definition: Effect.cpp:602
wxString GetCurrentSettingsGroup() override
Definition: Effect.cpp:803
wxString dtmfSequence
Definition: DtmfGen.h:88
double dtmfAmplitude
Definition: DtmfGen.h:93
double dtmfDutyCycle
Definition: DtmfGen.h:92
bool EffectDtmf::TransferDataFromWindow ( )
overridevirtual

Reimplemented from Effect.

Definition at line 387 of file DtmfGen.cpp.

References dtmfDutyCycle, NumericConverter::GetValue(), mDtmfDurationT, mDtmfDutyCycleS, Effect::mUIParent, Recalculate(), and Effect::SetDuration().

388 {
389  if (!mUIParent->Validate() || !mUIParent->TransferDataFromWindow())
390  {
391  return false;
392  }
393 
394  dtmfDutyCycle = (double) mDtmfDutyCycleS->GetValue() / SCL_DutyCycle;
396 
397  // recalculate to make sure all values are up-to-date. This is especially
398  // important if the user did not change any values in the dialog
399  Recalculate();
400 
401  return true;
402 }
wxSlider * mDtmfDutyCycleS
Definition: DtmfGen.h:97
void Recalculate()
Definition: DtmfGen.cpp:406
void SetDuration(double duration) override
Definition: Effect.cpp:744
wxWindow * mUIParent
Definition: Effect.h:472
double dtmfDutyCycle
Definition: DtmfGen.h:92
NumericTextCtrl * mDtmfDurationT
Definition: DtmfGen.h:98
bool EffectDtmf::TransferDataToWindow ( )
overridevirtual

Reimplemented from Effect.

Definition at line 369 of file DtmfGen.cpp.

References dtmfDutyCycle, Effect::GetDuration(), mDtmfDurationT, mDtmfDutyCycleS, Effect::mUIParent, Recalculate(), NumericTextCtrl::SetValue(), and UpdateUI().

370 {
371  Recalculate();
372 
373  if (!mUIParent->TransferDataToWindow())
374  {
375  return false;
376  }
377 
378  mDtmfDutyCycleS->SetValue(dtmfDutyCycle * SCL_DutyCycle);
379 
381 
382  UpdateUI();
383 
384  return true;
385 }
double GetDuration() override
Definition: Effect.cpp:724
wxSlider * mDtmfDutyCycleS
Definition: DtmfGen.h:97
void Recalculate()
Definition: DtmfGen.cpp:406
void UpdateUI()
Definition: DtmfGen.cpp:577
void SetValue(double newValue)
wxWindow * mUIParent
Definition: Effect.h:472
double dtmfDutyCycle
Definition: DtmfGen.h:92
NumericTextCtrl * mDtmfDurationT
Definition: DtmfGen.h:98
void EffectDtmf::UpdateUI ( void  )
private

Definition at line 577 of file DtmfGen.cpp.

References _(), dtmfDutyCycle, dtmfSilence, dtmfTone, mDtmfDutyT, mDtmfSilenceT, and mDtmfToneT.

Referenced by OnAmplitude(), OnDuration(), OnDutyCycle(), OnSequence(), and TransferDataToWindow().

578 {
579  mDtmfDutyT->SetLabel(wxString::Format(wxT("%.1f %%"), dtmfDutyCycle));
580  mDtmfDutyT->SetName(mDtmfDutyT->GetLabel()); // fix for bug 577 (NVDA/Narrator screen readers do not read static text in dialogs)
581 
582  mDtmfSilenceT->SetLabel(wxString::Format(_("%.0f ms"), dtmfTone * 1000.0));
583  mDtmfSilenceT->SetName(mDtmfSilenceT->GetLabel()); // fix for bug 577 (NVDA/Narrator screen readers do not read static text in dialogs)
584 
585  mDtmfToneT->SetLabel(wxString::Format(_("%.0f ms"), dtmfSilence * 1000.0));
586  mDtmfToneT->SetName(mDtmfToneT->GetLabel()); // fix for bug 577 (NVDA/Narrator screen readers do not read static text in dialogs)
587 }
wxStaticText * mDtmfToneT
Definition: DtmfGen.h:99
wxStaticText * mDtmfDutyT
Definition: DtmfGen.h:101
double dtmfSilence
Definition: DtmfGen.h:91
wxStaticText * mDtmfSilenceT
Definition: DtmfGen.h:100
_("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
double dtmfDutyCycle
Definition: DtmfGen.h:92
double dtmfTone
Definition: DtmfGen.h:90

Member Data Documentation

int EffectDtmf::curSeqPos
private

Definition at line 86 of file DtmfGen.h.

Referenced by ProcessBlock(), and ProcessInitialize().

sampleCount EffectDtmf::curTonePos
private

Definition at line 84 of file DtmfGen.h.

Referenced by ProcessBlock().

sampleCount EffectDtmf::diff
private

Definition at line 82 of file DtmfGen.h.

Referenced by ProcessBlock(), and ProcessInitialize().

double EffectDtmf::dtmfAmplitude
private
double EffectDtmf::dtmfDutyCycle
private
int EffectDtmf::dtmfNTones
private

Definition at line 89 of file DtmfGen.h.

Referenced by ProcessInitialize(), and Recalculate().

wxString EffectDtmf::dtmfSequence
private
double EffectDtmf::dtmfSilence
private

Definition at line 91 of file DtmfGen.h.

Referenced by PopulateOrExchange(), ProcessInitialize(), Recalculate(), and UpdateUI().

double EffectDtmf::dtmfTone
private

Definition at line 90 of file DtmfGen.h.

Referenced by PopulateOrExchange(), ProcessInitialize(), Recalculate(), and UpdateUI().

bool EffectDtmf::isTone
private

Definition at line 85 of file DtmfGen.h.

Referenced by ProcessBlock(), and ProcessInitialize().

wxTextCtrl* EffectDtmf::mDtmfAmplitudeT
private

Definition at line 96 of file DtmfGen.h.

Referenced by OnAmplitude().

NumericTextCtrl* EffectDtmf::mDtmfDurationT
private
wxSlider* EffectDtmf::mDtmfDutyCycleS
private

Definition at line 97 of file DtmfGen.h.

Referenced by PopulateOrExchange(), TransferDataFromWindow(), and TransferDataToWindow().

wxStaticText* EffectDtmf::mDtmfDutyT
private

Definition at line 101 of file DtmfGen.h.

Referenced by PopulateOrExchange(), and UpdateUI().

wxTextCtrl* EffectDtmf::mDtmfSequenceT
private

Definition at line 95 of file DtmfGen.h.

Referenced by OnSequence(), and PopulateOrExchange().

wxStaticText* EffectDtmf::mDtmfSilenceT
private

Definition at line 100 of file DtmfGen.h.

Referenced by PopulateOrExchange(), and UpdateUI().

wxStaticText* EffectDtmf::mDtmfToneT
private

Definition at line 99 of file DtmfGen.h.

Referenced by PopulateOrExchange(), and UpdateUI().

sampleCount EffectDtmf::numRemaining
private

Definition at line 83 of file DtmfGen.h.

Referenced by ProcessBlock(), and ProcessInitialize().

sampleCount EffectDtmf::numSamplesSequence
private

Definition at line 79 of file DtmfGen.h.

Referenced by ProcessInitialize().

sampleCount EffectDtmf::numSamplesSilence
private

Definition at line 81 of file DtmfGen.h.

Referenced by ProcessBlock(), and ProcessInitialize().

sampleCount EffectDtmf::numSamplesTone
private

Definition at line 80 of file DtmfGen.h.

Referenced by ProcessBlock(), and ProcessInitialize().


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