X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fcrossfade_edit.cc;h=eb5cb2fba96879ac1838709a1002f1fa9d67106f;hb=2e1332f74f803a1be4c8bb4911266aef4b63f145;hp=c56f51fcfae88d02786adc53de68d1b9ceb2c141;hpb=30c08ba655330232767554c48bda1975bfb5628c;p=ardour.git diff --git a/gtk2_ardour/crossfade_edit.cc b/gtk2_ardour/crossfade_edit.cc index c56f51fcfa..eb5cb2fba9 100644 --- a/gtk2_ardour/crossfade_edit.cc +++ b/gtk2_ardour/crossfade_edit.cc @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include @@ -28,14 +27,16 @@ #include -#include -#include +#include +#include #include #include #include #include #include #include +#include +#include #include @@ -48,7 +49,7 @@ #include "canvas_impl.h" #include "simplerect.h" #include "waveview.h" -#include "color.h" +#include "actions.h" using namespace std; using namespace ARDOUR; @@ -66,12 +67,13 @@ CrossfadeEditor::Presets* CrossfadeEditor::fade_out_presets = 0; CrossfadeEditor::Half::Half () : line (0), - normative_curve (0.0, 1.0, 1.0, true), - gain_curve (0.0, 2.0, 1.0, true) + //normative_curve (Evoral::Parameter(GainAutomation, 0.0, 1.0, 1.0)), // FIXME: GainAutomation? + normative_curve (Evoral::Parameter(GainAutomation)), + gain_curve (Evoral::Parameter(GainAutomation)) { } -CrossfadeEditor::CrossfadeEditor (Session& s, Crossfade& xf, double my, double mxy) +CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, double my, double mxy) : ArdourDialog (_("ardour: x-fade edit")), xfade (xf), session (s), @@ -95,10 +97,12 @@ CrossfadeEditor::CrossfadeEditor (Session& s, Crossfade& xf, double my, double m select_in_button (_("Fade In")), select_out_button (_("Fade Out")) { - set_wmclass ("ardour_automationedit", "Ardour"); + set_wmclass (X_("ardour_automationedit"), "Ardour"); set_name ("CrossfadeEditWindow"); set_position (Gtk::WIN_POS_MOUSE); + add_accel_group (ActionManager::ui_manager->get_accel_group()); + add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::POINTER_MOTION_MASK); RadioButtonGroup sel_but_group = select_in_button.get_group(); @@ -129,23 +133,23 @@ CrossfadeEditor::CrossfadeEditor (Session& s, Crossfade& xf, double my, double m toplevel->property_x2() = 10.0; toplevel->property_y2() = 10.0; toplevel->property_fill() = true; - toplevel->property_fill_color_rgba() = color_map[cCrossfadeEditorBase]; + 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)); fade[Out].line = new ArdourCanvas::Line (*(canvas->root())); fade[Out].line->property_width_pixels() = 1; - fade[Out].line->property_fill_color_rgba() = color_map[cCrossfadeEditorLine]; + 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() = color_map[cCrossfadeEditorLineShading]; + 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() = color_map[cCrossfadeEditorLine]; + 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() = color_map[cCrossfadeEditorLineShading]; + 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)); @@ -193,11 +197,12 @@ CrossfadeEditor::CrossfadeEditor (Session& s, Crossfade& xf, double my, double m for (list::iterator i = fade_in_presets->begin(); i != fade_in_presets->end(); ++i) { - pxmap = manage (new Image (get_xpm((*i)->xpm))); + pxmap = manage (new Image (::get_icon ((*i)->image_name))); pbutton = manage (new Button); pbutton->add (*pxmap); pbutton->set_name ("CrossfadeEditButton"); pbutton->signal_clicked().connect (bind (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); @@ -214,11 +219,12 @@ CrossfadeEditor::CrossfadeEditor (Session& s, Crossfade& xf, double my, double m for (list::iterator i = fade_out_presets->begin(); i != fade_out_presets->end(); ++i) { - pxmap = manage (new Image (get_xpm((*i)->xpm))); + pxmap = manage (new Image (::get_icon ((*i)->image_name))); pbutton = manage (new Button); pbutton->add (*pxmap); pbutton->set_name ("CrossfadeEditButton"); pbutton->signal_clicked().connect (bind (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); @@ -278,14 +284,14 @@ CrossfadeEditor::CrossfadeEditor (Session& s, Crossfade& xf, double my, double m // vpacker.pack_start (*foobut, false, false); current = In; - set (xfade.fade_in(), In); + set (xfade->fade_in(), In); current = Out; - set (xfade.fade_out(), Out); + set (xfade->fade_out(), Out); curve_select_clicked (In); - xfade.StateChanged.connect (mem_fun(*this, &CrossfadeEditor::xfade_changed)); + xfade->StateChanged.connect (mem_fun(*this, &CrossfadeEditor::xfade_changed)); session.AuditionActive.connect (mem_fun(*this, &CrossfadeEditor::audition_state_changed)); show_all_children(); @@ -327,10 +333,10 @@ CrossfadeEditor::audition_state_changed (bool yn) } void -CrossfadeEditor::set (const ARDOUR::Curve& curve, WhichFade which) +CrossfadeEditor::set (const ARDOUR::AutomationList& curve, WhichFade which) { double firstx, endx; - ARDOUR::Curve::const_iterator the_end; + ARDOUR::AutomationList::const_iterator the_end; for (list::iterator i = fade[which].points.begin(); i != fade[which].points.end(); ++i) { delete *i; @@ -344,13 +350,13 @@ CrossfadeEditor::set (const ARDOUR::Curve& curve, WhichFade which) goto out; } - the_end = curve.const_end(); + the_end = curve.end(); --the_end; - firstx = (*curve.const_begin())->when; + firstx = (*curve.begin())->when; endx = (*the_end)->when; - for (ARDOUR::Curve::const_iterator i = curve.const_begin(); i != curve.const_end(); ++i) { + 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); @@ -398,7 +404,7 @@ CrossfadeEditor::point_event (GdkEvent* event, Point* point) if (Keyboard::is_delete_event (&event->button)) { fade[current].points.remove (point); delete point; - } + } redraw (); break; @@ -434,12 +440,12 @@ CrossfadeEditor::canvas_event (GdkEvent* event) case GDK_BUTTON_PRESS: add_control_point ((event->button.x - canvas_border)/effective_width(), 1.0 - ((event->button.y - canvas_border)/effective_height())); - return TRUE; + return true; break; default: break; } - return FALSE; + return false; } CrossfadeEditor::Point::~Point() @@ -454,8 +460,8 @@ CrossfadeEditor::make_point () p->box = new ArdourCanvas::SimpleRect (*(canvas->root())); p->box->property_fill() = true; - p->box->property_fill_color_rgba() = color_map[cCrossfadeEditorPointFill]; - p->box->property_outline_color_rgba() = color_map[cCrossfadeEditorPointOutline]; + p->box->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorPointFill.get(); + p->box->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorPointOutline.get(); p->box->property_outline_pixels() = 1; p->curve = fade[current].line; @@ -576,21 +582,21 @@ CrossfadeEditor::canvas_allocation (Gtk::Allocation& alloc) redraw (); current = old_current; - double spu = xfade.length() / (double) effective_width(); + double spu = xfade->length() / (double) effective_width(); if (fade[In].waves.empty()) { - make_waves (xfade.in(), In); + make_waves (xfade->in(), In); } if (fade[Out].waves.empty()) { - make_waves (xfade.out(), Out); + make_waves (xfade->out(), Out); } double ht; vector::iterator i; uint32_t n; - ht = canvas->get_allocation().get_height() / xfade.in().n_channels(); + ht = canvas->get_allocation().get_height() / xfade->in()->n_channels(); for (n = 0, i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i, ++n) { double yoff; @@ -602,7 +608,7 @@ CrossfadeEditor::canvas_allocation (Gtk::Allocation& alloc) (*i)->property_samples_per_unit() = spu; } - ht = canvas->get_allocation().get_height() / xfade.out().n_channels(); + ht = canvas->get_allocation().get_height() / xfade->out()->n_channels(); for (n = 0, i = fade[Out].waves.begin(); i != fade[Out].waves.end(); ++i, ++n) { double yoff; @@ -620,8 +626,8 @@ CrossfadeEditor::canvas_allocation (Gtk::Allocation& alloc) void CrossfadeEditor::xfade_changed (Change ignored) { - set (xfade.fade_in(), In); - set (xfade.fade_out(), Out); + set (xfade->fade_in(), In); + set (xfade->fade_out(), Out); } void @@ -631,20 +637,26 @@ CrossfadeEditor::redraw () return; } - jack_nframes_t len = xfade.length (); + nframes_t len = xfade->length (); fade[current].normative_curve.clear (); fade[current].gain_curve.clear (); for (list::iterator i = fade[current].points.begin(); i != fade[current].points.end(); ++i) { fade[current].normative_curve.add ((*i)->x, (*i)->y); - fade[current].gain_curve.add (((*i)->x * len), (*i)->y); + double offset; + if (current==In) + offset = xfade->in()->start(); + else + offset = xfade->out()->start()+xfade->out()->length()-xfade->length(); + fade[current].gain_curve.add (((*i)->x * len) + offset, (*i)->y); } + size_t npoints = (size_t) effective_width(); float vec[npoints]; - fade[current].normative_curve.get_vector (0, 1.0, vec, npoints); + fade[current].normative_curve.curve().get_vector (0, 1.0, vec, npoints); ArdourCanvas::Points pts; ArdourCanvas::Points spts; @@ -697,8 +709,6 @@ CrossfadeEditor::redraw () } - // GTK2FIX some odd math to fix up here - size_t last_spt = (npoints + 3) - 1; for (size_t i = 0; i < npoints; ++i) { @@ -723,6 +733,20 @@ CrossfadeEditor::redraw () 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; } @@ -742,19 +766,19 @@ CrossfadeEditor::apply_preset (Preset *preset) void CrossfadeEditor::apply () { - _apply_to (&xfade); + _apply_to (xfade); } void -CrossfadeEditor::_apply_to (Crossfade* xf) +CrossfadeEditor::_apply_to (boost::shared_ptr xf) { - ARDOUR::Curve& in (xf->fade_in()); - ARDOUR::Curve& out (xf->fade_out()); + ARDOUR::AutomationList& in (xf->fade_in()); + ARDOUR::AutomationList& out (xf->fade_out()); /* IN */ - ARDOUR::Curve::const_iterator the_end = in.const_end(); + ARDOUR::AutomationList::const_iterator the_end = in.end(); --the_end; double firstx = (*in.begin())->when; @@ -774,7 +798,7 @@ CrossfadeEditor::_apply_to (Crossfade* xf) /* OUT */ - the_end = out.const_end(); + the_end = out.end(); --the_end; firstx = (*out.begin())->when; @@ -797,12 +821,12 @@ CrossfadeEditor::_apply_to (Crossfade* xf) } void -CrossfadeEditor::setup (Crossfade* xfade) +CrossfadeEditor::setup (boost::shared_ptr xfade) { _apply_to (xfade); xfade->set_active (true); - xfade->fade_in().solve (); - xfade->fade_out().solve (); + xfade->fade_in().curve().solve (); + xfade->fade_out().curve().solve (); } void @@ -820,8 +844,10 @@ CrossfadeEditor::clear () void CrossfadeEditor::reset () { - set (xfade.fade_in(), In); - set (xfade.fade_out(), Out); + set (xfade->fade_in(), In); + set (xfade->fade_out(), Out); + + curve_select_clicked (current); } void @@ -833,97 +859,161 @@ CrossfadeEditor::build_presets () fade_out_presets = new Presets; /* FADE OUT */ - p = new Preset ("hiin.xpm"); - 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 ("Linear (-6dB)", "crossfade_in_dipped"); p->push_back (PresetPoint (0, 0)); - p->push_back (PresetPoint (0.389401, 0.0333333)); - p->push_back (PresetPoint (0.629032, 0.0861111)); - p->push_back (PresetPoint (0.829493, 0.233333)); - p->push_back (PresetPoint (0.9447, 0.483333)); - p->push_back (PresetPoint (0.976959, 0.697222)); - p->push_back (PresetPoint (1, 1)); + p->push_back (PresetPoint (0.000000, 0.000000)); + p->push_back (PresetPoint (0.166667, 0.166366)); + p->push_back (PresetPoint (0.333333, 0.332853)); + p->push_back (PresetPoint (0.500000, 0.499459)); + p->push_back (PresetPoint (0.666667, 0.666186)); + p->push_back (PresetPoint (0.833333, 0.833033)); + p->push_back (PresetPoint (1.000000, 1.000000)); fade_in_presets->push_back (p); - p = new Preset ("regin.xpm"); + p = new Preset ("S(1)-curve", "crossfade_in_default"); 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 (0.1, 0.01)); + p->push_back (PresetPoint (0.2, 0.03)); + p->push_back (PresetPoint (0.8, 0.97)); + p->push_back (PresetPoint (0.9, 0.99)); p->push_back (PresetPoint (1, 1)); fade_in_presets->push_back (p); - p = new Preset ("regin2.xpm"); - p->push_back (PresetPoint (0, 0)); - p->push_back (PresetPoint (0.304147, 0.0694444)); - p->push_back (PresetPoint (0.529954, 0.152778)); - p->push_back (PresetPoint (0.725806, 0.333333)); - p->push_back (PresetPoint (0.847926, 0.558333)); - p->push_back (PresetPoint (0.919355, 0.730556)); - p->push_back (PresetPoint (1, 1)); + p = new Preset ("S(2)-curve", "crossfade_in_default"); + p->push_back (PresetPoint (0.0, 0.0)); + p->push_back (PresetPoint (0.055, 0.222)); + p->push_back (PresetPoint (0.163, 0.35)); + p->push_back (PresetPoint (0.837, 0.678)); + p->push_back (PresetPoint (0.945, 0.783)); + p->push_back (PresetPoint (1.0, 1.0)); fade_in_presets->push_back (p); - p = new Preset ("linin.xpm"); - p->push_back (PresetPoint (0, 0)); - p->push_back (PresetPoint (1, 1)); + p = new Preset ("Constant Power (-3dB)", "crossfade_in_constant"); + + p->push_back (PresetPoint (0.000000, 0.000000)); + p->push_back (PresetPoint (0.166667, 0.282192)); + p->push_back (PresetPoint (0.333333, 0.518174)); + p->push_back (PresetPoint (0.500000, 0.707946)); + p->push_back (PresetPoint (0.666667, 0.851507)); + p->push_back (PresetPoint (0.833333, 0.948859)); + p->push_back (PresetPoint (1.000000, 1.000000)); + 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->push_back (PresetPoint (0, 0)); + p->push_back (PresetPoint (0.389401, 0.0333333)); + p->push_back (PresetPoint (0.629032, 0.0861111)); + p->push_back (PresetPoint (0.829493, 0.233333)); + p->push_back (PresetPoint (0.9447, 0.483333)); + 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->push_back (PresetPoint (0, 0)); + p->push_back (PresetPoint (0.304147, 0.0694444)); + p->push_back (PresetPoint (0.529954, 0.152778)); + p->push_back (PresetPoint (0.725806, 0.333333)); + p->push_back (PresetPoint (0.847926, 0.558333)); + p->push_back (PresetPoint (0.919355, 0.730556)); + p->push_back (PresetPoint (1, 1)); + fade_in_presets->push_back (p); + } + /* FADE OUT */ - p = new Preset ("hiout.xpm"); + // p = new Preset ("regout.xpm"); + p = new Preset ("Linear (-6dB cut)", "crossfade_out_dipped"); p->push_back (PresetPoint (0, 1)); - p->push_back (PresetPoint (0.305556, 1)); - p->push_back (PresetPoint (0.548611, 0.991736)); - p->push_back (PresetPoint (0.759259, 0.931129)); - p->push_back (PresetPoint (0.918981, 0.68595)); - p->push_back (PresetPoint (0.976852, 0.22865)); - p->push_back (PresetPoint (1, 0)); - fade_out_presets->push_back (p); - - p = new Preset ("regout.xpm"); - p->push_back (PresetPoint (0, 1)); - 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)); + p->push_back (PresetPoint (0.000000, 1.000000)); + p->push_back (PresetPoint (0.166667, 0.833033)); + p->push_back (PresetPoint (0.333333, 0.666186)); + p->push_back (PresetPoint (0.500000, 0.499459)); + p->push_back (PresetPoint (0.666667, 0.332853)); + p->push_back (PresetPoint (0.833333, 0.166366)); + p->push_back (PresetPoint (1.000000, 0.000000)); fade_out_presets->push_back (p); - p = new Preset ("loout.xpm"); + p = new Preset ("S(1)-Curve", "crossfade_out_default"); 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.1, 0.99)); + p->push_back (PresetPoint (0.2, 0.97)); + p->push_back (PresetPoint (0.8, 0.03)); + p->push_back (PresetPoint (0.9, 0.01)); p->push_back (PresetPoint (1, 0)); fade_out_presets->push_back (p); - p = new Preset ("regout2.xpm"); - p->push_back (PresetPoint (0, 1)); - p->push_back (PresetPoint (0.080645, 0.730556)); - p->push_back (PresetPoint (0.277778, 0.289256)); - p->push_back (PresetPoint (0.470046, 0.152778)); - p->push_back (PresetPoint (0.695853, 0.0694444)); - p->push_back (PresetPoint (1, 0)); + p = new Preset ("S(2)-Curve", "crossfade_out_default"); + p->push_back (PresetPoint (0.0, 1.0)); + p->push_back (PresetPoint (0.163, 0.678)); + p->push_back (PresetPoint (0.055, 0.783)); + p->push_back (PresetPoint (0.837, 0.35)); + p->push_back (PresetPoint (0.945, 0.222)); + p->push_back (PresetPoint (1.0, 0.0)); fade_out_presets->push_back (p); - p = new Preset ("linout.xpm"); - p->push_back (PresetPoint (0, 1)); - p->push_back (PresetPoint (1, 0)); + // p = new Preset ("linout.xpm"); + p = new Preset ("Constant Power (-3dB cut)", "crossfade_out_constant"); + p->push_back (PresetPoint (0.000000, 1.000000)); + p->push_back (PresetPoint (0.166667, 0.948859)); + p->push_back (PresetPoint (0.333333, 0.851507)); + p->push_back (PresetPoint (0.500000, 0.707946)); + p->push_back (PresetPoint (0.666667, 0.518174)); + 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->push_back (PresetPoint (0, 1)); + p->push_back (PresetPoint (0.305556, 1)); + p->push_back (PresetPoint (0.548611, 0.991736)); + p->push_back (PresetPoint (0.759259, 0.931129)); + p->push_back (PresetPoint (0.918981, 0.68595)); + 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->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); + + // p = new Preset ("regout2.xpm"); + p = new Preset ("Slow Fade", "crossfade_out_slow-fade"); + p->push_back (PresetPoint (0, 1)); + p->push_back (PresetPoint (0.080645, 0.730556)); + p->push_back (PresetPoint (0.277778, 0.289256)); + p->push_back (PresetPoint (0.470046, 0.152778)); + p->push_back (PresetPoint (0.695853, 0.0694444)); + p->push_back (PresetPoint (1, 0)); + fade_out_presets->push_back (p); + } } void @@ -934,15 +1024,17 @@ CrossfadeEditor::curve_select_clicked (WhichFade wf) if (wf == In) { for (vector::iterator i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i) { - (*i)->property_wave_color() = color_map[cSelectedCrossfadeEditorWave]; + (*i)->property_wave_color() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get(); + (*i)->property_fill_color() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get(); } for (vector::iterator i = fade[Out].waves.begin(); i != fade[Out].waves.end(); ++i) { - (*i)->property_wave_color() = color_map[cCrossfadeEditorWave]; + (*i)->property_wave_color() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorWave.get(); + (*i)->property_fill_color() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorWave.get(); } - fade[In].line->property_fill_color_rgba() = color_map[cSelectedCrossfadeEditorLine]; - fade[Out].line->property_fill_color_rgba() = color_map[cCrossfadeEditorLine]; + fade[In].line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorLine.get(); + fade[Out].line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorLine.get(); fade[Out].shading->hide(); fade[In].shading->show(); @@ -954,26 +1046,20 @@ CrossfadeEditor::curve_select_clicked (WhichFade wf) (*i)->box->show (); } - for (vector::iterator i = fade_out_buttons.begin(); i != fade_out_buttons.end(); ++i) { - (*i)->set_sensitive (false); - } - - for (vector::iterator i = fade_in_buttons.begin(); i != fade_in_buttons.end(); ++i) { - (*i)->set_sensitive (true); - } - } else { for (vector::iterator i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i) { - (*i)->property_wave_color() = color_map[cCrossfadeEditorWave]; + (*i)->property_wave_color() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorWave.get(); + (*i)->property_fill_color() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorWave.get(); } for (vector::iterator i = fade[Out].waves.begin(); i != fade[Out].waves.end(); ++i) { - (*i)->property_wave_color() = color_map[cSelectedCrossfadeEditorWave]; + (*i)->property_wave_color() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get(); + (*i)->property_fill_color() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get(); } - fade[Out].line->property_fill_color_rgba() = color_map[cSelectedCrossfadeEditorLine]; - fade[In].line->property_fill_color_rgba() = color_map[cCrossfadeEditorLine]; + fade[Out].line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorLine.get(); + fade[In].line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorLine.get(); fade[In].shading->hide(); fade[Out].shading->show(); @@ -985,14 +1071,6 @@ CrossfadeEditor::curve_select_clicked (WhichFade wf) (*i)->box->show(); } - for (vector::iterator i = fade_out_buttons.begin(); i != fade_out_buttons.end(); ++i) { - (*i)->set_sensitive (true); - } - - for (vector::iterator i = fade_in_buttons.begin(); i != fade_in_buttons.end(); ++i) { - (*i)->set_sensitive (false); - } - } } @@ -1001,7 +1079,7 @@ CrossfadeEditor::x_coordinate (double& xfract) const { xfract = min (1.0, xfract); xfract = max (0.0, xfract); - + return canvas_border + (xfract * effective_width()); } @@ -1015,31 +1093,30 @@ CrossfadeEditor::y_coordinate (double& yfract) const } void -CrossfadeEditor::make_waves (AudioRegion& region, WhichFade which) +CrossfadeEditor::make_waves (boost::shared_ptr region, WhichFade which) { gdouble ht; - uint32_t nchans = region.n_channels(); + uint32_t nchans = region->n_channels(); guint32 color; double spu; if (which == In) { - color = color_map[cSelectedCrossfadeEditorWave]; + color = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get(); } else { - color = color_map[cCrossfadeEditorWave]; + color = ARDOUR_UI::config()->canvasvar_CrossfadeEditorWave.get(); } ht = canvas->get_allocation().get_height() / (double) nchans; - spu = xfade.length() / (double) effective_width(); + spu = xfade->length() / (double) effective_width(); 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), ®ion, which), peaks_ready_connection)) { - + if (region->audio_source(n)->peaks_ready (bind (mem_fun(*this, &CrossfadeEditor::peaks_ready), region, which), peaks_ready_connection)) { WaveView* waveview = new WaveView (*(canvas->root())); - waveview->property_data_src() = ®ion; + waveview->property_data_src() = region.get(); waveview->property_cache_updater() = true; waveview->property_cache() = WaveView::create_cache(); waveview->property_channel() = n; @@ -1054,7 +1131,13 @@ CrossfadeEditor::make_waves (AudioRegion& region, WhichFade which) waveview->property_samples_per_unit() = spu; 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 + waveview->property_region_start() = region->start()+region->length()-xfade->length(); + waveview->lower_to_bottom(); fade[which].waves.push_back (waveview); } @@ -1064,131 +1147,115 @@ CrossfadeEditor::make_waves (AudioRegion& region, WhichFade which) } void -CrossfadeEditor::peaks_ready (AudioRegion* r, WhichFade which) +CrossfadeEditor::peaks_ready (boost::shared_ptr r, WhichFade which) { /* 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 (); - make_waves (*r, which); + make_waves (r, which); } void -CrossfadeEditor::audition_both () +CrossfadeEditor::audition (Audition which) { AudioPlaylist& pl (session.the_auditioner()->prepare_playlist()); - jack_nframes_t preroll; - jack_nframes_t postroll; - jack_nframes_t length; - jack_nframes_t left_start_offset; - jack_nframes_t right_length; - jack_nframes_t left_length; - - if (preroll_button.get_active()) { - preroll = ARDOUR_UI::instance()->preroll_clock.current_duration (); + nframes_t preroll; + nframes_t postroll; + nframes_t left_start_offset; + nframes_t right_length; + nframes_t left_length; + + if (which != Right && preroll_button.get_active()) { + preroll = session.frame_rate() * 2; //2 second hardcoded preroll for now } else { preroll = 0; } - if (postroll_button.get_active()) { - postroll = ARDOUR_UI::instance()->postroll_clock.current_duration (); + if (which != Left && postroll_button.get_active()) { + postroll = session.frame_rate() * 2; //2 second hardcoded postroll for now } else { postroll = 0; } - if ((left_start_offset = xfade.out().length() - xfade.length()) >= preroll) { - left_start_offset -= preroll; - } - - length = 0; - - if ((left_length = xfade.length()) < xfade.out().length() - left_start_offset) { - length += postroll; - } - - right_length = xfade.length(); + // Is there enough data for the whole preroll? + left_length = xfade->length(); + if ((left_start_offset = xfade->out()->length() - xfade->length()) > preroll) { + left_start_offset -= preroll; + } else { + preroll = left_start_offset; + left_start_offset = 0; + } + left_length += preroll; - if (xfade.in().length() - right_length < postroll) { + // Is there enough data for the whole postroll? + right_length = xfade->length(); + if ((xfade->in()->length() - right_length) > postroll) { right_length += postroll; + } else { + right_length = xfade->in()->length(); } - AudioRegion* left = new AudioRegion (xfade.out(), left_start_offset, left_length, "xfade out", - 0, Region::DefaultFlags, false); - AudioRegion* right = new AudioRegion (xfade.in(), 0, right_length, "xfade in", - 0, Region::DefaultFlags, false); + 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); + + pl.add_region (left, 0); + pl.add_region (right, 1 + preroll); - pl.add_region (*left, 0); - pl.add_region (*right, 1+preroll); + if (which == Left) { + right->set_scale_amplitude (0.0); + } else if (which == Right) { + left->set_scale_amplitude (0.0); + } /* there is only one ... */ - pl.foreach_crossfade (this, &CrossfadeEditor::setup); session.audition_playlist (); } +void +CrossfadeEditor::audition_both () +{ + audition (Both); +} + void CrossfadeEditor::audition_left_dry () { - AudioRegion* left = new AudioRegion (xfade.out(), xfade.out().length() - xfade.length(), xfade.length(), "xfade left", - 0, Region::DefaultFlags, false); + 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))); - session.audition_region (*left); + session.audition_region (left); } void CrossfadeEditor::audition_left () { - AudioPlaylist& pl (session.the_auditioner()->prepare_playlist()); - - AudioRegion* left = new AudioRegion (xfade.out(), xfade.out().length() - xfade.length(), xfade.length(), "xfade left", - 0, Region::DefaultFlags, false); - AudioRegion* right = new AudioRegion (xfade.in(), 0, xfade.length(), "xfade in", - 0, Region::DefaultFlags, false); - - pl.add_region (*left, 0); - pl.add_region (*right, 1); - - right->set_muted (true); - - /* there is only one ... */ - - pl.foreach_crossfade (this, &CrossfadeEditor::setup); - - session.audition_playlist (); - - /* memory leak for regions */ + audition (Left); } void CrossfadeEditor::audition_right_dry () { - AudioRegion* right = new AudioRegion (xfade.in(), 0, xfade.length(), "xfade in", - 0, Region::DefaultFlags, false); - session.audition_region (*right); + 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); } void CrossfadeEditor::audition_right () { - AudioPlaylist& pl (session.the_auditioner()->prepare_playlist()); - - AudioRegion* left = new AudioRegion (xfade.out(), xfade.out().length() - xfade.length(), xfade.length(), "xfade out", - 0, Region::DefaultFlags, false); - AudioRegion* right = new AudioRegion (xfade.out(), 0, xfade.length(), "xfade out", - 0, Region::DefaultFlags, false); - - pl.add_region (*left, 0); - pl.add_region (*right, 1); - - left->set_muted (true); - - /* there is only one ... */ - - pl.foreach_crossfade (this, &CrossfadeEditor::setup); - - session.audition_playlist (); + audition (Right); } void @@ -1271,3 +1338,44 @@ CrossfadeEditor::audition_left_dry_toggled () } } } + +bool +CrossfadeEditor::on_key_press_event (GdkEventKey *ev) +{ + return true; +} + +bool +CrossfadeEditor::on_key_release_event (GdkEventKey* ev) +{ + switch (ev->keyval) { + case GDK_Right: + if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { + audition_right_dry_button.set_active (!audition_right_dry_button.get_active()); + } else { + audition_right_button.set_active (!audition_right_button.get_active()); + } + break; + + case GDK_Left: + if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { + audition_left_dry_button.set_active (!audition_left_dry_button.get_active()); + } else { + audition_left_button.set_active (!audition_left_button.get_active()); + } + break; + + case GDK_space: + if (session.is_auditioning()) { + cancel_audition (); + } else { + audition_both_button.set_active (!audition_both_button.get_active()); + } + break; + + default: + break; + } + + return true; +}