1 /**********************************************************************
2 
3   Audacity: A Digital Audio Editor
4 
5   ChangeSpeed.h
6 
7   Vaughan Johnson, Dominic Mazzoni
8 
9   Change Speed effect, that affects both pitch & tempo.
10 
11 **********************************************************************/
12 
13 #ifndef __AUDACITY_EFFECT_CHANGESPEED__
14 #define __AUDACITY_EFFECT_CHANGESPEED__
15 
16 #include "Effect.h"
17 
18 class wxSlider;
19 class wxChoice;
20 class wxTextCtrl;
21 class NumericTextCtrl;
22 class ShuttleGui;
23 
24 class EffectChangeSpeed final : public Effect
25 {
26 public:
27    static const ComponentInterfaceSymbol Symbol;
28 
29    EffectChangeSpeed();
30    virtual ~EffectChangeSpeed();
31 
32    // ComponentInterface implementation
33 
34    ComponentInterfaceSymbol GetSymbol() override;
35    TranslatableString GetDescription() override;
36    ManualPageID ManualPage() override;
37 
38    // EffectDefinitionInterface implementation
39 
40    EffectType GetType() override;
41 
42    // EffectClientInterface implementation
43 
44    bool DefineParams( ShuttleParams & S ) override;
45    bool GetAutomationParameters(CommandParameters & parms) override;
46    bool SetAutomationParameters(CommandParameters & parms) override;
47    bool LoadFactoryDefaults() override;
48 
49    // Effect implementation
50 
51    bool CheckWhetherSkipEffect() override;
52    double CalcPreviewInputLength(double previewLength) override;
53    bool Startup() override;
54    bool Init() override;
55    bool Process() override;
56    void PopulateOrExchange(ShuttleGui & S) override;
57    bool TransferDataFromWindow() override;
58    bool TransferDataToWindow() override;
59 
60 private:
61    // EffectChangeSpeed implementation
62 
63    bool ProcessOne(WaveTrack *t, sampleCount start, sampleCount end);
64    bool ProcessLabelTrack(LabelTrack *t);
65 
66    // handlers
67    void OnText_PercentChange(wxCommandEvent & evt);
68    void OnText_Multiplier(wxCommandEvent & evt);
69    void OnSlider_PercentChange(wxCommandEvent & evt);
70    void OnChoice_Vinyl(wxCommandEvent & evt);
71    void OnTimeCtrl_ToLength(wxCommandEvent & evt);
72    void OnTimeCtrlUpdate(wxCommandEvent & evt);
73 
74    // helper functions
75    void Update_Text_PercentChange();   // Update control per current m_PercentChange.
76    void Update_Text_Multiplier();      // Update control per current m_PercentChange.
77    void Update_Slider_PercentChange(); // Update control per current m_PercentChange.
78    void Update_Vinyl();                // Update Vinyl controls for NEW percent change.
79    void Update_TimeCtrl_ToLength();    // Update target length controls for NEW percent change.
80    void UpdateUI();                    // Enable / disable OK / preview.
81 
82 private:
83    // track related
84    int    mCurTrackNum;
85    double mMaxNewLength;
86    double mCurT0;
87    double mCurT1;
88 
89    // control values
90    double   m_PercentChange;  // percent change to apply to tempo
91                               // -100% is meaningless, but sky's the upper limit.
92                               // Slider is (-100, 200], but textCtrls can set higher.
93    int      mFromVinyl;       // from standard vinyl speed (RPM) enum
94    double   mFactor;          // scale factor calculated from percent change
95    double   mFromLength;      // current selection length
96    int      mTimeCtrlFormat;  // time control format index number
97    double   mMultiplier;
98 
99    bool mbLoopDetect;
100 
101    // controls
102    wxTextCtrl *      mpTextCtrl_PercentChange;
103    wxTextCtrl *      mpTextCtrl_Multiplier;
104    wxSlider *        mpSlider_PercentChange;
105    wxChoice *        mpChoice_FromVinyl;
106    wxChoice *        mpChoice_ToVinyl;
107    NumericTextCtrl * mpFromLengthCtrl;
108    NumericTextCtrl * mpToLengthCtrl;
109    double mRate;
110 
111    // private effect parameters
112    int      mToVinyl;         // to standard vinyl speed (rpm)
113    double   mToLength;        // target length of selection
114    NumericFormatSymbol mFormat;          // time control format
115 
116    DECLARE_EVENT_TABLE()
117 };
118 
119 #endif // __AUDACITY_EFFECT_CHANGESPEED__
120