📄 ladspaeffect.cpp
字号:
if (right && outputs > 1) { for (i = 0; i < block; i++) buffer[i] = fOutBuffer[1][i]; right->Set((samplePtr)buffer, floatSample, rs, block); } len -= block; ls += block; rs += block; if (inputs > 1) { if (TrackGroupProgress(count, (ls-lstart)/(double)originalLen)) return false; } else { if (TrackProgress(count, (ls-lstart)/(double)originalLen)) return false; } } if (mData->deactivate) mData->deactivate(handle); if (mData->cleanup) mData->cleanup(handle); return true;}void LadspaEffect::End(){ if (buffer) { unsigned long i; delete[]buffer; for (i = 0; i < inputs; i++) { delete fInBuffer[i]; } for (i = 0; i < outputs; i++) { delete fOutBuffer[i]; } delete[] fInBuffer; delete[] fOutBuffer; } buffer = NULL; fInBuffer = NULL; fOutBuffer = NULL;}const int LADSPA_SLIDER_ID = 13100;const int LADSPA_TEXTCTRL_ID = 13101;const int LADSPA_PREVIEW_ID = 13102;BEGIN_EVENT_TABLE(LadspaEffectDialog, wxDialog) EVT_BUTTON(wxID_OK, LadspaEffectDialog::OnOK) EVT_BUTTON(wxID_CANCEL, LadspaEffectDialog::OnCancel) EVT_BUTTON(LADSPA_PREVIEW_ID, LadspaEffectDialog::OnPreview) EVT_SLIDER(LADSPA_SLIDER_ID, LadspaEffectDialog::OnSlider) EVT_TEXT(LADSPA_TEXTCTRL_ID, LadspaEffectDialog::OnTextCtrl)END_EVENT_TABLE()IMPLEMENT_CLASS(LadspaEffectDialog, wxDialog)LadspaEffectDialog::LadspaEffectDialog(LadspaEffect *eff, wxWindow * parent, const LADSPA_Descriptor *data, float *inputControls, int sampleRate) :wxDialog(parent, -1, LAT1CTOWX(data->Name), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE), effect(eff){ numParams = 0; this->mData = data; this->inputControls = inputControls; this->sampleRate = sampleRate; #ifdef __WXMSW__ // On Windows, for some reason, wxWindows calls OnTextCtrl during creation // of the text control, and LadspaEffectDialog::OnTextCtrl calls HandleText, // which assumes all the fields have been initialized. // This can give us a bad pointer crash, so manipulate inSlider to // no-op HandleText during creation. inSlider = true; #else inSlider = false; #endif inText = false; targetSlider = NULL; sliders = new wxSlider*[mData->PortCount]; fields = new wxTextCtrl*[mData->PortCount]; labels = new wxStaticText*[mData->PortCount]; ports = new unsigned long [mData->PortCount]; unsigned long p; for(p=0; p<mData->PortCount; p++) { LADSPA_PortDescriptor d = mData->PortDescriptors[p]; if (LADSPA_IS_PORT_CONTROL(d) && LADSPA_IS_PORT_INPUT(d)) { ports[numParams] = p; numParams++; } } wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL); wxControl *item; if (mData->Maker && mData->Maker[0] && LAT1CTOWX(mData->Maker) != wxString(_("None"))) { item = new wxStaticText(this, 0, wxString(_("Author: "))+LAT1CTOWX(mData->Maker)); mainSizer->Add(item, 0, wxALL, 5); } if (mData->Copyright && mData->Copyright[0] && LAT1CTOWX(mData->Copyright) != wxString(_("None"))) { item = new wxStaticText(this, 0, LAT1CTOWX(mData->Copyright)); mainSizer->Add(item, 0, wxALL, 5); } wxSizer *paramSizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, _("Effect Settings")), wxVERTICAL ); wxFlexGridSizer *gridSizer = new wxFlexGridSizer(3, 0, 0); for (p = 0; p < numParams; p++) { item = new wxStaticText(this, 0, wxString(mData->PortNames[ports[p]], wxConvISO8859_1)); gridSizer->Add(item, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); wxString fieldText; LADSPA_PortRangeHint hint = mData->PortRangeHints[ports[p]]; if (LADSPA_IS_HINT_INTEGER(hint.HintDescriptor)) fieldText.Printf(wxT("%d"), (int)(inputControls[ports[p]] + 0.5)); else fieldText.Printf(wxT("%f"), inputControls[ports[p]]); fields[p] = new wxTextCtrl(this, LADSPA_TEXTCTRL_ID, fieldText); gridSizer->Add(fields[p], 0, wxALL, 5); sliders[p] = new wxSlider(this, LADSPA_SLIDER_ID, 0, 0, 1000, wxDefaultPosition, wxSize(200, -1)); gridSizer->Add(sliders[p], 0, wxALL, 5); } // Set all of the sliders based on the value in the // text fields inSlider = false; // Now we're ready for HandleText to actually do something. HandleText(); paramSizer->Add(gridSizer, 1, wxALL, 5); mainSizer->Add(paramSizer, 1, wxALL, 5); wxBoxSizer *okSizer = new wxBoxSizer(wxHORIZONTAL); wxButton *button; button = new wxButton(this, LADSPA_PREVIEW_ID, effect->GetPreviewName()); okSizer->Add(button, 0, wxALIGN_CENTRE | wxALL, 5); button = new wxButton(this, wxID_CANCEL, _("Cancel")); okSizer->Add(button, 0, wxALIGN_CENTRE | wxALL, 5); button = new wxButton(this, wxID_OK, _("OK")); button->SetDefault(); button->SetFocus(); okSizer->Add(button, 0, wxALIGN_CENTRE | wxALL, 5); mainSizer->Add(okSizer, 0, wxALIGN_CENTRE | wxALL, 5); SetAutoLayout(TRUE); SetSizer(mainSizer); mainSizer->Fit(this); mainSizer->SetSizeHints(this);}LadspaEffectDialog::~LadspaEffectDialog(){ delete[]sliders; delete[]fields; delete[]labels;}void LadspaEffectDialog::OnSlider(wxCommandEvent &event){ targetSlider = (wxSlider *)event.GetEventObject(); HandleSlider(); targetSlider = NULL;}void LadspaEffectDialog::OnTextCtrl(wxCommandEvent & WXUNUSED(event)){ HandleText();}void LadspaEffectDialog::HandleSlider(){ // if we don't add the following three lines, changing // the value of the slider will change the text, which // will change the slider, and so on. This gets rid of // the implicit loop. if (inText) return; inSlider = true; for (unsigned long p = 0; p < numParams; p++) { if (targetSlider && targetSlider!=sliders[p]) continue; float val; float lower = float(0.0); float upper = float(10.0); float range; LADSPA_PortRangeHint hint = mData->PortRangeHints[ports[p]]; if (LADSPA_IS_HINT_BOUNDED_BELOW(hint.HintDescriptor)) lower = hint.LowerBound; if (LADSPA_IS_HINT_BOUNDED_ABOVE(hint.HintDescriptor)) upper = hint.UpperBound; if (LADSPA_IS_HINT_SAMPLE_RATE(hint.HintDescriptor)) { lower *= sampleRate; upper *= sampleRate; } range = upper - lower; val = (sliders[p]->GetValue() / 1000.0) * range + lower; wxString str; if (LADSPA_IS_HINT_INTEGER(hint.HintDescriptor)) str.Printf(wxT("%d"), (int)(val + 0.5)); else str.Printf(wxT("%f"), val); fields[p]->SetValue(str); inputControls[ports[p]] = val; } inSlider = false;}void LadspaEffectDialog::HandleText(){ // if we don't add the following three lines, changing // the value of the slider will change the text, which // will change the slider, and so on. This gets rid of // the implicit loop. if (inSlider) return; inText = true; for (unsigned long p = 0; p < numParams; p++) { double dval; float val; float lower = float(0.0); float upper = float(10.0); float range; fields[p]->GetValue().ToDouble(&dval); val = dval; LADSPA_PortRangeHint hint = mData->PortRangeHints[ports[p]]; if (LADSPA_IS_HINT_BOUNDED_BELOW(hint.HintDescriptor)) lower = hint.LowerBound; if (LADSPA_IS_HINT_BOUNDED_ABOVE(hint.HintDescriptor)) upper = hint.UpperBound; if (LADSPA_IS_HINT_SAMPLE_RATE(hint.HintDescriptor)) { lower *= sampleRate; upper *= sampleRate; } range = upper - lower; if (val < lower) val = lower; if (val > upper) val = upper; inputControls[ports[p]] = val; sliders[p]->SetValue((int)(((val-lower)/range) * 1000.0 + 0.5)); } inText = false;}void LadspaEffectDialog::OnOK(wxCommandEvent & WXUNUSED(event)){ EndModal(TRUE);}void LadspaEffectDialog::OnCancel(wxCommandEvent & WXUNUSED(event)){ EndModal(FALSE);}void LadspaEffectDialog::OnPreview(wxCommandEvent & WXUNUSED(event)){ effect->Preview();}// Indentation settings for Vim and Emacs and unique identifier for Arch, a// version control system. Please do not modify past this point.//// Local Variables:// c-basic-offset: 3// indent-tabs-mode: nil// End://// vim: et sts=3 sw=3// arch-tag: 7e4a0346-c3ec-45de-9f71-818c6e34a094
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -