From eeae6aec340d74eba7f5d00e450cbe47afcf0ec0 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 27 Feb 2009 01:20:25 +0000 Subject: Split TimeFXDialog from Editor. git-svn-id: svn://localhost/ardour2/branches/3.0@4698 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/SConscript | 1 + gtk2_ardour/editor.h | 190 +++++++++++++++++------------------------ gtk2_ardour/editor_timefx.cc | 131 +--------------------------- gtk2_ardour/region_selection.h | 5 +- gtk2_ardour/time_fx_dialog.cc | 189 ++++++++++++++++++++++++++++++++++++++++ gtk2_ardour/time_fx_dialog.h | 69 +++++++++++++++ gtk2_ardour/wscript | 1 + 7 files changed, 343 insertions(+), 243 deletions(-) create mode 100644 gtk2_ardour/time_fx_dialog.cc create mode 100644 gtk2_ardour/time_fx_dialog.h diff --git a/gtk2_ardour/SConscript b/gtk2_ardour/SConscript index 0a9d852b2c..61897275e4 100644 --- a/gtk2_ardour/SConscript +++ b/gtk2_ardour/SConscript @@ -248,6 +248,7 @@ tempo_lines.cc theme_manager.cc time_axis_view.cc time_axis_view_item.cc +time_fx_dialog.cc time_selection.cc ui_config.cc utils.cc diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 571b612294..8f3e60d9e1 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -88,30 +88,31 @@ namespace LADSPA { class Plugin; } -class TimeAxisView; +class AnalysisWindow; +class AudioRegionView; +class AudioStreamView; class AudioTimeAxisView; +class AutomationLine; +class AutomationSelection; class AutomationTimeAxisView; -class AudioRegionView; +class BundleManager; +class ControlPoint; class CrossfadeView; -class PluginSelector; -class PlaylistSelector; -class Marker; +class GlobalPortMatrixWindow; class GroupedButtons; -class AutomationLine; +class Marker; +class MixerStrip; +class PlaylistSelector; +class PluginSelector; +class RhythmFerret; class Selection; +class SoundFileOmega; +class StreamView; class TempoLines; +class TimeAxisView; +class TimeFXDialog; class TimeSelection; class TrackSelection; -class AutomationSelection; -class MixerStrip; -class StreamView; -class AudioStreamView; -class ControlPoint; -class SoundFileOmega; -class RhythmFerret; -class AnalysisWindow; -class BundleManager; -class GlobalPortMatrixWindow; /* */ class ImageFrameView; @@ -133,7 +134,7 @@ class Editor : public PublicEditor void connect_to_session (ARDOUR::Session *); ARDOUR::Session* current_session() const { return session; } void first_idle (); - virtual bool have_idled() const { return _have_idled; } + virtual bool have_idled () const { return _have_idled; } nframes64_t leftmost_position() const { return leftmost_frame; } nframes64_t current_page_frames() const { @@ -264,6 +265,7 @@ class Editor : public PublicEditor bool show_measures () const { return _show_measures; } /* analysis window */ + void analyze_region_selection(); void analyze_range_selection(); @@ -277,9 +279,9 @@ class Editor : public PublicEditor void add_toplevel_controls (Gtk::Container&); Gtk::HBox& get_status_bar_packer() { return status_bar_hpacker; } - void set_zoom_focus (Editing::ZoomFocus); + void set_zoom_focus (Editing::ZoomFocus); Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; } - double get_current_zoom () const { return frames_per_unit; } + double get_current_zoom () const { return frames_per_unit; } void temporal_zoom_step (bool coarser); @@ -337,8 +339,8 @@ class Editor : public PublicEditor void video_pullup_chosen (ARDOUR::Session::PullupFormat pullup); void subframes_per_frame_chosen (uint32_t); - void update_smpte_mode(); - void update_video_pullup(); + void update_smpte_mode (); + void update_video_pullup (); void update_subframes_per_frame (); /* fades/xfades */ @@ -628,10 +630,10 @@ class Editor : public PublicEditor bool verbose_cursor_on; // so far unused - Gtk::EventBox time_canvas_event_box; - Gtk::EventBox track_canvas_event_box; - Gtk::EventBox time_button_event_box; - Gtk::EventBox ruler_label_event_box; + Gtk::EventBox time_canvas_event_box; + Gtk::EventBox track_canvas_event_box; + Gtk::EventBox time_button_event_box; + Gtk::EventBox ruler_label_event_box; ArdourCanvas::Group *minsec_group; ArdourCanvas::Pixbuf *logo_item; @@ -696,14 +698,14 @@ class Editor : public PublicEditor Glib::RefPtr ruler_range_action; Glib::RefPtr ruler_loop_punch_action; Glib::RefPtr ruler_cd_marker_action; - bool no_ruler_shown_update; + bool no_ruler_shown_update; gint ruler_button_press (GdkEventButton*); gint ruler_button_release (GdkEventButton*); gint ruler_mouse_motion (GdkEventMotion*); bool ruler_scroll (GdkEventScroll* event); - gint ruler_pressed_button; + gint ruler_pressed_button; Gtk::Widget * ruler_grabbed_widget; void initialize_rulers (); @@ -813,7 +815,6 @@ class Editor : public PublicEditor Gtk::Label range_mark_label; Gtk::Label transport_mark_label; Gtk::Label cd_mark_label; - Gtk::VBox time_button_vbox; Gtk::HBox time_button_hbox; @@ -833,11 +834,9 @@ class Editor : public PublicEditor void set_y_axis (double position); }; - friend struct Cursor; /* it needs access to several private - fields. XXX fix me. - */ + friend struct Cursor; /* FIXME: needs access to several private fields */ - Cursor* playhead_cursor; + Cursor* playhead_cursor; ArdourCanvas::Group* cursor_group; void cursor_to_region_boundary (Cursor*, int32_t dir); @@ -2016,48 +2015,54 @@ public: /* Drag-n-Drop */ - int convert_drop_to_paths (std::vector& paths, - const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); - - void track_canvas_drag_data_received (const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); + int convert_drop_to_paths ( + std::vector& paths, + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); + + void track_canvas_drag_data_received ( + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); - void region_list_display_drag_data_received (const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); - - void drop_paths (const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); - - void drop_regions (const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); - - void drop_routes (const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); + void region_list_display_drag_data_received ( + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); + + void drop_paths ( + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); + + void drop_regions ( + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); + + void drop_routes ( + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); /* audio export */ @@ -2128,45 +2133,6 @@ public: void start_time_fx (ArdourCanvas::Item*, GdkEvent*); void end_time_fx (ArdourCanvas::Item*, GdkEvent*); - struct TimeFXDialog : public ArdourDialog { - ARDOUR::TimeFXRequest request; - Editor& editor; - bool pitching; - Gtk::Adjustment pitch_octave_adjustment; - Gtk::Adjustment pitch_semitone_adjustment; - Gtk::Adjustment pitch_cent_adjustment; - Gtk::SpinButton pitch_octave_spinner; - Gtk::SpinButton pitch_semitone_spinner; - Gtk::SpinButton pitch_cent_spinner; - RegionSelection regions; - Gtk::ProgressBar progress_bar; - - /* SoundTouch */ - Gtk::ToggleButton quick_button; - Gtk::ToggleButton antialias_button; - Gtk::HBox upper_button_box; - - /* RubberBand */ - Gtk::ComboBoxText stretch_opts_selector; - Gtk::Label stretch_opts_label; - Gtk::ToggleButton precise_button; - Gtk::ToggleButton preserve_formants_button; - Gtk::HBox opts_box; - - Gtk::Button* cancel_button; - Gtk::Button* action_button; - Gtk::VBox packer; - int status; - - TimeFXDialog (Editor& e, bool for_pitch); - - gint update_progress (); - sigc::connection first_cancel; - sigc::connection first_delete; - void cancel_in_progress (); - gint delete_in_progress (GdkEventAny*); - }; - /* "whats mine is yours" */ friend class TimeFXDialog; diff --git a/gtk2_ardour/editor_timefx.cc b/gtk2_ardour/editor_timefx.cc index 7552dfe8f7..79266c2285 100644 --- a/gtk2_ardour/editor_timefx.cc +++ b/gtk2_ardour/editor_timefx.cc @@ -30,10 +30,11 @@ #include #include -#include "editor.h" -#include "audio_time_axis.h" #include "audio_region_view.h" +#include "audio_time_axis.h" +#include "editor.h" #include "region_selection.h" +#include "time_fx_dialog.h" #include "ardour/session.h" #include "ardour/region.h" @@ -59,132 +60,6 @@ using namespace sigc; using namespace Gtk; using namespace Gtkmm2ext; -Editor::TimeFXDialog::TimeFXDialog (Editor& e, bool pitch) - : ArdourDialog (X_("time fx dialog")), - editor (e), - pitching (pitch), - pitch_octave_adjustment (0.0, -4.0, 4.0, 1, 2.0), - pitch_semitone_adjustment (0.0, -12.0, 12.0, 1.0, 4.0), - pitch_cent_adjustment (0.0, -499.0, 500.0, 5.0, 15.0), - pitch_octave_spinner (pitch_octave_adjustment), - pitch_semitone_spinner (pitch_semitone_adjustment), - pitch_cent_spinner (pitch_cent_adjustment), - quick_button (_("Quick but Ugly")), - antialias_button (_("Skip Anti-aliasing")), - stretch_opts_label (_("Contents:")), - precise_button (_("Strict Linear")), - preserve_formants_button(_("Preserve Formants")) -{ - set_modal (true); - set_position (Gtk::WIN_POS_MOUSE); - set_name (N_("TimeFXDialog")); - - WindowTitle title(Glib::get_application_name()); - if (pitching) { - title += _("Pitch Shift"); - } else { - title += _("Time Stretch"); - } - set_title(title.get_string()); - - cancel_button = add_button (_("Cancel"), Gtk::RESPONSE_CANCEL); - - get_vbox()->set_spacing (5); - get_vbox()->set_border_width (12); - - if (pitching) { - - upper_button_box.set_spacing (5); - upper_button_box.set_border_width (5); - - Gtk::Label* l; - - l = manage (new Label (_("Octaves"))); - upper_button_box.pack_start (*l, false, false); - upper_button_box.pack_start (pitch_octave_spinner, false, false); - - l = manage (new Label (_("Semitones (12TET)"))); - upper_button_box.pack_start (*l, false, false); - upper_button_box.pack_start (pitch_semitone_spinner, false, false); - - l = manage (new Label (_("Cents"))); - upper_button_box.pack_start (*l, false, false); - upper_button_box.pack_start (pitch_cent_spinner, false, false); - - pitch_cent_spinner.set_digits (1); - - upper_button_box.pack_start (preserve_formants_button, false, false); - - - add_button (_("Shift"), Gtk::RESPONSE_ACCEPT); - - get_vbox()->pack_start (upper_button_box, false, false); - - } else { - -#ifdef USE_RUBBERBAND - opts_box.set_spacing (5); - opts_box.set_border_width (5); - vector strings; - - set_popdown_strings (stretch_opts_selector, editor.rb_opt_strings); - /* set default */ - stretch_opts_selector.set_active_text (editor.rb_opt_strings[4]); - - opts_box.pack_start (precise_button, false, false); - opts_box.pack_start (stretch_opts_label, false, false); - opts_box.pack_start (stretch_opts_selector, false, false); - - get_vbox()->pack_start (opts_box, false, false); - -#else - upper_button_box.set_homogeneous (true); - upper_button_box.set_spacing (5); - upper_button_box.set_border_width (5); - - upper_button_box.pack_start (quick_button, true, true); - upper_button_box.pack_start (antialias_button, true, true); - - quick_button.set_name (N_("TimeFXButton")); - antialias_button.set_name (N_("TimeFXButton")); - - get_vbox()->pack_start (upper_button_box, false, false); - -#endif - add_button (_("Stretch/Shrink"), Gtk::RESPONSE_ACCEPT); - } - - get_vbox()->pack_start (progress_bar); - - progress_bar.set_name (N_("TimeFXProgress")); - - show_all_children (); -} - -gint -Editor::TimeFXDialog::update_progress () -{ - progress_bar.set_fraction (request.progress); - return !request.done; -} - -void -Editor::TimeFXDialog::cancel_in_progress () -{ - status = -2; - request.cancel = true; - first_cancel.disconnect(); -} - -gint -Editor::TimeFXDialog::delete_in_progress (GdkEventAny* ev) -{ - status = -2; - request.cancel = true; - first_delete.disconnect(); - return TRUE; -} - int Editor::time_stretch (RegionSelection& regions, float fraction) { diff --git a/gtk2_ardour/region_selection.h b/gtk2_ardour/region_selection.h index 98d2a4eaab..ee0cdab008 100644 --- a/gtk2_ardour/region_selection.h +++ b/gtk2_ardour/region_selection.h @@ -28,11 +28,10 @@ using std::list; using std::set; class RegionView; +class TimeAxisView; -/** - * Class to represent list of selected regions. +/** Class to represent list of selected regions. */ - class RegionSelection : public std::list, public sigc::trackable { public: diff --git a/gtk2_ardour/time_fx_dialog.cc b/gtk2_ardour/time_fx_dialog.cc new file mode 100644 index 0000000000..b20c01c4e1 --- /dev/null +++ b/gtk2_ardour/time_fx_dialog.cc @@ -0,0 +1,189 @@ +/* + Copyright (C) 2000-2009 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 "time_fx_dialog.h" + +#include +#include +#include + +#include + +#include "pbd/error.h" +#include "pbd/pthread_utils.h" +#include "pbd/memento_command.h" + +#include +#include + +#include "editor.h" +#include "audio_time_axis.h" +#include "audio_region_view.h" +#include "region_selection.h" + +#include "ardour/session.h" +#include "ardour/region.h" +#include "ardour/audioplaylist.h" +#include "ardour/audio_track.h" +#include "ardour/audioregion.h" +#include "ardour/audio_diskstream.h" +#include "ardour/stretch.h" +#include "ardour/midi_stretch.h" +#include "ardour/pitch.h" + +#ifdef USE_RUBBERBAND +#include "rubberband/RubberBandStretcher.h" +using namespace RubberBand; +#endif + +#include "i18n.h" + +using namespace std; +using namespace ARDOUR; +using namespace PBD; +using namespace sigc; +using namespace Gtk; +using namespace Gtkmm2ext; + +TimeFXDialog::TimeFXDialog (Editor& e, bool pitch) + : ArdourDialog (X_("time fx dialog")) + , editor (e) + , pitching (pitch) + , pitch_octave_adjustment (0.0, -4.0, 4.0, 1, 2.0) + , pitch_semitone_adjustment (0.0, -12.0, 12.0, 1.0, 4.0) + , pitch_cent_adjustment (0.0, -499.0, 500.0, 5.0, 15.0) + , pitch_octave_spinner (pitch_octave_adjustment) + , pitch_semitone_spinner (pitch_semitone_adjustment) + , pitch_cent_spinner (pitch_cent_adjustment) + , quick_button (_("Quick but Ugly")) + , antialias_button (_("Skip Anti-aliasing")) + , stretch_opts_label (_("Contents:")) + , precise_button (_("Strict Linear")) + , preserve_formants_button(_("Preserve Formants")) +{ + set_modal (true); + set_position (Gtk::WIN_POS_MOUSE); + set_name (N_("TimeFXDialog")); + + WindowTitle title(Glib::get_application_name()); + if (pitching) { + title += _("Pitch Shift"); + } else { + title += _("Time Stretch"); + } + set_title(title.get_string()); + + cancel_button = add_button (_("Cancel"), Gtk::RESPONSE_CANCEL); + + get_vbox()->set_spacing (5); + get_vbox()->set_border_width (12); + + if (pitching) { + + upper_button_box.set_spacing (5); + upper_button_box.set_border_width (5); + + Gtk::Label* l; + + l = manage (new Label (_("Octaves"))); + upper_button_box.pack_start (*l, false, false); + upper_button_box.pack_start (pitch_octave_spinner, false, false); + + l = manage (new Label (_("Semitones (12TET)"))); + upper_button_box.pack_start (*l, false, false); + upper_button_box.pack_start (pitch_semitone_spinner, false, false); + + l = manage (new Label (_("Cents"))); + upper_button_box.pack_start (*l, false, false); + upper_button_box.pack_start (pitch_cent_spinner, false, false); + + pitch_cent_spinner.set_digits (1); + + upper_button_box.pack_start (preserve_formants_button, false, false); + + + add_button (_("Shift"), Gtk::RESPONSE_ACCEPT); + + get_vbox()->pack_start (upper_button_box, false, false); + + } else { + +#ifdef USE_RUBBERBAND + opts_box.set_spacing (5); + opts_box.set_border_width (5); + vector strings; + + set_popdown_strings (stretch_opts_selector, editor.rb_opt_strings); + /* set default */ + stretch_opts_selector.set_active_text (editor.rb_opt_strings[4]); + + opts_box.pack_start (precise_button, false, false); + opts_box.pack_start (stretch_opts_label, false, false); + opts_box.pack_start (stretch_opts_selector, false, false); + + get_vbox()->pack_start (opts_box, false, false); + +#else + upper_button_box.set_homogeneous (true); + upper_button_box.set_spacing (5); + upper_button_box.set_border_width (5); + + upper_button_box.pack_start (quick_button, true, true); + upper_button_box.pack_start (antialias_button, true, true); + + quick_button.set_name (N_("TimeFXButton")); + antialias_button.set_name (N_("TimeFXButton")); + + get_vbox()->pack_start (upper_button_box, false, false); + +#endif + add_button (_("Stretch/Shrink"), Gtk::RESPONSE_ACCEPT); + } + + get_vbox()->pack_start (progress_bar); + + progress_bar.set_name (N_("TimeFXProgress")); + + show_all_children (); +} + +gint +TimeFXDialog::update_progress () +{ + progress_bar.set_fraction (request.progress); + return !request.done; +} + +void +TimeFXDialog::cancel_in_progress () +{ + status = -2; + request.cancel = true; + first_cancel.disconnect(); +} + +gint +TimeFXDialog::delete_in_progress (GdkEventAny* ev) +{ + status = -2; + request.cancel = true; + first_delete.disconnect(); + return TRUE; +} + diff --git a/gtk2_ardour/time_fx_dialog.h b/gtk2_ardour/time_fx_dialog.h new file mode 100644 index 0000000000..d5ec54c484 --- /dev/null +++ b/gtk2_ardour/time_fx_dialog.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2000-2009 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. + +*/ + +#ifndef __ardour_time_fx_dialog_h__ +#define __ardour_time_fx_dialog_h__ + +#include + +#include "ardour_dialog.h" +#include "region_selection.h" + +class Editor; + +struct TimeFXDialog : public ArdourDialog { + ARDOUR::TimeFXRequest request; + Editor& editor; + bool pitching; + Gtk::Adjustment pitch_octave_adjustment; + Gtk::Adjustment pitch_semitone_adjustment; + Gtk::Adjustment pitch_cent_adjustment; + Gtk::SpinButton pitch_octave_spinner; + Gtk::SpinButton pitch_semitone_spinner; + Gtk::SpinButton pitch_cent_spinner; + RegionSelection regions; + Gtk::ProgressBar progress_bar; + + /* SoundTouch */ + Gtk::ToggleButton quick_button; + Gtk::ToggleButton antialias_button; + Gtk::HBox upper_button_box; + + /* RubberBand */ + Gtk::ComboBoxText stretch_opts_selector; + Gtk::Label stretch_opts_label; + Gtk::ToggleButton precise_button; + Gtk::ToggleButton preserve_formants_button; + Gtk::HBox opts_box; + + Gtk::Button* cancel_button; + Gtk::Button* action_button; + Gtk::VBox packer; + int status; + + TimeFXDialog (Editor& e, bool for_pitch); + + gint update_progress (); + sigc::connection first_cancel; + sigc::connection first_delete; + void cancel_in_progress (); + gint delete_in_progress (GdkEventAny*); +}; + +#endif /* __ardour_time_fx_dialog_h__ */ diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript index eca7aa3576..213975c0a6 100644 --- a/gtk2_ardour/wscript +++ b/gtk2_ardour/wscript @@ -221,6 +221,7 @@ def build(bld): theme_manager.cc time_axis_view.cc time_axis_view_item.cc + time_fx_dialog.cc time_selection.cc ui_config.cc utils.cc -- cgit v1.2.3