X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fcrossfade_edit.cc;h=0c8daafb045995826673acdb50616d103a4c61db;hb=4336bb25d739cd007811ccd0298a15acc5e20787;hp=eb5cb2fba96879ac1838709a1002f1fa9d67106f;hpb=bc89fe0147c04b67141936d109c00dfd4d69cc4b;p=ardour.git diff --git a/gtk2_ardour/crossfade_edit.cc b/gtk2_ardour/crossfade_edit.cc index eb5cb2fba9..0c8daafb04 100644 --- a/gtk2_ardour/crossfade_edit.cc +++ b/gtk2_ardour/crossfade_edit.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2004 Paul Davis + Copyright (C) 2004 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 @@ -27,16 +27,16 @@ #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "pbd/memento_command.h" +#include "ardour/automation_list.h" +#include "evoral/Curve.hpp" +#include "ardour/crossfade.h" +#include "ardour/session.h" +#include "ardour/auditioner.h" +#include "ardour/audioplaylist.h" +#include "ardour/audiosource.h" +#include "ardour/region_factory.h" +#include "ardour/profile.h" #include @@ -55,9 +55,10 @@ using namespace std; using namespace ARDOUR; using namespace PBD; using namespace Gtk; -using namespace sigc; using namespace Editing; +using Gtkmm2ext::Keyboard; + #include "i18n.h" const int32_t CrossfadeEditor::Point::size = 7; @@ -66,17 +67,15 @@ CrossfadeEditor::Presets* CrossfadeEditor::fade_in_presets = 0; CrossfadeEditor::Presets* CrossfadeEditor::fade_out_presets = 0; CrossfadeEditor::Half::Half () - : line (0), - //normative_curve (Evoral::Parameter(GainAutomation, 0.0, 1.0, 1.0)), // FIXME: GainAutomation? - normative_curve (Evoral::Parameter(GainAutomation)), - gain_curve (Evoral::Parameter(GainAutomation)) + : line (0) + , normative_curve (Evoral::Parameter(GainAutomation)) + , gain_curve (Evoral::Parameter(GainAutomation)) { } -CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, double my, double mxy) - : ArdourDialog (_("ardour: x-fade edit")), +CrossfadeEditor::CrossfadeEditor (Session* s, boost::shared_ptr xf, double my, double mxy) + : ArdourDialog (_("Edit Crossfade")), xfade (xf), - session (s), clear_button (_("Clear")), revert_button (_("Reset")), audition_both_button (_("Fade")), @@ -87,7 +86,7 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, d preroll_button (_("With Pre-roll")), postroll_button (_("With Post-roll")), - + miny (my), maxy (mxy), @@ -95,9 +94,14 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, d fade_out_table (3, 3), select_in_button (_("Fade In")), - select_out_button (_("Fade Out")) + select_out_button (_("Fade Out")), + + _peaks_ready_connection (0) + { - set_wmclass (X_("ardour_automationedit"), "Ardour"); + set_session (s); + + set_wmclass (X_("ardour_automationedit"), PROGRAM_NAME); set_name ("CrossfadeEditWindow"); set_position (Gtk::WIN_POS_MOUSE); @@ -124,9 +128,9 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, d toplevel = 0; canvas = new ArdourCanvas::CanvasAA (); - canvas->signal_size_allocate().connect (mem_fun(*this, &CrossfadeEditor::canvas_allocation)); + canvas->signal_size_allocate().connect (sigc::mem_fun(*this, &CrossfadeEditor::canvas_allocation)); canvas->set_size_request (425, 200); - + toplevel = new ArdourCanvas::SimpleRect (*(canvas->root())); toplevel->property_x1() = 0.0; toplevel->property_y1() = 0.0; @@ -135,35 +139,35 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, d toplevel->property_fill() = true; toplevel->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorBase.get(); toplevel->property_outline_pixels() = 0; - toplevel->signal_event().connect (mem_fun (*this, &CrossfadeEditor::canvas_event)); - + toplevel->signal_event().connect (sigc::mem_fun (*this, &CrossfadeEditor::canvas_event)); + fade[Out].line = new ArdourCanvas::Line (*(canvas->root())); fade[Out].line->property_width_pixels() = 1; fade[Out].line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorLine.get(); - + fade[Out].shading = new ArdourCanvas::Polygon (*(canvas->root())); fade[Out].shading->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorLineShading.get(); fade[In].line = new ArdourCanvas::Line (*(canvas->root())); fade[In].line->property_width_pixels() = 1; fade[In].line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorLine.get(); - + fade[In].shading = new ArdourCanvas::Polygon (*(canvas->root())); fade[In].shading->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorLineShading.get(); - - fade[In].shading->signal_event().connect (mem_fun (*this, &CrossfadeEditor::canvas_event)); - fade[In].line->signal_event().connect (mem_fun (*this, &CrossfadeEditor::curve_event)); - fade[Out].shading->signal_event().connect (mem_fun (*this, &CrossfadeEditor::canvas_event)); - fade[Out].line->signal_event().connect (mem_fun (*this, &CrossfadeEditor::curve_event)); + + fade[In].shading->signal_event().connect (sigc::mem_fun (*this, &CrossfadeEditor::canvas_event)); + fade[In].line->signal_event().connect (sigc::mem_fun (*this, &CrossfadeEditor::curve_event)); + fade[Out].shading->signal_event().connect (sigc::mem_fun (*this, &CrossfadeEditor::canvas_event)); + fade[Out].line->signal_event().connect (sigc::mem_fun (*this, &CrossfadeEditor::curve_event)); select_in_button.set_name (X_("CrossfadeEditCurveButton")); select_out_button.set_name (X_("CrossfadeEditCurveButton")); - select_in_button.signal_clicked().connect (bind (mem_fun (*this, &CrossfadeEditor::curve_select_clicked), In)); - select_out_button.signal_clicked().connect (bind (mem_fun (*this, &CrossfadeEditor::curve_select_clicked), Out)); + select_in_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &CrossfadeEditor::curve_select_clicked), In)); + select_out_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &CrossfadeEditor::curve_select_clicked), Out)); HBox* acbox = manage (new HBox); - + audition_box.set_border_width (7); audition_box.set_spacing (5); audition_box.set_homogeneous (false); @@ -174,7 +178,7 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, d audition_box.pack_start (audition_right_dry_button, false, false); Frame* audition_frame = manage (new Frame (_("Audition"))); - + audition_frame->set_name (X_("CrossfadeEditFrame")); audition_frame->add (audition_box); @@ -201,7 +205,7 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, d pbutton = manage (new Button); pbutton->add (*pxmap); pbutton->set_name ("CrossfadeEditButton"); - pbutton->signal_clicked().connect (bind (mem_fun(*this, &CrossfadeEditor::apply_preset), *i)); + pbutton->signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &CrossfadeEditor::apply_preset), *i)); ARDOUR_UI::instance()->set_tip (pbutton, (*i)->name, ""); fade_in_table.attach (*pbutton, col, col+1, row, row+1); fade_in_buttons.push_back (pbutton); @@ -223,7 +227,7 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, d pbutton = manage (new Button); pbutton->add (*pxmap); pbutton->set_name ("CrossfadeEditButton"); - pbutton->signal_clicked().connect (bind (mem_fun(*this, &CrossfadeEditor::apply_preset), *i)); + pbutton->signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &CrossfadeEditor::apply_preset), *i)); ARDOUR_UI::instance()->set_tip (pbutton, (*i)->name, ""); fade_out_table.attach (*pbutton, col, col+1, row, row+1); fade_out_buttons.push_back (pbutton); @@ -248,13 +252,13 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, d audition_right_dry_button.set_name ("CrossfadeEditAuditionButton"); audition_right_button.set_name ("CrossfadeEditAuditionButton"); - clear_button.signal_clicked().connect (mem_fun(*this, &CrossfadeEditor::clear)); - revert_button.signal_clicked().connect (mem_fun(*this, &CrossfadeEditor::reset)); - audition_both_button.signal_toggled().connect (mem_fun(*this, &CrossfadeEditor::audition_toggled)); - audition_right_button.signal_toggled().connect (mem_fun(*this, &CrossfadeEditor::audition_right_toggled)); - audition_right_dry_button.signal_toggled().connect (mem_fun(*this, &CrossfadeEditor::audition_right_dry_toggled)); - audition_left_button.signal_toggled().connect (mem_fun(*this, &CrossfadeEditor::audition_left_toggled)); - audition_left_dry_button.signal_toggled().connect (mem_fun(*this, &CrossfadeEditor::audition_left_dry_toggled)); + clear_button.signal_clicked().connect (sigc::mem_fun(*this, &CrossfadeEditor::clear)); + revert_button.signal_clicked().connect (sigc::mem_fun(*this, &CrossfadeEditor::reset)); + audition_both_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_toggled)); + audition_right_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_right_toggled)); + audition_right_dry_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_right_dry_toggled)); + audition_left_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_left_toggled)); + audition_left_dry_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_left_dry_toggled)); roll_box.pack_start (preroll_button, false, false); roll_box.pack_start (postroll_button, false, false); @@ -273,14 +277,14 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, d curve_button_box.pack_start (fade_out_table, false, false, 12); curve_button_box.pack_start (*vpacker2, false, false, 12); curve_button_box.pack_start (fade_in_table, false, false, 12); - + get_vbox()->pack_start (*canvas_frame, true, true); get_vbox()->pack_start (curve_button_box, false, false); /* button to allow hackers to check the actual curve values */ // Button* foobut = manage (new Button ("dump")); -// foobut-.signal_clicked().connect (mem_fun(*this, &CrossfadeEditor::dump)); +// foobut-.signal_clicked().connect (sigc::mem_fun(*this, &CrossfadeEditor::dump)); // vpacker.pack_start (*foobut, false, false); current = In; @@ -291,9 +295,9 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, d curve_select_clicked (In); - xfade->StateChanged.connect (mem_fun(*this, &CrossfadeEditor::xfade_changed)); + xfade->PropertyChanged.connect (state_connection, invalidator (*this), ui_bind (&CrossfadeEditor::xfade_changed, this, _1), gui_context()); - session.AuditionActive.connect (mem_fun(*this, &CrossfadeEditor::audition_state_changed)); + _session->AuditionActive.connect (_session_connections, invalidator (*this), ui_bind (&CrossfadeEditor::audition_state_changed, this, _1), gui_context()); show_all_children(); } @@ -308,6 +312,8 @@ CrossfadeEditor::~CrossfadeEditor() for (list::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) { delete *i; } + + delete _peaks_ready_connection; } void @@ -321,7 +327,7 @@ CrossfadeEditor::dump () void CrossfadeEditor::audition_state_changed (bool yn) { - ENSURE_GUI_THREAD (bind (mem_fun(*this, &CrossfadeEditor::audition_state_changed), yn)); + ENSURE_GUI_THREAD (*this, &CrossfadeEditor::audition_state_changed, yn) if (!yn) { audition_both_button.set_active (false); @@ -341,7 +347,7 @@ CrossfadeEditor::set (const ARDOUR::AutomationList& curve, WhichFade which) for (list::iterator i = fade[which].points.begin(); i != fade[which].points.end(); ++i) { delete *i; } - + fade[which].points.clear (); fade[which].gain_curve.clear (); fade[which].normative_curve.clear (); @@ -349,30 +355,30 @@ CrossfadeEditor::set (const ARDOUR::AutomationList& curve, WhichFade which) if (curve.empty()) { goto out; } - + the_end = curve.end(); --the_end; - + firstx = (*curve.begin())->when; endx = (*the_end)->when; for (ARDOUR::AutomationList::const_iterator i = curve.begin(); i != curve.end(); ++i) { - + double xfract = ((*i)->when - firstx) / (endx - firstx); double yfract = ((*i)->value - miny) / (maxy - miny); - + Point* p = make_point (); p->move_to (x_coordinate (xfract), y_coordinate (yfract), xfract, yfract); - + fade[which].points.push_back (p); } /* no need to sort because curve is already time-ordered */ out: - + swap (which, current); redraw (); swap (which, current); @@ -404,7 +410,7 @@ CrossfadeEditor::point_event (GdkEvent* event, Point* point) if (Keyboard::is_delete_event (&event->button)) { fade[current].points.remove (point); delete point; - } + } redraw (); break; @@ -413,16 +419,17 @@ CrossfadeEditor::point_event (GdkEvent* event, Point* point) if (point_grabbed) { double new_x, new_y; - /* can't drag first or last points horizontally */ + /* can't drag first or last points horizontally or vertically */ if (point == fade[current].points.front() || point == fade[current].points.back()) { new_x = point->x; + new_y = point->y; } else { new_x = (event->motion.x - canvas_border)/effective_width(); + new_y = 1.0 - ((event->motion.y - canvas_border)/effective_height()); } - new_y = 1.0 - ((event->motion.y - canvas_border)/effective_height()); - point->move_to (x_coordinate (new_x), y_coordinate (new_y), + point->move_to (x_coordinate (new_x), y_coordinate (new_y), new_x, new_y); redraw (); } @@ -466,8 +473,8 @@ CrossfadeEditor::make_point () p->curve = fade[current].line; - p->box->signal_event().connect (bind (mem_fun (*this, &CrossfadeEditor::point_event), p)); - + p->box->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &CrossfadeEditor::point_event), p)); + return p; } @@ -477,12 +484,12 @@ CrossfadeEditor::add_control_point (double x, double y) PointSorter cmp; /* enforce end point x location */ - + if (fade[current].points.empty()) { x = 0.0; } else if (fade[current].points.size() == 1) { x = 1.0; - } + } Point* p = make_point (); @@ -497,6 +504,18 @@ CrossfadeEditor::add_control_point (double x, double y) void CrossfadeEditor::Point::move_to (double nx, double ny, double xfract, double yfract) { + if ( xfract < 0.0 ) { + xfract = 0.0; + } else if ( xfract > 1.0 ) { + xfract = 1.0; + } + + if ( yfract < 0.0 ) { + yfract = 0.0; + } else if ( yfract > 1.0 ) { + yfract = 1.0; + } + const double half_size = rint(size/2.0); double x1 = nx - half_size; double x2 = nx + half_size; @@ -512,7 +531,7 @@ CrossfadeEditor::Point::move_to (double nx, double ny, double xfract, double yfr } void -CrossfadeEditor::canvas_allocation (Gtk::Allocation& alloc) +CrossfadeEditor::canvas_allocation (Gtk::Allocation& /*alloc*/) { if (toplevel) { toplevel->property_x1() = 0.0; @@ -520,9 +539,9 @@ CrossfadeEditor::canvas_allocation (Gtk::Allocation& alloc) toplevel->property_x2() = (double) canvas->get_allocation().get_width() + canvas_border; toplevel->property_y2() = (double) canvas->get_allocation().get_height() + canvas_border; } - - canvas->set_scroll_region (0.0, 0.0, - canvas->get_allocation().get_width(), + + canvas->set_scroll_region (0.0, 0.0, + canvas->get_allocation().get_width(), canvas->get_allocation().get_height()); Point* end = make_point (); @@ -549,9 +568,9 @@ CrossfadeEditor::canvas_allocation (Gtk::Allocation& alloc) (*i)->move_to (x_coordinate((*i)->x), y_coordinate((*i)->y), (*i)->x, (*i)->y); } - + end = make_point (); - + if (fade[Out].points.size() > 1) { Point* old_end = fade[Out].points.back(); fade[Out].points.pop_back (); @@ -574,7 +593,7 @@ CrossfadeEditor::canvas_allocation (Gtk::Allocation& alloc) y_coordinate ((*i)->y), (*i)->x, (*i)->y); } - + WhichFade old_current = current; current = In; redraw (); @@ -624,7 +643,7 @@ CrossfadeEditor::canvas_allocation (Gtk::Allocation& alloc) void -CrossfadeEditor::xfade_changed (Change ignored) +CrossfadeEditor::xfade_changed (const PropertyChange&) { set (xfade->fade_in(), In); set (xfade->fade_out(), Out); @@ -637,7 +656,7 @@ CrossfadeEditor::redraw () return; } - nframes_t len = xfade->length (); + framecnt_t len = xfade->length (); fade[current].normative_curve.clear (); fade[current].gain_curve.clear (); @@ -657,7 +676,7 @@ CrossfadeEditor::redraw () float vec[npoints]; fade[current].normative_curve.curve().get_vector (0, 1.0, vec, npoints); - + ArdourCanvas::Points pts; ArdourCanvas::Points spts; @@ -689,11 +708,11 @@ CrossfadeEditor::redraw () spts[2].set_x (effective_width() + canvas_border); spts[2].set_y (canvas_border); - + } else { /* upper left */ - + spts[0].set_x (canvas_border); spts[0].set_y (canvas_border); @@ -714,7 +733,7 @@ CrossfadeEditor::redraw () for (size_t i = 0; i < npoints; ++i) { double y = vec[i]; - + pts[i].set_x (canvas_border + i); pts[i].set_y (y_coordinate (y)); @@ -726,27 +745,27 @@ CrossfadeEditor::redraw () fade[current].shading->property_points() = spts; for (vector::iterator i = fade[current].waves.begin(); i != fade[current].waves.end(); ++i) { - (*i)->property_gain_src() = &fade[current].gain_curve; + (*i)->property_gain_src() = static_cast(&fade[current].gain_curve.curve()); } } void CrossfadeEditor::apply_preset (Preset *preset) { - + WhichFade wf = find(fade_in_presets->begin(), fade_in_presets->end(), preset) != fade_in_presets->end() ? In : Out; - + if (current != wf) { - + if (wf == In) { select_in_button.clicked(); } else { select_out_button.clicked(); } - + curve_select_clicked (wf); - } - + } + for (list::iterator i = fade[current].points.begin(); i != fade[current].points.end(); ++i) { delete *i; } @@ -766,7 +785,14 @@ CrossfadeEditor::apply_preset (Preset *preset) void CrossfadeEditor::apply () { + _session->begin_reversible_command (_("Edit crossfade")); + + XMLNode& before = xfade->get_state (); + _apply_to (xfade); + + _session->add_command (new MementoCommand (*xfade.get(), &before, &xfade->get_state ())); + _session->commit_reversible_command (); } void @@ -847,7 +873,7 @@ CrossfadeEditor::reset () set (xfade->fade_in(), In); set (xfade->fade_out(), Out); - curve_select_clicked (current); + curve_select_clicked (current); } void @@ -858,9 +884,9 @@ CrossfadeEditor::build_presets () fade_in_presets = new Presets; fade_out_presets = new Presets; - /* FADE OUT */ + /* FADE IN */ - p = new Preset ("Linear (-6dB)", "crossfade_in_dipped"); + p = new Preset ("Linear (-6dB)", "crossfade-in-linear"); p->push_back (PresetPoint (0, 0)); p->push_back (PresetPoint (0.000000, 0.000000)); p->push_back (PresetPoint (0.166667, 0.166366)); @@ -871,7 +897,7 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1.000000, 1.000000)); fade_in_presets->push_back (p); - p = new Preset ("S(1)-curve", "crossfade_in_default"); + p = new Preset ("S(1)-curve", "crossfade-in-S1"); p->push_back (PresetPoint (0, 0)); p->push_back (PresetPoint (0.1, 0.01)); p->push_back (PresetPoint (0.2, 0.03)); @@ -880,7 +906,7 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1, 1)); fade_in_presets->push_back (p); - p = new Preset ("S(2)-curve", "crossfade_in_default"); + p = new Preset ("S(2)-curve", "crossfade-in-S2"); p->push_back (PresetPoint (0.0, 0.0)); p->push_back (PresetPoint (0.055, 0.222)); p->push_back (PresetPoint (0.163, 0.35)); @@ -889,7 +915,7 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1.0, 1.0)); fade_in_presets->push_back (p); - p = new Preset ("Constant Power (-3dB)", "crossfade_in_constant"); + p = new Preset ("Constant Power (-3dB)", "crossfade-in-constant-power"); p->push_back (PresetPoint (0.000000, 0.000000)); p->push_back (PresetPoint (0.166667, 0.282192)); @@ -902,20 +928,8 @@ CrossfadeEditor::build_presets () fade_in_presets->push_back (p); if (!Profile->get_sae()) { - // p = new Preset ("hiin.xpm"); - p = new Preset ("Long cut", "crossfade_in_fast-cut"); - p->push_back (PresetPoint (0, 0)); - p->push_back (PresetPoint (0.0207373, 0.197222)); - p->push_back (PresetPoint (0.0645161, 0.525)); - p->push_back (PresetPoint (0.152074, 0.802778)); - p->push_back (PresetPoint (0.276498, 0.919444)); - p->push_back (PresetPoint (0.481567, 0.980556)); - p->push_back (PresetPoint (0.767281, 1)); - p->push_back (PresetPoint (1, 1)); - fade_in_presets->push_back (p); - - // p = new Preset ("loin.xpm"); - p = new Preset ("Short cut", "crossfade_in_transition"); + + p = new Preset ("Short cut", "crossfade-in-short-cut"); p->push_back (PresetPoint (0, 0)); p->push_back (PresetPoint (0.389401, 0.0333333)); p->push_back (PresetPoint (0.629032, 0.0861111)); @@ -924,10 +938,8 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (0.976959, 0.697222)); p->push_back (PresetPoint (1, 1)); fade_in_presets->push_back (p); - - - // p = new Preset ("regin2.xpm"); - p = new Preset ("Slow cut", "crossfade_in_slow-cut"); + + p = new Preset ("Slow cut", "crossfade-in-slow-cut"); p->push_back (PresetPoint (0, 0)); p->push_back (PresetPoint (0.304147, 0.0694444)); p->push_back (PresetPoint (0.529954, 0.152778)); @@ -936,12 +948,33 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (0.919355, 0.730556)); p->push_back (PresetPoint (1, 1)); fade_in_presets->push_back (p); + + p = new Preset ("Fast cut", "crossfade-in-fast-cut"); + p->push_back (PresetPoint (0, 0)); + p->push_back (PresetPoint (0.0737327, 0.308333)); + p->push_back (PresetPoint (0.246544, 0.658333)); + p->push_back (PresetPoint (0.470046, 0.886111)); + p->push_back (PresetPoint (0.652074, 0.972222)); + p->push_back (PresetPoint (0.771889, 0.988889)); + p->push_back (PresetPoint (1, 1)); + fade_in_presets->push_back (p); + + p = new Preset ("Long cut", "crossfade-in-long-cut"); + p->push_back (PresetPoint (0, 0)); + p->push_back (PresetPoint (0.0207373, 0.197222)); + p->push_back (PresetPoint (0.0645161, 0.525)); + p->push_back (PresetPoint (0.152074, 0.802778)); + p->push_back (PresetPoint (0.276498, 0.919444)); + p->push_back (PresetPoint (0.481567, 0.980556)); + p->push_back (PresetPoint (0.767281, 1)); + p->push_back (PresetPoint (1, 1)); + fade_in_presets->push_back (p); } - + /* FADE OUT */ // p = new Preset ("regout.xpm"); - p = new Preset ("Linear (-6dB cut)", "crossfade_out_dipped"); + p = new Preset ("Linear (-6dB cut)", "crossfade-out-linear"); p->push_back (PresetPoint (0, 1)); p->push_back (PresetPoint (0.000000, 1.000000)); p->push_back (PresetPoint (0.166667, 0.833033)); @@ -952,7 +985,7 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1.000000, 0.000000)); fade_out_presets->push_back (p); - p = new Preset ("S(1)-Curve", "crossfade_out_default"); + p = new Preset ("S(1)-Curve", "crossfade-out-S1"); p->push_back (PresetPoint (0, 1)); p->push_back (PresetPoint (0.1, 0.99)); p->push_back (PresetPoint (0.2, 0.97)); @@ -961,7 +994,7 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1, 0)); fade_out_presets->push_back (p); - p = new Preset ("S(2)-Curve", "crossfade_out_default"); + p = new Preset ("S(2)-Curve", "crossfade-out-S2"); p->push_back (PresetPoint (0.0, 1.0)); p->push_back (PresetPoint (0.163, 0.678)); p->push_back (PresetPoint (0.055, 0.783)); @@ -971,7 +1004,7 @@ CrossfadeEditor::build_presets () fade_out_presets->push_back (p); // p = new Preset ("linout.xpm"); - p = new Preset ("Constant Power (-3dB cut)", "crossfade_out_constant"); + p = new Preset ("Constant Power (-3dB cut)", "crossfade-out-constant-power"); p->push_back (PresetPoint (0.000000, 1.000000)); p->push_back (PresetPoint (0.166667, 0.948859)); p->push_back (PresetPoint (0.333333, 0.851507)); @@ -980,10 +1013,10 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (0.833333, 0.282192)); p->push_back (PresetPoint (1.000000, 0.000000)); fade_out_presets->push_back (p); - + if (!Profile->get_sae()) { // p = new Preset ("hiout.xpm"); - p = new Preset ("Slow end/cut", "crossfade_out_fast-cut"); + p = new Preset ("Short cut", "crossfade-out-short-cut"); p->push_back (PresetPoint (0, 1)); p->push_back (PresetPoint (0.305556, 1)); p->push_back (PresetPoint (0.548611, 0.991736)); @@ -992,20 +1025,18 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (0.976852, 0.22865)); p->push_back (PresetPoint (1, 0)); fade_out_presets->push_back (p); - - // p = new Preset ("loout.xpm"); - p = new Preset ("Fast start/cut", "crossfade_out_transition"); + + p = new Preset ("Slow cut", "crossfade-out-slow-cut"); p->push_back (PresetPoint (0, 1)); - p->push_back (PresetPoint (0.023041, 0.697222)); - p->push_back (PresetPoint (0.0553, 0.483333)); - p->push_back (PresetPoint (0.170507, 0.233333)); - p->push_back (PresetPoint (0.370968, 0.0861111)); - p->push_back (PresetPoint (0.610599, 0.0333333)); + p->push_back (PresetPoint (0.228111, 0.988889)); + p->push_back (PresetPoint (0.347926, 0.972222)); + p->push_back (PresetPoint (0.529954, 0.886111)); + p->push_back (PresetPoint (0.753456, 0.658333)); + p->push_back (PresetPoint (0.9262673, 0.308333)); p->push_back (PresetPoint (1, 0)); fade_out_presets->push_back (p); - - // p = new Preset ("regout2.xpm"); - p = new Preset ("Slow Fade", "crossfade_out_slow-fade"); + + p = new Preset ("Fast cut", "crossfade-out-fast-cut"); p->push_back (PresetPoint (0, 1)); p->push_back (PresetPoint (0.080645, 0.730556)); p->push_back (PresetPoint (0.277778, 0.289256)); @@ -1013,6 +1044,18 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (0.695853, 0.0694444)); p->push_back (PresetPoint (1, 0)); fade_out_presets->push_back (p); + + // p = new Preset ("loout.xpm"); + p = new Preset ("Long cut", "crossfade-out-long-cut"); + p->push_back (PresetPoint (0, 1)); + p->push_back (PresetPoint (0.023041, 0.697222)); + p->push_back (PresetPoint (0.0553, 0.483333)); + p->push_back (PresetPoint (0.170507, 0.233333)); + p->push_back (PresetPoint (0.370968, 0.0861111)); + p->push_back (PresetPoint (0.610599, 0.0333333)); + p->push_back (PresetPoint (1, 0)); + fade_out_presets->push_back (p); + } } @@ -1020,9 +1063,9 @@ void CrossfadeEditor::curve_select_clicked (WhichFade wf) { current = wf; - + if (wf == In) { - + for (vector::iterator i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i) { (*i)->property_wave_color() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get(); (*i)->property_fill_color() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get(); @@ -1066,7 +1109,7 @@ CrossfadeEditor::curve_select_clicked (WhichFade wf) for (list::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) { (*i)->box->hide(); } - + for (list::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) { (*i)->box->show(); } @@ -1074,7 +1117,7 @@ CrossfadeEditor::curve_select_clicked (WhichFade wf) } } -double +double CrossfadeEditor::x_coordinate (double& xfract) const { xfract = min (1.0, xfract); @@ -1109,11 +1152,14 @@ CrossfadeEditor::make_waves (boost::shared_ptr region, WhichFade wh ht = canvas->get_allocation().get_height() / (double) nchans; spu = xfade->length() / (double) effective_width(); + delete _peaks_ready_connection; + _peaks_ready_connection = 0; + for (uint32_t n = 0; n < nchans; ++n) { - + gdouble yoff = n * ht; - - if (region->audio_source(n)->peaks_ready (bind (mem_fun(*this, &CrossfadeEditor::peaks_ready), region, which), peaks_ready_connection)) { + + if (region->audio_source(n)->peaks_ready (boost::bind (&CrossfadeEditor::peaks_ready, this, boost::weak_ptr(region), which), &_peaks_ready_connection, gui_context())) { WaveView* waveview = new WaveView (*(canvas->root())); waveview->property_data_src() = region.get(); @@ -1124,7 +1170,7 @@ CrossfadeEditor::make_waves (boost::shared_ptr region, WhichFade wh waveview->property_sourcefile_length_function() = (void*) sourcefile_length_from_c; waveview->property_peak_function() = (void*) region_read_peaks_from_c; waveview->property_gain_function() = (void*) curve_get_vector_from_c; - waveview->property_gain_src() = &fade[which].gain_curve; + waveview->property_gain_src() = static_cast(&fade[which].gain_curve.curve()); waveview->property_x() = canvas_border; waveview->property_y() = yoff; waveview->property_height() = ht; @@ -1132,7 +1178,7 @@ CrossfadeEditor::make_waves (boost::shared_ptr region, WhichFade wh waveview->property_amplitude_above_axis() = 2.0; waveview->property_wave_color() = color; waveview->property_fill_color() = color; - + if (which==In) waveview->property_region_start() = region->start(); else @@ -1147,34 +1193,42 @@ CrossfadeEditor::make_waves (boost::shared_ptr region, WhichFade wh } void -CrossfadeEditor::peaks_ready (boost::shared_ptr r, WhichFade which) +CrossfadeEditor::peaks_ready (boost::weak_ptr wr, WhichFade which) { + boost::shared_ptr r (wr.lock()); + + if (!r) { + return; + } + /* this should never be called, because the peak files for an xfade will be ready by the time we want them. but our API forces us to provide this, so .. */ - peaks_ready_connection.disconnect (); + delete _peaks_ready_connection; + _peaks_ready_connection = 0; + make_waves (r, which); } void CrossfadeEditor::audition (Audition which) { - AudioPlaylist& pl (session.the_auditioner()->prepare_playlist()); - nframes_t preroll; - nframes_t postroll; - nframes_t left_start_offset; - nframes_t right_length; - nframes_t left_length; + AudioPlaylist& pl (_session->the_auditioner()->prepare_playlist()); + framecnt_t preroll; + framecnt_t postroll; + framecnt_t left_start_offset; + framecnt_t right_length; + framecnt_t left_length; if (which != Right && preroll_button.get_active()) { - preroll = session.frame_rate() * 2; //2 second hardcoded preroll for now + preroll = _session->frame_rate() * 2; //2 second hardcoded preroll for now } else { preroll = 0; } if (which != Left && postroll_button.get_active()) { - postroll = session.frame_rate() * 2; //2 second hardcoded postroll for now + postroll = _session->frame_rate() * 2; //2 second hardcoded postroll for now } else { postroll = 0; } @@ -1197,30 +1251,46 @@ CrossfadeEditor::audition (Audition which) right_length = xfade->in()->length(); } - boost::shared_ptr left (boost::dynamic_pointer_cast (RegionFactory::create (xfade->out(), left_start_offset, left_length, "xfade out", - 0, Region::DefaultFlags, false))); - boost::shared_ptr right (boost::dynamic_pointer_cast (RegionFactory::create (xfade->in(), 0, right_length, "xfade in", - 0, Region::DefaultFlags, false))); - - //apply a 20ms declicking fade at the start and end of auditioning - left->set_fade_in_active(true); - left->set_fade_in_length(session.frame_rate() / 50); - right->set_fade_out_active(true); - right->set_fade_out_length(session.frame_rate() / 50); + PropertyList left_plist; + PropertyList right_plist; - pl.add_region (left, 0); - pl.add_region (right, 1 + preroll); + left_plist.add (ARDOUR::Properties::start, left_start_offset); + left_plist.add (ARDOUR::Properties::length, left_length); + left_plist.add (ARDOUR::Properties::name, string ("xfade out")); + left_plist.add (ARDOUR::Properties::layer, 0); + left_plist.add (ARDOUR::Properties::fade_in_active, true); + + right_plist.add (ARDOUR::Properties::start, 0); + right_plist.add (ARDOUR::Properties::length, right_length); + right_plist.add (ARDOUR::Properties::name, string("xfade in")); + right_plist.add (ARDOUR::Properties::layer, 0); + right_plist.add (ARDOUR::Properties::fade_out_active, true); + if (which == Left) { - right->set_scale_amplitude (0.0); + right_plist.add (ARDOUR::Properties::scale_amplitude, 0.0f); } else if (which == Right) { - left->set_scale_amplitude (0.0); + left_plist.add (ARDOUR::Properties::scale_amplitude, 0.0f); } + boost::shared_ptr left (boost::dynamic_pointer_cast + (RegionFactory::create (xfade->out(), left_plist, false))); + boost::shared_ptr right (boost::dynamic_pointer_cast + (RegionFactory::create (xfade->in(), right_plist, false))); + + // apply a 20ms declicking fade at the start and end of auditioning + // XXX this should really be a property + + left->set_fade_in_length (_session->frame_rate() / 50); + right->set_fade_out_length (_session->frame_rate() / 50); + + pl.add_region (left, 0); + pl.add_region (right, 1 + preroll); + /* there is only one ... */ - pl.foreach_crossfade (this, &CrossfadeEditor::setup); + pl.foreach_crossfade (sigc::mem_fun (*this, &CrossfadeEditor::setup)); - session.audition_playlist (); + _session->audition_playlist (); } void @@ -1232,10 +1302,17 @@ CrossfadeEditor::audition_both () void CrossfadeEditor::audition_left_dry () { - boost::shared_ptr left (boost::dynamic_pointer_cast (RegionFactory::create (xfade->out(), xfade->out()->length() - xfade->length(), xfade->length(), "xfade left", - 0, Region::DefaultFlags, false))); + PropertyList plist; + + plist.add (ARDOUR::Properties::start, xfade->out()->length() - xfade->length()); + plist.add (ARDOUR::Properties::length, xfade->length()); + plist.add (ARDOUR::Properties::name, string("xfade left")); + plist.add (ARDOUR::Properties::layer, 0); - session.audition_region (left); + boost::shared_ptr left (boost::dynamic_pointer_cast + (RegionFactory::create (xfade->out(), plist, false))); + + _session->audition_region (left); } void @@ -1247,9 +1324,17 @@ CrossfadeEditor::audition_left () void CrossfadeEditor::audition_right_dry () { - boost::shared_ptr right (boost::dynamic_pointer_cast (RegionFactory::create (xfade->in(), 0, xfade->length(), "xfade in", - 0, Region::DefaultFlags, false))); - session.audition_region (right); + PropertyList plist; + + plist.add (ARDOUR::Properties::start, 0); + plist.add (ARDOUR::Properties::length, xfade->length()); + plist.add (ARDOUR::Properties::name, string ("xfade right")); + plist.add (ARDOUR::Properties::layer, 0); + + boost::shared_ptr right (boost::dynamic_pointer_cast + (RegionFactory::create (xfade->in(), plist, false))); + + _session->audition_region (right); } void @@ -1257,11 +1342,11 @@ CrossfadeEditor::audition_right () { audition (Right); } - + void CrossfadeEditor::cancel_audition () { - session.cancel_audition (); + _session->cancel_audition (); } void @@ -1269,7 +1354,7 @@ CrossfadeEditor::audition_toggled () { bool x; - if ((x = audition_both_button.get_active ()) != session.is_auditioning()) { + if ((x = audition_both_button.get_active ()) != _session->is_auditioning()) { if (x) { audition_both (); @@ -1283,8 +1368,8 @@ void CrossfadeEditor::audition_right_toggled () { bool x; - - if ((x = audition_right_button.get_active ()) != session.is_auditioning()) { + + if ((x = audition_right_button.get_active ()) != _session->is_auditioning()) { if (x) { audition_right (); @@ -1299,7 +1384,7 @@ CrossfadeEditor::audition_right_dry_toggled () { bool x; - if ((x = audition_right_dry_button.get_active ()) != session.is_auditioning()) { + if ((x = audition_right_dry_button.get_active ()) != _session->is_auditioning()) { if (x) { audition_right_dry (); @@ -1314,7 +1399,7 @@ CrossfadeEditor::audition_left_toggled () { bool x; - if ((x = audition_left_button.get_active ()) != session.is_auditioning()) { + if ((x = audition_left_button.get_active ()) != _session->is_auditioning()) { if (x) { audition_left (); @@ -1329,8 +1414,8 @@ CrossfadeEditor::audition_left_dry_toggled () { bool x; - if ((x = audition_left_dry_button.get_active ()) != session.is_auditioning()) { - + if ((x = audition_left_dry_button.get_active ()) != _session->is_auditioning()) { + if (x) { audition_left_dry (); } else { @@ -1340,7 +1425,7 @@ CrossfadeEditor::audition_left_dry_toggled () } bool -CrossfadeEditor::on_key_press_event (GdkEventKey *ev) +CrossfadeEditor::on_key_press_event (GdkEventKey */*ev*/) { return true; } @@ -1366,7 +1451,7 @@ CrossfadeEditor::on_key_release_event (GdkEventKey* ev) break; case GDK_space: - if (session.is_auditioning()) { + if (_session->is_auditioning()) { cancel_audition (); } else { audition_both_button.set_active (!audition_both_button.get_active());