⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 changelength.cpp

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 CPP
字号:
/**********************************************************************  Audacity: A Digital Audio Editor  ChangeLength.cpp  Lynn Allan (from DM's Normalize)  Note: Only works on complete mono track for now**********************************************************************/#include <wx/wx.h>#include <math.h>#include "../Prefs.h"#include "../Project.h"#include "ChangeLength.h"EffectChangeLength::EffectChangeLength() : mUserPrompted(false){   Init();}bool EffectChangeLength::Init(){   mFromLength = mT1 - mT0;;	   //bool flag = gPrefs->Read(wxT("/CsPresets/ChangeLengthTo"), &mToLength, mFromLength);   //TODO: Presets ONLY if enabled in preferences. (and remove Cs prefix)   gPrefs->Read(wxT("/CsPresets/ChangeLengthTo"), &mToLength, mFromLength);   return true;}bool EffectChangeLength::CheckWhetherSkipEffect(){   bool rc = true;   return rc;}void EffectChangeLength::End(){}bool EffectChangeLength::PromptUser(){   ChangeLengthDialog dlog(mParent, -1, _("Change Length"));   dlog.mToLength = mToLength;   dlog.mFromLength = mFromLength;   dlog.TransferDataToWindow();   dlog.CentreOnParent();   dlog.ShowModal();   if (!dlog.GetReturnCode()) {      return false;   }   mUserPrompted = true;   mToLength = dlog.mToLength;   gPrefs->Write(wxT("/CsPresets/ChangeLengthTo"), mToLength);      return true;}bool EffectChangeLength::TransferParameters( Shuttle & shuttle ){  // shuttle.TransferInt(_(""),,0);   return true;}bool EffectChangeLength::Process(){   TrackListIterator iter(mWaveTracks);   mTrack = (WaveTrack *) iter.First();   mUserPrompted = false;   return true;}//----------------------------------------------------------------------------// ChangeLengthDialog//----------------------------------------------------------------------------#define ID_CHANGE_LENGTH_FROM_TEXT   7000#define ID_CHANGE_LENGTH_TO_TEXT 7001#define ID_PERCENT_CHANGE_TEXT 7002#define ID_TO_RANGE_TEXT 7003#define ID_BUTTON_RECALCULATE 7004BEGIN_EVENT_TABLE(ChangeLengthDialog,wxDialog)   EVT_BUTTON( wxID_OK, ChangeLengthDialog::OnOk )   EVT_BUTTON( wxID_CANCEL, ChangeLengthDialog::OnCancel )   EVT_TEXT(ID_CHANGE_LENGTH_TO_TEXT, ChangeLengthDialog::OnText_ToLength)	EVT_BUTTON(ID_BUTTON_RECALCULATE, ChangeLengthDialog::OnRecalculate)END_EVENT_TABLE()ChangeLengthDialog::ChangeLengthDialog(wxWindow *parent, wxWindowID id, const wxString &title) :   wxDialog( parent, id, title ){//   wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);   wxBoxSizer * pBoxSizer_Dialog = new wxBoxSizer(wxVERTICAL);   wxStaticText *statText = new wxStaticText(this, -1,                            _("Change Length by Lynn Allan\n"                             "Make shorter or longer by up to +/- 10%\n"                             "to fit certain number of minutes\n"));   pBoxSizer_Dialog->Add(statText, 0, wxALIGN_CENTRE | wxALL, 5);   pBoxSizer_Dialog->Add(0, 4, 0); // spacer   wxBoxSizer * pBoxSizer_ToLength = new wxBoxSizer(wxHORIZONTAL);   statText = new wxStaticText(this, -1, _("Desired Length (minutes): "),									       wxDefaultPosition, wxDefaultSize, 0);   pBoxSizer_ToLength->Add(statText, 0, 									wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 4);   m_pTextCtrl_ToLength =       new wxTextCtrl(this, ID_CHANGE_LENGTH_TO_TEXT, _("0.0"), 								wxDefaultPosition, wxSize(48, -1), 0,								wxTextValidator(wxFILTER_NUMERIC));   pBoxSizer_ToLength->Add(m_pTextCtrl_ToLength, 0, 								wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxALL, 4);   pBoxSizer_Dialog->Add(pBoxSizer_ToLength, 0, wxALIGN_CENTER | wxALL, 4);   wxStaticBoxSizer *infoGroup = new wxStaticBoxSizer(new wxStaticBox(this, -1, _("Information")), wxVERTICAL);   wxBoxSizer * pBoxSizer_FromLength = new wxBoxSizer(wxHORIZONTAL);   statText = new wxStaticText(this, -1, _("Current Length (minutes): "),									       wxDefaultPosition, wxDefaultSize, 0);   pBoxSizer_FromLength->Add(statText, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 4);   m_pTextCtrl_FromLength = 		new wxTextCtrl(this, ID_CHANGE_LENGTH_FROM_TEXT, _("0.0"), 							wxDefaultPosition, wxSize(48, -1), 							wxTE_READONLY); // Read only because it's from the selection.							// No validator because it's read only.   pBoxSizer_FromLength->Add(m_pTextCtrl_FromLength, 0, 									wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxALL, 4);   infoGroup->Add(pBoxSizer_FromLength, 0, wxALIGN_CENTER | wxALL, 4);   infoGroup->Add(0, 4, 0); // spacer   wxBoxSizer * pBoxSizer_Range = new wxBoxSizer(wxHORIZONTAL);   statText = new wxStaticText(this, -1, _("Allowed Range: "),									       wxDefaultPosition, wxDefaultSize, 0);   pBoxSizer_Range->Add(statText, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 4);   m_pTextCtrl_ToRange = 		new wxTextCtrl(this, ID_TO_RANGE_TEXT, _("90% to 110%"), 							wxDefaultPosition, wxSize(90, -1), 							wxTE_READONLY); // Read only because it's from the selection.							// No validator because it's read only.   pBoxSizer_Range->Add(m_pTextCtrl_ToRange, 0, 									wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxALL, 4);   infoGroup->Add(pBoxSizer_Range, 0, wxALIGN_CENTER | wxALL, 4);   infoGroup->Add(0, 4, 0); // spacer	// Group percent controls with spacers, 	// rather than static box, so they don't look isolated.   pBoxSizer_Dialog->Add(0, 4, 0); // spacer   wxBoxSizer * pBoxSizer_PercentChange = new wxBoxSizer(wxHORIZONTAL);   statText = new wxStaticText(this, -1, _("Percent Change:"),												wxDefaultPosition, wxDefaultSize, 0);   pBoxSizer_PercentChange->Add(statText, 0, 											wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 4);   m_pTextCtrl_PercentChange = 		new wxTextCtrl(this, ID_PERCENT_CHANGE_TEXT, _("0.0"), 							wxDefaultPosition, wxSize(40, -1), wxTE_READONLY);   pBoxSizer_PercentChange->Add(m_pTextCtrl_PercentChange, 0, 											wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxALL, 4);   infoGroup->Add(pBoxSizer_PercentChange, 0, wxALIGN_CENTER | wxALL, 4);   pBoxSizer_Dialog->Add(infoGroup, 0, wxALIGN_CENTER | wxALL, 4);   wxBoxSizer * pBoxSizer_Controls = new wxBoxSizer(wxHORIZONTAL);   wxButton *recalculate = new wxButton(this, ID_BUTTON_RECALCULATE, _("Recalculate"));   pBoxSizer_Controls->Add(recalculate, 0, wxALIGN_CENTRE|wxALL, 5);   wxButton *cancel = new wxButton(this, wxID_CANCEL, _("Cancel"));   pBoxSizer_Controls->Add(cancel, 0, wxALIGN_CENTRE|wxALL, 5);   wxButton *ok = new wxButton(this, wxID_OK, _("OK"));   ok->SetDefault();   ok->SetFocus();   pBoxSizer_Controls->Add(ok, 0, wxALIGN_CENTRE|wxALL, 5);   pBoxSizer_Dialog->Add(pBoxSizer_Controls, 0, wxALIGN_CENTRE|wxALIGN_CENTER_VERTICAL|wxALL, 5);   SetAutoLayout(true);   SetSizer(pBoxSizer_Dialog);   pBoxSizer_Dialog->Fit(this);   pBoxSizer_Dialog->SetSizeHints(this);}bool ChangeLengthDialog::TransferDataToWindow(){   m_pTextCtrl_FromLength->SetValue(wxString::Format(wxT("%.1f"), (mFromLength / 60.0)));   double percentChange = ((mToLength - mFromLength) / mFromLength) * 100.0;   if (percentChange > 10.0) {      mToLength = mFromLength * 1.10;      percentChange = 10.0;   }   if (percentChange < -10.0) {      mToLength = mFromLength * 0.90;      percentChange = -10.0;   }   m_pTextCtrl_ToRange->SetValue(wxString::Format(_("%.1f to %.1f"),           ((mFromLength * 0.90) / 60.0), ((mFromLength * 1.10) / 60.0)));   m_pTextCtrl_PercentChange->SetValue(wxString::Format(wxT("%.1f"), percentChange));   m_pTextCtrl_ToLength->SetValue(wxString::Format(wxT("%.1f"), (mToLength / 60.0)));   return true;}bool ChangeLengthDialog::TransferDataFromWindow(){   double minutes;   m_pTextCtrl_ToLength->GetValue().ToDouble(&minutes);   mToLength = minutes * 60.0;   return true;}void ChangeLengthDialog::OnText_ToLength(wxCommandEvent & event){   return;   if (m_pTextCtrl_ToLength) {      wxString str = m_pTextCtrl_ToLength->GetValue();      double newValue = 0.0;      str.ToDouble(&newValue);		mToLength = newValue;		mPercentChange = ((mToLength - mFromLength) / mFromLength) * 100.0;   }}void ChangeLengthDialog::OnRecalculate(wxCommandEvent &event){   TransferDataFromWindow();   TransferDataToWindow();}void ChangeLengthDialog::OnOk(wxCommandEvent &event){   TransferDataFromWindow();   EndModal(true);}void ChangeLengthDialog::OnCancel(wxCommandEvent &event){   EndModal(false);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -