audacia/src/effects/ChangeLength.cpp

256 lines
8.4 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
ChangeLength.cpp
Lynn Allan (from DM's Normalize)
Note: Only works on complete mono track for now
*******************************************************************//**
\class EffectChangeLength
\brief An Effect.
*//****************************************************************//**
\class ChangeLengthDialog
\brief Dialog used with EffectChangeLength
*//*******************************************************************/
#include <wx/wx.h>
#include <math.h>
#include "../Prefs.h"
#include "../Project.h"
#include "ChangeLength.h"
EffectChangeLength::EffectChangeLength()
{
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, wxT("Change Length"));
dlog.mToLength = mToLength;
dlog.mFromLength = mFromLength;
dlog.TransferDataToWindow();
dlog.CentreOnParent();
dlog.ShowModal();
if (!dlog.GetReturnCode()) {
return false;
}
mToLength = dlog.mToLength;
gPrefs->Write(wxT("/CsPresets/ChangeLengthTo"), mToLength);
return true;
}
bool EffectChangeLength::TransferParameters( Shuttle & shuttle )
{
// shuttle.TransferInt(wxT(""),,0);
return true;
}
bool EffectChangeLength::Process()
{
TrackListOfKindIterator iter(Track::Wave, mTracks);
mTrack = (WaveTrack *) iter.First();
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 7004
BEGIN_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,
wxT("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, wxT("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, wxT("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, wxT("Information")), wxVERTICAL);
wxBoxSizer * pBoxSizer_FromLength = new wxBoxSizer(wxHORIZONTAL);
statText = new wxStaticText(this, -1, wxT("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, wxT("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, wxT("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, wxT("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, wxT("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, wxT("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, wxT("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();
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(wxT("%.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);
}