diff --git a/include/audacity/EffectInterface.h b/include/audacity/EffectInterface.h index b859a966b..9907938e4 100644 --- a/include/audacity/EffectInterface.h +++ b/include/audacity/EffectInterface.h @@ -93,8 +93,8 @@ public: virtual ~EffectHostInterface() {}; virtual double GetDefaultDuration() = 0; - virtual double GetDuration() = 0; - virtual bool SetDuration(double seconds) = 0; + virtual double GetDuration(bool *isSelection = NULL) = 0; + virtual void SetDuration(double seconds) = 0; virtual bool Apply() = 0; virtual void Preview() = 0; diff --git a/src/effects/DtmfGen.cpp b/src/effects/DtmfGen.cpp index 47628b431..f91059638 100644 --- a/src/effects/DtmfGen.cpp +++ b/src/effects/DtmfGen.cpp @@ -98,6 +98,8 @@ int EffectDtmf::GetAudioOutCount() bool EffectDtmf::ProcessInitialize(sampleCount WXUNUSED(totalLen), ChannelNames WXUNUSED(chanMap)) { + double duration = GetDuration(); + // all dtmf sequence durations in samples from seconds // MJS: Note that mDuration is in seconds but will have been quantised to the units of the TTC. // If this was 'samples' and the project rate was lower than the track rate, @@ -105,7 +107,7 @@ bool EffectDtmf::ProcessInitialize(sampleCount WXUNUSED(totalLen), ChannelNames // However we are making our best efforts at creating what was asked for. sampleCount nT0 = (sampleCount)floor(mT0 * mSampleRate + 0.5); - sampleCount nT1 = (sampleCount)floor((mT0 + mDuration) * mSampleRate + 0.5); + sampleCount nT1 = (sampleCount)floor((mT0 + duration) * mSampleRate + 0.5); numSamplesSequence = nT1 - nT0; // needs to be exact number of samples selected //make under-estimates if anything, and then redistribute the few remaining samples @@ -279,17 +281,6 @@ void EffectDtmf::PopulateOrExchange(ShuttleGui & S) // value from saved config: this is useful is user wants to // replace selection with dtmf sequence - bool isSelection = false; - if (mT1 > mT0) { - // there is a selection: let's fit in there... - // MJS: note that this is just for the TTC and is independent of the track rate - // but we do need to make sure we have the right number of samples at the project rate - double quantMT0 = QUANTIZED_TIME(mT0, mProjectRate); - double quantMT1 = QUANTIZED_TIME(mT1, mProjectRate); - mDuration = quantMT1 - quantMT0; - isSelection = true; - } - S.AddSpace(0, 5); S.StartMultiColumn(2, wxCENTER); { @@ -301,17 +292,16 @@ void EffectDtmf::PopulateOrExchange(ShuttleGui & S) vldAmp.SetRange(MIN_Amplitude, MAX_Amplitude); S.AddTextBox(_("Amplitude (0-1):"), wxT(""), 10)->SetValidator(vldAmp); + bool isSelection; + double duration = GetDuration(&isSelection); + S.AddPrompt(_("Duration:")); mDtmfDurationT = new NumericTextCtrl(NumericConverter::TIME, S.GetParent(), wxID_ANY, - /* use this instead of "seconds" because if a selection is passed to the - * effect, I want it (mDuration) to be used as the duration, and with - * "seconds" this does not always work properly. For example, it rounds - * down to zero... */ isSelection ? _("hh:mm:ss + samples") : _("hh:mm:ss + milliseconds"), - mDuration, + duration, mProjectRate, wxDefaultPosition, wxDefaultSize, @@ -354,7 +344,8 @@ bool EffectDtmf::TransferDataToWindow() } mDtmfDutyS->SetValue(dtmfDutyCycle * SCL_DutyCycle); - mDtmfDurationT->SetValue(mDuration); + + mDtmfDurationT->SetValue(GetDuration()); UpdateUI(); @@ -369,7 +360,7 @@ bool EffectDtmf::TransferDataFromWindow() } dtmfDutyCycle = (double) mDtmfDutyS->GetValue() / SCL_DutyCycle; - mDuration = mDtmfDurationT->GetValue(); + SetDuration(mDtmfDurationT->GetValue()); // recalculate to make sure all values are up-to-date. This is especially // important if the user did not change any values in the dialog @@ -390,13 +381,13 @@ void EffectDtmf::Recalculate() // no tones, all zero: don't do anything // this should take care of the case where user got an empty // dtmf sequence into the generator: track won't be generated - mDuration = 0; + SetDuration(0.0); dtmfTone = 0; - dtmfSilence = mDuration; + dtmfSilence = 0; } else { if (dtmfNTones==1) { // single tone, as long as the sequence - dtmfTone = mDuration; + dtmfTone = GetDuration(); dtmfSilence = 0; } else { // Don't be fooled by the fact that you divide the sequence into dtmfNTones: @@ -408,7 +399,7 @@ void EffectDtmf::Recalculate() // which can be simplified in the one below. // Then just take the part that belongs to tone or silence. // - double slot = mDuration / ((double)dtmfNTones + (dtmfDutyCycle / 100.0) - 1); + double slot = GetDuration() / ((double)dtmfNTones + (dtmfDutyCycle / 100.0) - 1); dtmfTone = slot * (dtmfDutyCycle / 100.0); // seconds dtmfSilence = slot * (1.0 - (dtmfDutyCycle / 100.0)); // seconds @@ -571,7 +562,7 @@ void EffectDtmf::OnSlider(wxCommandEvent & evt) void EffectDtmf::OnText(wxCommandEvent & WXUNUSED(evt)) { - mDuration = mDtmfDurationT->GetValue(); + SetDuration(mDtmfDurationT->GetValue()); mUIParent->TransferDataFromWindow(); Recalculate(); UpdateUI(); diff --git a/src/effects/Effect.cpp b/src/effects/Effect.cpp index 501aba03c..0d6964287 100644 --- a/src/effects/Effect.cpp +++ b/src/effects/Effect.cpp @@ -646,26 +646,64 @@ double Effect::GetDefaultDuration() return 30.0; } -double Effect::GetDuration() +double Effect::GetDuration(bool *isSelection) { if (mT1 > mT0) { - return mT1 - mT0; + // there is a selection: let's fit in there... + // MJS: note that this is just for the TTC and is independent of the track rate + // but we do need to make sure we have the right number of samples at the project rate + double quantMT0 = QUANTIZED_TIME(mT0, mProjectRate); + double quantMT1 = QUANTIZED_TIME(mT1, mProjectRate); + mDuration = quantMT1 - quantMT0; + + if (isSelection) + { + *isSelection = true; + } + + return mDuration; + } + + if (isSelection) + { + *isSelection = false; + } + + GetPrivateConfig(GetCurrentSettingsGroup(), wxT("LastUsedDuration"), mDuration, 0.0); + if (mDuration > 0.0) + { + return mDuration; + } + + if (mDuration < 0.0) + { + mDuration = 0.0; } if (GetType() == EffectTypeGenerate) { - return GetDefaultDuration(); + mDuration = GetDefaultDuration(); } - return 0; + return mDuration; } -bool Effect::SetDuration(double seconds) +void Effect::SetDuration(double seconds) { + if (seconds < 0.0) + { + seconds = 0.0; + } + + if (mDuration != seconds) + { + SetPrivateConfig(GetCurrentSettingsGroup(), wxT("LastUsedDuration"), seconds); + } + mDuration = seconds; - return true; + return; } bool Effect::Apply() diff --git a/src/effects/Effect.h b/src/effects/Effect.h index 7cc7bbd07..52877c0cb 100644 --- a/src/effects/Effect.h +++ b/src/effects/Effect.h @@ -144,8 +144,8 @@ class AUDACITY_DLL_API Effect : public wxEvtHandler, // EffectHostInterface implementation virtual double GetDefaultDuration(); - virtual double GetDuration(); - virtual bool SetDuration(double duration); + virtual double GetDuration(bool *isSelection = NULL); + virtual void SetDuration(double duration); virtual bool Apply(); virtual void Preview(); @@ -344,7 +344,6 @@ protected: wxDialog *mUIDialog; wxWindow *mUIParent; - double mDuration; sampleCount mSampleCnt; // type of the tracks on mOutputTracks @@ -373,6 +372,8 @@ protected: private: wxWindow *mParent; + double mDuration; + wxArrayPtrVoid mIMap; wxArrayPtrVoid mOMap; diff --git a/src/effects/Generator.cpp b/src/effects/Generator.cpp index f1d97900a..265bab35a 100644 --- a/src/effects/Generator.cpp +++ b/src/effects/Generator.cpp @@ -23,7 +23,7 @@ bool Generator::Process() { - if (mDuration < 0.0) + if (GetDuration() < 0.0) return false; @@ -49,7 +49,7 @@ bool Generator::Process() //make sure there's room. if (!editClipCanMove && track->IsEmpty(mT0, mT1+1.0/track->GetRate()) && - !track->IsEmpty(mT0, mT0+mDuration-(mT1-mT0)-1.0/track->GetRate())) + !track->IsEmpty(mT0, mT0+GetDuration()-(mT1-mT0)-1.0/track->GetRate())) { wxMessageBox( _("There is not enough room available to generate the audio"), @@ -58,7 +58,7 @@ bool Generator::Process() return false; } - if (mDuration > 0.0) + if (GetDuration() > 0.0) { // Create a temporary track std::auto_ptr tmp( @@ -74,7 +74,7 @@ bool Generator::Process() else { // Transfer the data from the temporary track to the actual one tmp->Flush(); - SetTimeWarper(new StepTimeWarper(mT0+mDuration, mDuration-(mT1-mT0))); + SetTimeWarper(new StepTimeWarper(mT0+GetDuration(), GetDuration()-(mT1-mT0))); bGoodResult = track->ClearAndPaste(mT0, mT1, &*tmp, true, false, GetTimeWarper()); } @@ -94,7 +94,7 @@ bool Generator::Process() ntrack++; } else if (t->IsSyncLockSelected()) { - t->SyncLockAdjust(mT1, mT0 + mDuration); + t->SyncLockAdjust(mT1, mT0 + GetDuration()); } // Move on to the next track t = iter.Next(); @@ -104,7 +104,7 @@ bool Generator::Process() this->ReplaceProcessedTracks(bGoodResult); - mT1 = mT0 + mDuration; // Update selection. + mT1 = mT0 + GetDuration(); // Update selection. return true; } @@ -114,7 +114,7 @@ bool BlockGenerator::GenerateTrack(WaveTrack *tmp, int ntrack) { bool bGoodResult = true; - numSamples = track.TimeToLongSamples(mDuration); + numSamples = track.TimeToLongSamples(GetDuration()); sampleCount i = 0; float *data = new float[tmp->GetMaxBlockSize()]; sampleCount block = 0; diff --git a/src/effects/Noise.cpp b/src/effects/Noise.cpp index 7dc2a2930..2b19a43b3 100644 --- a/src/effects/Noise.cpp +++ b/src/effects/Noise.cpp @@ -56,7 +56,6 @@ EffectNoise::EffectNoise() { mType = DEF_Type; mAmp = DEF_Amp; - mDuration = GetDefaultDuration(); y = z = buf0 = buf1 = buf2 = buf3 = buf4 = buf5 = buf6 = 0; } @@ -222,18 +221,17 @@ void EffectNoise::PopulateOrExchange(ShuttleGui & S) FloatingPointValidator vldAmp(1, &mAmp, NUM_VAL_NO_TRAILING_ZEROES); vldAmp.SetRange(MIN_Amp, MAX_Amp); S.AddTextBox(_("Amplitude (0-1):"), wxT(""), 12)->SetValidator(vldAmp); - S.AddPrompt(_("Duration:")); + bool isSelection; + double duration = GetDuration(&isSelection); + + S.AddPrompt(_("Duration:")); mNoiseDurationT = new NumericTextCtrl(NumericConverter::TIME, S.GetParent(), wxID_ANY, - /* use this instead of "seconds" because if a selection is passed to - * the effect, I want it (nDuration) to be used as the duration, and - * with "seconds" this does not always work properly. For example, - * it rounds down to zero... */ - (mT1 > mT0) ? _("hh:mm:ss + samples") : _("hh:mm:ss + milliseconds"), - mDuration, + isSelection ? _("hh:mm:ss + samples") : _("hh:mm:ss + milliseconds"), + duration, mProjectRate, wxDefaultPosition, wxDefaultSize, @@ -252,7 +250,7 @@ bool EffectNoise::TransferDataToWindow() return false; } - mNoiseDurationT->SetValue(mDuration); + mNoiseDurationT->SetValue(GetDuration()); return true; } @@ -264,7 +262,7 @@ bool EffectNoise::TransferDataFromWindow() return false; } - mDuration = mNoiseDurationT->GetValue(); + SetDuration(mNoiseDurationT->GetValue()); return true; } diff --git a/src/effects/Silence.cpp b/src/effects/Silence.cpp index abc9c921c..490941db1 100644 --- a/src/effects/Silence.cpp +++ b/src/effects/Silence.cpp @@ -54,22 +54,22 @@ void EffectSilence::PopulateOrExchange(ShuttleGui & S) { S.StartHorizontalLay(); { + bool isSelection; + double duration = GetDuration(&isSelection); + S.AddPrompt(_("Duration:")); - if (S.GetMode() == eIsCreating) - { - mDurationT = new - NumericTextCtrl(NumericConverter::TIME, - S.GetParent(), - wxID_ANY, - (mT1 > mT0) ? _("hh:mm:ss + samples") : _("hh:mm:ss + milliseconds"), - mDuration, - mProjectRate, - wxDefaultPosition, - wxDefaultSize, - true); - mDurationT->SetName(_("Duration")); - mDurationT->EnableMenu(); - } + mDurationT = new + NumericTextCtrl(NumericConverter::TIME, + S.GetParent(), + wxID_ANY, + isSelection ? _("hh:mm:ss + samples") : _("hh:mm:ss + milliseconds"), + duration, + mProjectRate, + wxDefaultPosition, + wxDefaultSize, + true); + mDurationT->SetName(_("Duration")); + mDurationT->EnableMenu(); S.AddWindow(mDurationT, wxALIGN_CENTER | wxALL); } S.EndHorizontalLay(); @@ -81,14 +81,14 @@ void EffectSilence::PopulateOrExchange(ShuttleGui & S) bool EffectSilence::TransferDataToWindow() { - mDurationT->SetValue(mDuration); + mDurationT->SetValue(GetDuration()); return true; } bool EffectSilence::TransferDataFromWindow() { - mDuration = mDurationT->GetValue(); + SetDuration(mDurationT->GetValue()); return true; } @@ -97,7 +97,7 @@ bool EffectSilence::GenerateTrack(WaveTrack *tmp, const WaveTrack & WXUNUSED(track), int WXUNUSED(ntrack)) { - bool bResult = tmp->InsertSilence(0.0, mDuration); + bool bResult = tmp->InsertSilence(0.0, GetDuration()); wxASSERT(bResult); return bResult; } diff --git a/src/effects/ToneGen.cpp b/src/effects/ToneGen.cpp index 3b142f54b..76c45211c 100644 --- a/src/effects/ToneGen.cpp +++ b/src/effects/ToneGen.cpp @@ -388,13 +388,16 @@ void EffectToneGen::PopulateOrExchange(ShuttleGui & S) t->SetValidator(vldAmplitude); } + bool isSelection; + double duration = GetDuration(&isSelection); + S.AddPrompt(_("Duration:")); mToneDurationT = new NumericTextCtrl(NumericConverter::TIME, S.GetParent(), wxID_ANY, - (mT1 > mT0) ? _("hh:mm:ss + samples") : _("hh:mm:ss + milliseconds"), - mDuration, + isSelection ? _("hh:mm:ss + samples") : _("hh:mm:ss + milliseconds"), + duration, mProjectRate, wxDefaultPosition, wxDefaultSize, @@ -415,7 +418,7 @@ bool EffectToneGen::TransferDataToWindow() return false; } - mToneDurationT->SetValue(mDuration); + mToneDurationT->SetValue(GetDuration()); return true; } @@ -433,7 +436,7 @@ bool EffectToneGen::TransferDataFromWindow() mAmplitude[1] = mAmplitude[0]; } - mDuration = mToneDurationT->GetValue(); + SetDuration(mToneDurationT->GetValue()); return true; } diff --git a/src/effects/VST/VSTEffect.cpp b/src/effects/VST/VSTEffect.cpp index 2bc83bd94..30b6677b1 100644 --- a/src/effects/VST/VSTEffect.cpp +++ b/src/effects/VST/VSTEffect.cpp @@ -880,15 +880,15 @@ private: enum { - ID_DURATION = 20000, - ID_SLIDERS = 21000, + ID_Duration = 20000, + ID_Sliders = 21000, }; DEFINE_LOCAL_EVENT_TYPE(EVT_SIZEWINDOW); DEFINE_LOCAL_EVENT_TYPE(EVT_UPDATEDISPLAY); BEGIN_EVENT_TABLE(VSTEffect, wxEvtHandler) - EVT_COMMAND_RANGE(ID_SLIDERS, ID_SLIDERS + 999, wxEVT_COMMAND_SLIDER_UPDATED, VSTEffect::OnSlider) + EVT_COMMAND_RANGE(ID_Sliders, ID_Sliders + 999, wxEVT_COMMAND_SLIDER_UPDATED, VSTEffect::OnSlider) // Events from the audioMaster callback EVT_COMMAND(wxID_ANY, EVT_SIZEWINDOW, VSTEffect::OnSizeWindow) @@ -2207,6 +2207,16 @@ bool VSTEffect::IsGraphicalUI() bool VSTEffect::ValidateUI() { + if (!mParent->Validate() || !mParent->TransferDataFromWindow()) + { + return false; + } + + if (GetType() == EffectTypeGenerate) + { + mHost->SetDuration(mDuration->GetValue()); + } + return true; } @@ -3492,17 +3502,21 @@ void VSTEffect::BuildPlain() // Add the duration control for generators if (GetType() == EffectTypeGenerate) { + bool isSelection; + double duration = mHost->GetDuration(&isSelection); + wxControl *item = new wxStaticText(scroller, 0, _("Duration:")); gridSizer->Add(item, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 5); - mDuration = new NumericTextCtrl(NumericConverter::TIME, - scroller, - ID_DURATION, - _("hh:mm:ss + milliseconds"), - mHost->GetDuration(), - mSampleRate, - wxDefaultPosition, - wxDefaultSize, - true); + mDuration = new + NumericTextCtrl(NumericConverter::TIME, + scroller, + ID_Duration, + isSelection ? _("hh:mm:ss + samples") : _("hh:mm:ss + milliseconds"), + duration, + mSampleRate, + wxDefaultPosition, + wxDefaultSize, + true); mDuration->SetName(_("Duration")); mDuration->EnableMenu(); gridSizer->Add(mDuration, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); @@ -3543,7 +3557,7 @@ void VSTEffect::BuildPlain() gridSizer->Add(mNames[i], 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 5); mSliders[i] = new wxSlider(scroller, - ID_SLIDERS + i, + ID_Sliders + i, 0, 0, 1000, @@ -3644,7 +3658,7 @@ void VSTEffect::OnSizeWindow(wxCommandEvent & evt) void VSTEffect::OnSlider(wxCommandEvent & evt) { wxSlider *s = (wxSlider *) evt.GetEventObject(); - int i = s->GetId() - ID_SLIDERS; + int i = s->GetId() - ID_Sliders; callSetParameter(i, s->GetValue() / 1000.0); diff --git a/src/effects/ladspa/LadspaEffect.cpp b/src/effects/ladspa/LadspaEffect.cpp index b487b01ba..880380672 100644 --- a/src/effects/ladspa/LadspaEffect.cpp +++ b/src/effects/ladspa/LadspaEffect.cpp @@ -361,10 +361,10 @@ void LadspaEffectOptionsDialog::OnOk(wxCommandEvent & WXUNUSED(evt)) enum { - ID_DURATION = 20000, - ID_TOGGLES = 21000, - ID_SLIDERS = 22000, - ID_TEXTS = 23000, + ID_Duration = 20000, + ID_Toggles = 21000, + ID_Sliders = 22000, + ID_Texts = 23000, }; /////////////////////////////////////////////////////////////////////////////// @@ -374,9 +374,9 @@ enum /////////////////////////////////////////////////////////////////////////////// BEGIN_EVENT_TABLE(LadspaEffect, wxEvtHandler) - EVT_COMMAND_RANGE(ID_TOGGLES, ID_TOGGLES + 999, wxEVT_COMMAND_CHECKBOX_CLICKED, LadspaEffect::OnCheckBox) - EVT_COMMAND_RANGE(ID_SLIDERS, ID_SLIDERS + 999, wxEVT_COMMAND_SLIDER_UPDATED, LadspaEffect::OnSlider) - EVT_COMMAND_RANGE(ID_TEXTS, ID_TEXTS + 999, wxEVT_COMMAND_TEXT_UPDATED, LadspaEffect::OnTextCtrl) + EVT_COMMAND_RANGE(ID_Toggles, ID_Toggles + 999, wxEVT_COMMAND_CHECKBOX_CLICKED, LadspaEffect::OnCheckBox) + EVT_COMMAND_RANGE(ID_Sliders, ID_Sliders + 999, wxEVT_COMMAND_SLIDER_UPDATED, LadspaEffect::OnSlider) + EVT_COMMAND_RANGE(ID_Texts, ID_Texts + 999, wxEVT_COMMAND_TEXT_UPDATED, LadspaEffect::OnTextCtrl) END_EVENT_TABLE() LadspaEffect::LadspaEffect(const wxString & path, int index) @@ -1035,17 +1035,21 @@ bool LadspaEffect::PopulateUI(wxWindow *parent) // Add the duration control for generators if (GetType() == EffectTypeGenerate) { + bool isSelection; + double duration = mHost->GetDuration(&isSelection); + item = new wxStaticText(w, 0, _("Duration:")); gridSizer->Add(item, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 5); - mDuration = new NumericTextCtrl(NumericConverter::TIME, - w, - ID_DURATION, - _("hh:mm:ss + milliseconds"), - mHost->GetDuration(), - mSampleRate, - wxDefaultPosition, - wxDefaultSize, - true); + mDuration = new + NumericTextCtrl(NumericConverter::TIME, + w, + ID_Duration, + isSelection ? _("hh:mm:ss + samples") : _("hh:mm:ss + milliseconds"), + duration, + mSampleRate, + wxDefaultPosition, + wxDefaultSize, + true); mDuration->SetName(_("Duration")); mDuration->EnableMenu(); gridSizer->Add(mDuration, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); @@ -1071,7 +1075,7 @@ bool LadspaEffect::PopulateUI(wxWindow *parent) if (LADSPA_IS_HINT_TOGGLED(hint.HintDescriptor)) { - mToggles[p] = new wxCheckBox(w, ID_TOGGLES + p, wxT("")); + mToggles[p] = new wxCheckBox(w, ID_Toggles + p, wxT("")); mToggles[p]->SetName(labelText); mToggles[p]->SetValue(mInputControls[p] > 0); gridSizer->Add(mToggles[p], 0, wxALL, 5); @@ -1126,7 +1130,7 @@ bool LadspaEffect::PopulateUI(wxWindow *parent) // Don't specify a value at creation time. This prevents unwanted events // being sent to the OnTextCtrl() handler before the associated slider // has been created. - mFields[p] = new wxTextCtrl(w, ID_TEXTS + p); + mFields[p] = new wxTextCtrl(w, ID_Texts + p); mFields[p]->SetName(labelText); gridSizer->Add(mFields[p], 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); @@ -1149,7 +1153,7 @@ bool LadspaEffect::PopulateUI(wxWindow *parent) gridSizer->Add(1, 1, 0); } - mSliders[p] = new wxSlider(w, ID_SLIDERS + p, + mSliders[p] = new wxSlider(w, ID_Sliders + p, 0, 0, 1000, wxDefaultPosition, wxSize(200, -1)); @@ -1472,14 +1476,14 @@ void LadspaEffect::FreeInstance(LADSPA_Handle handle) void LadspaEffect::OnCheckBox(wxCommandEvent & evt) { - int p = evt.GetId() - ID_TOGGLES; + int p = evt.GetId() - ID_Toggles; mInputControls[p] = mToggles[p]->GetValue(); } void LadspaEffect::OnSlider(wxCommandEvent & evt) { - int p = evt.GetId() - ID_SLIDERS; + int p = evt.GetId() - ID_Sliders; float val; float lower = float(0.0); @@ -1516,7 +1520,7 @@ void LadspaEffect::OnSlider(wxCommandEvent & evt) void LadspaEffect::OnTextCtrl(wxCommandEvent & evt) { LadspaEffect *that = reinterpret_cast(this); - int p = evt.GetId() - ID_TEXTS; + int p = evt.GetId() - ID_Texts; float val; float lower = float(0.0); diff --git a/src/effects/lv2/LV2Effect.cpp b/src/effects/lv2/LV2Effect.cpp index 0504f972b..75351a134 100644 --- a/src/effects/lv2/LV2Effect.cpp +++ b/src/effects/lv2/LV2Effect.cpp @@ -1078,7 +1078,7 @@ bool LV2Effect::ValidateUI() if (GetType() == EffectTypeGenerate) { - mHost->SetDuration(/* ... */ 0.0 /* ... */ ); + mHost->SetDuration(mDuration->GetValue()); } return true; @@ -1481,17 +1481,21 @@ bool LV2Effect::BuildPlain() wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL); + bool isSelection; + double duration = mHost->GetDuration(&isSelection); + wxWindow *item = new wxStaticText(w, 0, _("&Duration:")); sizer->Add(item, 0, wxALIGN_CENTER | wxALL, 5); - mDuration = new NumericTextCtrl(NumericConverter::TIME, - w, - ID_Duration, - _("hh:mm:ss + milliseconds"), - mHost->GetDuration(), - mSampleRate, - wxDefaultPosition, - wxDefaultSize, - true); + mDuration = new + NumericTextCtrl(NumericConverter::TIME, + w, + ID_Duration, + isSelection ? _("hh:mm:ss + samples") : _("hh:mm:ss + milliseconds"), + duration, + mSampleRate, + wxDefaultPosition, + wxDefaultSize, + true); mDuration->SetName(_("Duration")); mDuration->EnableMenu(); sizer->Add(mDuration, 0, wxALIGN_CENTER | wxALL, 5);