diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 613e998846..420af313de 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -735,8 +735,6 @@ Editor::Editor () TimeAxisView::CatchDeletion.connect (*this, invalidator (*this), ui_bind (&Editor::timeaxisview_deleted, this, _1), gui_context()); - _last_normalization_value = 0; - constructed = true; instant_save (); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 02320adb44..6ad076ffc1 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1104,7 +1104,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void reverse_region (); void strip_region_silence (); void normalize_region (); - double _last_normalization_value; void reset_region_scale_amplitude (); void adjust_region_scale_amplitude (bool up); void quantize_region (); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index ccab19516d..f84f8f5d34 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -81,6 +81,7 @@ #include "quantize_dialog.h" #include "interthread_progress_window.h" #include "insert_time_dialog.h" +#include "normalize_dialog.h" #include "i18n.h" @@ -4497,37 +4498,7 @@ Editor::normalize_region () return; } - Dialog dialog (rs.size() > 1 ? _("Normalize regions") : _("Normalize region")); - - VBox vbox; - vbox.set_spacing (6); - vbox.set_border_width (6); - - HBox hbox; - hbox.set_spacing (6); - hbox.set_border_width (6); - hbox.pack_start (*manage (new Label (_("Normalize to:")))); - SpinButton spin (0.2, 2); - spin.set_range (-112, 0); - spin.set_increments (0.1, 1); - spin.set_value (0); - hbox.pack_start (spin); - spin.set_value (_last_normalization_value); - hbox.pack_start (*manage (new Label (_("dbFS")))); - vbox.pack_start (hbox); - - CheckButton* normalize_across_all = manage (new CheckButton (_("Normalize across all selected regions"))); - vbox.pack_start (*normalize_across_all); - if (rs.size() <= 1) { - normalize_across_all->set_sensitive (false); - } - - vbox.show_all (); - - dialog.get_vbox()->set_spacing (12); - dialog.get_vbox()->pack_start (vbox); - dialog.add_button (Stock::CANCEL, RESPONSE_CANCEL); - dialog.add_button (_("Normalize"), RESPONSE_ACCEPT); + NormalizeDialog dialog (rs.size() > 1); if (dialog.run () == RESPONSE_CANCEL) { return; @@ -4538,14 +4509,23 @@ Editor::normalize_region () set_canvas_cursor (wait_cursor); gdk_flush (); + int tasks = rs.size (); + if (!dialog.normalize_individually()) { + tasks *= 2; + } + + int n = 0; + double maxamp = 0; - if (normalize_across_all->get_active ()) { + if (!dialog.normalize_individually()) { for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) { AudioRegionView* const arv = dynamic_cast (*r); if (!arv) { continue; } maxamp = max (maxamp, arv->audio_region()->maximum_amplitude ()); + dialog.set_progress (double (n) / tasks); + ++n; } } @@ -4556,16 +4536,17 @@ Editor::normalize_region () } arv->region()->clear_changes (); - double const amp = normalize_across_all->get_active() ? maxamp : arv->audio_region()->maximum_amplitude (); + double const amp = dialog.normalize_individually () ? arv->audio_region()->maximum_amplitude () : maxamp; - arv->audio_region()->normalize (amp, spin.get_value ()); + arv->audio_region()->normalize (amp, dialog.target ()); _session->add_command (new StatefulDiffCommand (arv->region())); + + dialog.set_progress (double (n) / tasks); + ++n; } commit_reversible_command (); set_canvas_cursor (current_canvas_cursor); - - _last_normalization_value = spin.get_value (); } diff --git a/gtk2_ardour/normalize_dialog.cc b/gtk2_ardour/normalize_dialog.cc new file mode 100644 index 0000000000..088c123433 --- /dev/null +++ b/gtk2_ardour/normalize_dialog.cc @@ -0,0 +1,94 @@ +/* + Copyright (C) 2010 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include +#include +#include +#include +#include "normalize_dialog.h" + +using namespace Gtk; + +double NormalizeDialog::_last_normalization_value = 0; + +NormalizeDialog::NormalizeDialog (bool more_than_one) + : ArdourDialog (more_than_one ? _("Normalize regions") : _("Normalize region")) + , _normalize_individually (0) +{ + get_vbox()->set_spacing (12); + + HBox* hbox = manage (new HBox); + hbox->set_spacing (6); + hbox->set_border_width (6); + hbox->pack_start (*manage (new Label (_("Normalize to:"))), false, false); + _spin = manage (new SpinButton (0.2, 2)); + _spin->set_range (-112, 0); + _spin->set_increments (0.1, 1); + _spin->set_value (_last_normalization_value); + hbox->pack_start (*_spin, false, false); + hbox->pack_start (*manage (new Label (_("dbFS"))), false, false); + get_vbox()->pack_start (*hbox); + + if (more_than_one) { + RadioButtonGroup group; + VBox* vbox = manage (new VBox); + + _normalize_individually = manage (new RadioButton (group, _("Normalize each region using its own peak value"))); + vbox->pack_start (*_normalize_individually); + RadioButton* b = manage (new RadioButton (group, _("Normalize each region using the peak value of all regions"))); + vbox->pack_start (*b); + + get_vbox()->pack_start (*vbox); + + _progress_bar = manage (new ProgressBar); + get_vbox()->pack_start (*_progress_bar); + } + + show_all (); + + add_button (Stock::CANCEL, RESPONSE_CANCEL); + add_button (_("Normalize"), RESPONSE_ACCEPT); +} + +bool +NormalizeDialog::normalize_individually () const +{ + if (_normalize_individually == 0) { + return false; + } + + return _normalize_individually->get_active (); +} + +double +NormalizeDialog::target () const +{ + return _spin->get_value (); +} + +void +NormalizeDialog::set_progress (double p) +{ + _progress_bar->set_fraction (p); + + while (gtk_events_pending()) { + gtk_main_iteration (); + } +} diff --git a/gtk2_ardour/normalize_dialog.h b/gtk2_ardour/normalize_dialog.h new file mode 100644 index 0000000000..38ad6d0bf3 --- /dev/null +++ b/gtk2_ardour/normalize_dialog.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2010 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "ardour_dialog.h" + +namespace Gtk { + class RadioButton; + class SpinButton; + class ProgressBar; +} + +class NormalizeDialog : public ArdourDialog +{ +public: + NormalizeDialog (bool); + + bool normalize_individually () const; + double target () const; + void set_progress (double); + +private: + Gtk::RadioButton* _normalize_individually; + Gtk::SpinButton* _spin; + Gtk::ProgressBar* _progress_bar; + + static double _last_normalization_value; +}; diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript index 2f003a615c..c15f5609e2 100644 --- a/gtk2_ardour/wscript +++ b/gtk2_ardour/wscript @@ -146,6 +146,7 @@ gtk2_ardour_sources = [ 'mixer_ui.cc', 'monitor_section.cc', 'nag.cc', + 'normalize_dialog.cc', 'note_player.cc', 'option_editor.cc', 'opts.cc',