X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fcrossfade_edit.cc;h=3c67c62f68575fcfe7cb942f4a7882bd44210716;hb=b5ec66ae6cb60fa43c343d3d29340b2370d0b9d1;hp=1b4110be50afbf1eef12c4ebb534b60ce9150ccd;hpb=670641c3df89af73de36efa5b0a184c2430275b0;p=ardour.git diff --git a/gtk2_ardour/crossfade_edit.cc b/gtk2_ardour/crossfade_edit.cc index 1b4110be50..3c67c62f68 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,13 +27,15 @@ #include -#include -#include +#include +#include #include #include #include #include +#include #include +#include #include @@ -47,10 +48,10 @@ #include "canvas_impl.h" #include "simplerect.h" #include "waveview.h" -#include "color.h" using namespace std; using namespace ARDOUR; +using namespace PBD; using namespace Gtk; using namespace sigc; using namespace Editing; @@ -64,12 +65,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), @@ -93,7 +95,7 @@ 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); @@ -127,23 +129,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)); @@ -191,7 +193,7 @@ 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"); @@ -212,7 +214,7 @@ 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"); @@ -276,14 +278,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(); @@ -325,10 +327,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; @@ -342,13 +344,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); @@ -432,12 +434,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() @@ -452,8 +454,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; @@ -574,21 +576,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; @@ -600,7 +602,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; @@ -618,8 +620,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 @@ -629,20 +631,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; @@ -695,8 +703,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) { @@ -721,6 +727,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; } @@ -740,19 +760,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; @@ -772,7 +792,7 @@ CrossfadeEditor::_apply_to (Crossfade* xf) /* OUT */ - the_end = out.const_end(); + the_end = out.end(); --the_end; firstx = (*out.begin())->when; @@ -795,12 +815,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 @@ -818,8 +838,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 @@ -831,7 +853,8 @@ CrossfadeEditor::build_presets () fade_out_presets = new Presets; /* FADE OUT */ - p = new Preset ("hiin.xpm"); + // p = new Preset ("hiin.xpm"); + p = new Preset ("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)); @@ -842,7 +865,8 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1, 1)); fade_in_presets->push_back (p); - p = new Preset ("loin.xpm"); + // p = new Preset ("loin.xpm"); + p = new Preset ("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)); @@ -852,7 +876,8 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1, 1)); fade_in_presets->push_back (p); - p = new Preset ("regin.xpm"); + // p = new Preset ("regin.xpm"); + p = new Preset ("crossfade_in_constant"); p->push_back (PresetPoint (0, 0)); p->push_back (PresetPoint (0.0737327, 0.308333)); p->push_back (PresetPoint (0.246544, 0.658333)); @@ -862,7 +887,8 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1, 1)); fade_in_presets->push_back (p); - p = new Preset ("regin2.xpm"); + // p = new Preset ("regin2.xpm"); + p = new Preset ("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)); @@ -872,14 +898,25 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1, 1)); fade_in_presets->push_back (p); - p = new Preset ("linin.xpm"); + // p = new Preset ("linin.xpm"); + p = new Preset ("crossfade_in_dipped"); p->push_back (PresetPoint (0, 0)); p->push_back (PresetPoint (1, 1)); fade_in_presets->push_back (p); + p = new Preset ("crossfade_in_default"); + p->push_back (PresetPoint (0, 0)); + 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); + /* FADE OUT */ - p = new Preset ("hiout.xpm"); + // p = new Preset ("hiout.xpm"); + p = new Preset ("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)); @@ -889,17 +926,8 @@ CrossfadeEditor::build_presets () 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)); - fade_out_presets->push_back (p); - - p = new Preset ("loout.xpm"); + // p = new Preset ("loout.xpm"); + p = new Preset ("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)); @@ -909,7 +937,19 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1, 0)); fade_out_presets->push_back (p); - p = new Preset ("regout2.xpm"); + // p = new Preset ("regout.xpm"); + p = new Preset ("crossfade_out_constant"); + 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)); + fade_out_presets->push_back (p); + + // p = new Preset ("regout2.xpm"); + p = new Preset ("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)); @@ -918,8 +958,18 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1, 0)); fade_out_presets->push_back (p); - p = new Preset ("linout.xpm"); + // p = new Preset ("linout.xpm"); + p = new Preset ("crossfade_out_dipped"); + p->push_back (PresetPoint (0, 1)); + p->push_back (PresetPoint (1, 0)); + fade_out_presets->push_back (p); + + p = new Preset ("crossfade_out_default"); p->push_back (PresetPoint (0, 1)); + 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); } @@ -932,15 +982,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(); @@ -952,26 +1004,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(); @@ -980,15 +1026,7 @@ CrossfadeEditor::curve_select_clicked (WhichFade wf) } for (list::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) { - (*i)->box->hide(); - } - - 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); + (*i)->box->show(); } } @@ -1013,31 +1051,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.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; @@ -1052,7 +1089,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); } @@ -1062,131 +1105,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 (); + 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; + + 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))); - pl.add_region (*left, 0); - pl.add_region (*right, 1+preroll); + //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); + + 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