X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fcrossfade_edit.cc;h=3c67c62f68575fcfe7cb942f4a7882bd44210716;hb=b5ec66ae6cb60fa43c343d3d29340b2370d0b9d1;hp=26d61035ba566447abfd8a0e3ba5589c8d1970d6;hpb=2a52135c663e9a60b5f0cc9cc6673799c3ea5549;p=ardour.git diff --git a/gtk2_ardour/crossfade_edit.cc b/gtk2_ardour/crossfade_edit.cc index 26d61035ba..3c67c62f68 100644 --- a/gtk2_ardour/crossfade_edit.cc +++ b/gtk2_ardour/crossfade_edit.cc @@ -27,8 +27,8 @@ #include -#include -#include +#include +#include #include #include #include @@ -48,7 +48,6 @@ #include "canvas_impl.h" #include "simplerect.h" #include "waveview.h" -#include "color.h" using namespace std; using namespace ARDOUR; @@ -66,8 +65,9 @@ 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)) { } @@ -129,23 +129,23 @@ CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr xf, d 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)); @@ -327,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; @@ -344,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); @@ -434,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() @@ -454,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; @@ -638,13 +638,19 @@ CrossfadeEditor::redraw () 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; @@ -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; } @@ -746,13 +766,13 @@ CrossfadeEditor::apply () void 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 (boost::shared_ptr xf) /* OUT */ - the_end = out.const_end(); + the_end = out.end(); --the_end; firstx = (*out.begin())->when; @@ -799,8 +819,8 @@ 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,6 +840,8 @@ CrossfadeEditor::reset () { set (xfade->fade_in(), In); set (xfade->fade_out(), Out); + + curve_select_clicked (current); } void @@ -882,6 +904,15 @@ CrossfadeEditor::build_presets () 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"); @@ -895,17 +926,6 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1, 0)); fade_out_presets->push_back (p); - // 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 ("loout.xpm"); p = new Preset ("crossfade_out_transition"); p->push_back (PresetPoint (0, 1)); @@ -917,6 +937,17 @@ CrossfadeEditor::build_presets () p->push_back (PresetPoint (1, 0)); fade_out_presets->push_back (p); + // 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)); @@ -932,6 +963,15 @@ CrossfadeEditor::build_presets () 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); } void @@ -942,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(); @@ -962,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(); @@ -993,14 +1029,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); - } - } } @@ -1031,9 +1059,9 @@ CrossfadeEditor::make_waves (boost::shared_ptr region, WhichFade wh 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; @@ -1061,7 +1089,13 @@ CrossfadeEditor::make_waves (boost::shared_ptr region, WhichFade wh 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); } @@ -1082,42 +1116,43 @@ CrossfadeEditor::peaks_ready (boost::shared_ptr r, WhichFade which) } void -CrossfadeEditor::audition_both () +CrossfadeEditor::audition (Audition which) { AudioPlaylist& pl (session.the_auditioner()->prepare_playlist()); nframes_t preroll; nframes_t postroll; - nframes_t length; nframes_t left_start_offset; nframes_t right_length; nframes_t left_length; - if (preroll_button.get_active()) { - preroll = ARDOUR_UI::instance()->preroll_clock.current_duration (); + 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; - } + // 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; + // Is there enough data for the whole postroll? right_length = xfade->length(); - - if (xfade->in()->length() - right_length < postroll) { + if ((xfade->in()->length() - right_length) > postroll) { right_length += postroll; + } else { + right_length = xfade->in()->length(); } boost::shared_ptr left (boost::dynamic_pointer_cast (RegionFactory::create (xfade->out(), left_start_offset, left_length, "xfade out", @@ -1125,16 +1160,33 @@ CrossfadeEditor::audition_both () 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 (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 () { @@ -1147,25 +1199,7 @@ CrossfadeEditor::audition_left_dry () void CrossfadeEditor::audition_left () { - AudioPlaylist& pl (session.the_auditioner()->prepare_playlist()); - - 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))); - boost::shared_ptr right (boost::dynamic_pointer_cast (RegionFactory::create (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 @@ -1179,23 +1213,7 @@ CrossfadeEditor::audition_right_dry () void CrossfadeEditor::audition_right () { - AudioPlaylist& pl (session.the_auditioner()->prepare_playlist()); - - boost::shared_ptr left (boost::dynamic_pointer_cast (RegionFactory::create (xfade->out(), xfade->out()->length() - xfade->length(), xfade->length(), "xfade out", - 0, Region::DefaultFlags, false))); - boost::shared_ptr right (boost::dynamic_pointer_cast (RegionFactory::create (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