Split TimeFXDialog from Editor.

git-svn-id: svn://localhost/ardour2/branches/3.0@4698 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
David Robillard 2009-02-27 01:20:25 +00:00
parent 9f77cd9e19
commit eeae6aec34
7 changed files with 341 additions and 241 deletions

View file

@ -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

View file

@ -88,30 +88,31 @@ namespace LADSPA {
class Plugin;
}
class TimeAxisView;
class AudioTimeAxisView;
class AutomationTimeAxisView;
class AnalysisWindow;
class AudioRegionView;
class CrossfadeView;
class PluginSelector;
class PlaylistSelector;
class Marker;
class GroupedButtons;
class AudioStreamView;
class AudioTimeAxisView;
class AutomationLine;
class AutomationSelection;
class AutomationTimeAxisView;
class BundleManager;
class ControlPoint;
class CrossfadeView;
class GlobalPortMatrixWindow;
class GroupedButtons;
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;
/* <CMT Additions> */
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<Gtk::ToggleAction> ruler_range_action;
Glib::RefPtr<Gtk::ToggleAction> ruler_loop_punch_action;
Glib::RefPtr<Gtk::ToggleAction> 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 ();
@ -814,7 +816,6 @@ class Editor : public PublicEditor
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<Glib::ustring>& paths,
const Glib::RefPtr<Gdk::DragContext>& context,
gint x,
gint y,
const Gtk::SelectionData& data,
guint info,
guint time);
int convert_drop_to_paths (
std::vector<Glib::ustring>& paths,
const Glib::RefPtr<Gdk::DragContext>& context,
gint x,
gint y,
const Gtk::SelectionData& data,
guint info,
guint time);
void track_canvas_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context,
gint x,
gint y,
const Gtk::SelectionData& data,
guint info,
guint time);
void track_canvas_drag_data_received (
const Glib::RefPtr<Gdk::DragContext>& context,
gint x,
gint y,
const Gtk::SelectionData& data,
guint info,
guint time);
void region_list_display_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context,
gint x,
gint y,
const Gtk::SelectionData& data,
guint info,
guint time);
void region_list_display_drag_data_received (
const Glib::RefPtr<Gdk::DragContext>& context,
gint x,
gint y,
const Gtk::SelectionData& data,
guint info,
guint time);
void drop_paths (const Glib::RefPtr<Gdk::DragContext>& context,
gint x,
gint y,
const Gtk::SelectionData& data,
guint info,
guint time);
void drop_paths (
const Glib::RefPtr<Gdk::DragContext>& context,
gint x,
gint y,
const Gtk::SelectionData& data,
guint info,
guint time);
void drop_regions (const Glib::RefPtr<Gdk::DragContext>& context,
gint x,
gint y,
const Gtk::SelectionData& data,
guint info,
guint time);
void drop_regions (
const Glib::RefPtr<Gdk::DragContext>& context,
gint x,
gint y,
const Gtk::SelectionData& data,
guint info,
guint time);
void drop_routes (const Glib::RefPtr<Gdk::DragContext>& context,
gint x,
gint y,
const Gtk::SelectionData& data,
guint info,
guint time);
void drop_routes (
const Glib::RefPtr<Gdk::DragContext>& 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;

View file

@ -30,10 +30,11 @@
#include <gtkmm2ext/window_title.h>
#include <gtkmm2ext/utils.h>
#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<string> 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)
{

View file

@ -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<RegionView*>, public sigc::trackable
{
public:

View file

@ -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 <iostream>
#include <cstdlib>
#include <cmath>
#include <string>
#include "pbd/error.h"
#include "pbd/pthread_utils.h"
#include "pbd/memento_command.h"
#include <gtkmm2ext/window_title.h>
#include <gtkmm2ext/utils.h>
#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<string> 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;
}

View file

@ -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 <gtkmm.h>
#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__ */

View file

@ -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