From: Paul Davis Date: Tue, 1 May 2012 03:22:04 +0000 (+0000) Subject: mostly backup-oriented commit to preserve very initial pass at rendering fades-as... X-Git-Tag: 3.0~1569 X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;h=a47ec8ba590d1fe663a64a50b02b1f6b61fd5743;p=ardour.git mostly backup-oriented commit to preserve very initial pass at rendering fades-as-xfades in a more useful way. quite a bit of work to do here git-svn-id: svn://localhost/ardour2/branches/3.0@12129 d708f5d6-7413-0410-9779-e7cbd77b26cf --- diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index 70966b1dff..885af4cd38 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -20,6 +20,8 @@ #include #include +#include + #include #include @@ -73,6 +75,12 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView , fade_in_handle(0) , fade_out_handle(0) , fade_position_line(0) + , start_xfade_in (0) + , start_xfade_out (0) + , start_xfade_rect (0) + , end_xfade_in (0) + , end_xfade_out (0) + , end_xfade_rect (0) , _amplitude_above_axis(1.0) , _flags(0) , fade_color(0) @@ -89,6 +97,12 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView , fade_in_handle(0) , fade_out_handle(0) , fade_position_line(0) + , start_xfade_in (0) + , start_xfade_out (0) + , start_xfade_rect (0) + , end_xfade_in (0) + , end_xfade_out (0) + , end_xfade_rect (0) , _amplitude_above_axis(1.0) , _flags(0) , fade_color(0) @@ -102,6 +116,12 @@ AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_pt , fade_in_handle(0) , fade_out_handle(0) , fade_position_line(0) + , start_xfade_in (0) + , start_xfade_out (0) + , start_xfade_rect (0) + , end_xfade_in (0) + , end_xfade_out (0) + , end_xfade_rect (0) , _amplitude_above_axis (other._amplitude_above_axis) , _flags (other._flags) , fade_color(0) @@ -534,10 +554,24 @@ AudioRegionView::reset_fade_in_shape () void AudioRegionView::reset_fade_in_shape_width (framecnt_t width) { + if (audio_region()->fade_in_is_xfade()) { + fade_in_handle->hide (); + fade_in_shape->hide (); + redraw_start_xfade (); + return; + } else { + if (start_xfade_in) { + start_xfade_in->hide (); + start_xfade_out->hide (); + } + } + if (fade_in_handle == 0) { return; } + fade_in_handle->show (); + /* smallest size for a fade is 64 frames */ width = std::max ((framecnt_t) 64, width); @@ -621,10 +655,24 @@ AudioRegionView::reset_fade_out_shape () void AudioRegionView::reset_fade_out_shape_width (framecnt_t width) { + if (audio_region()->fade_out_is_xfade()) { + fade_out_handle->hide (); + fade_out_shape->hide (); + redraw_end_xfade (); + return; + } else { + if (end_xfade_in) { + end_xfade_in->hide (); + end_xfade_out->hide (); + } + } + if (fade_out_handle == 0) { return; } + fade_out_handle->show (); + /* smallest size for a fade is 64 frames */ width = std::max ((framecnt_t) 64, width); @@ -1465,3 +1513,151 @@ AudioRegionView::thaw_after_trim () unhide_envelope (); } + +void +AudioRegionView::redraw_start_xfade () +{ + boost::shared_ptr ar (audio_region()); + + if (!ar->fade_in() || ar->fade_in()->empty()) { + return; + } + + int32_t const npoints = trackview.editor().frame_to_pixel (ar->fade_in()->back()->when); + + if (npoints < 3) { + return; + } + + if (!start_xfade_in) { + start_xfade_in = new ArdourCanvas::Line (*group); + start_xfade_in->property_width_pixels() = 1; + start_xfade_in->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_GainLine.get(); + } + + if (!start_xfade_out) { + start_xfade_out = new ArdourCanvas::Line (*group); + start_xfade_out->property_width_pixels() = 1; + start_xfade_out->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_GainLine.get(); + } + + Points* points = get_canvas_points ("xfade edit redraw", npoints); + boost::scoped_ptr vec (new float[npoints]); + + ar->fade_in()->curve().get_vector (0, ar->fade_in()->back()->when, vec.get(), npoints); + + for (int i = 0, pci = 0; i < npoints; ++i) { + Gnome::Art::Point &p ((*points)[pci++]); + p.set_x (i); + p.set_y (_height - (_height * vec.get()[i])); + } + + start_xfade_in->property_points() = *points; + start_xfade_in->show (); + start_xfade_in->raise_to_top (); + + /* fade out line */ + + boost::shared_ptr inverse = ar->inverse_fade_in(); + + if (!inverse) { + + for (int i = 0, pci = 0; i < npoints; ++i) { + Gnome::Art::Point &p ((*points)[pci++]); + p.set_x (i); + p.set_y (_height - (_height * (1.0 - vec.get()[i]))); + } + + } else { + + inverse->curve().get_vector (0, inverse->back()->when, vec.get(), npoints); + + for (int i = 0, pci = 0; i < npoints; ++i) { + Gnome::Art::Point &p ((*points)[pci++]); + p.set_x (i); + p.set_y (_height - (_height * vec.get()[i])); + } + } + + start_xfade_out->property_points() = *points; + start_xfade_out->show (); + start_xfade_out->raise_to_top (); + + delete points; +} + +void +AudioRegionView::redraw_end_xfade () +{ + boost::shared_ptr ar (audio_region()); + + if (!ar->fade_out() || ar->fade_out()->empty()) { + return; + } + + int32_t const npoints = trackview.editor().frame_to_pixel (ar->fade_out()->back()->when); + + if (npoints < 3) { + return; + } + + if (!end_xfade_in) { + end_xfade_in = new ArdourCanvas::Line (*group); + end_xfade_in->property_width_pixels() = 1; + end_xfade_in->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_GainLine.get(); + } + + if (!end_xfade_out) { + end_xfade_out = new ArdourCanvas::Line (*group); + end_xfade_out->property_width_pixels() = 1; + end_xfade_out->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_GainLine.get(); + } + + Points* points = get_canvas_points ("xfade edit redraw", npoints); + boost::scoped_ptr vec (new float[npoints]); + + ar->fade_out()->curve().get_vector (0, ar->fade_out()->back()->when, vec.get(), npoints); + + double rend = trackview.editor().frame_to_pixel (_region->length() - ar->fade_out()->back()->when); + + for (int i = 0, pci = 0; i < npoints; ++i) { + Gnome::Art::Point &p ((*points)[pci++]); + p.set_x (rend + i); + p.set_y (_height - (_height * vec.get()[i])); + } + + end_xfade_in->property_points() = *points; + end_xfade_in->show (); + end_xfade_in->raise_to_top (); + + /* fade in line */ + + boost::shared_ptr inverse = ar->inverse_fade_out (); + + if (!inverse) { + + for (int i = 0, pci = 0; i < npoints; ++i) { + Gnome::Art::Point &p ((*points)[pci++]); + p.set_x (rend + i); + p.set_y (_height - (_height * (1.0 - vec.get()[i]))); + } + + } else { + + rend = trackview.editor().frame_to_pixel (_region->length() - inverse->back()->when); + inverse->curve().get_vector (inverse->front()->when, inverse->back()->when, vec.get(), npoints); + + for (int i = 0, pci = 0; i < npoints; ++i) { + Gnome::Art::Point &p ((*points)[pci++]); + p.set_x (rend + i); + p.set_y (_height - (_height * vec.get()[i])); + } + } + + end_xfade_out->property_points() = *points; + end_xfade_out->show (); + end_xfade_out->raise_to_top (); + + + delete points; +} diff --git a/gtk2_ardour/audio_region_view.h b/gtk2_ardour/audio_region_view.h index 9dc7e507a1..53070c85d3 100644 --- a/gtk2_ardour/audio_region_view.h +++ b/gtk2_ardour/audio_region_view.h @@ -142,6 +142,14 @@ class AudioRegionView : public RegionView ArdourCanvas::SimpleRect* fade_out_handle; ///< fade out handle, or 0 ArdourCanvas::SimpleLine* fade_position_line; + ArdourCanvas::Line *start_xfade_in; + ArdourCanvas::Line *start_xfade_out; + ArdourCanvas::SimpleRect* start_xfade_rect; + + ArdourCanvas::Line *end_xfade_in; + ArdourCanvas::Line *end_xfade_out; + ArdourCanvas::SimpleRect* end_xfade_rect; + boost::shared_ptr gain_line; double _amplitude_above_axis; @@ -179,6 +187,9 @@ class AudioRegionView : public RegionView void transients_changed(); + void redraw_start_xfade (); + void redraw_end_xfade (); + private: void setup_fade_handle_positions (); diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h index 43d831521d..fe9f991ed0 100644 --- a/libs/ardour/ardour/audioregion.h +++ b/libs/ardour/ardour/audioregion.h @@ -95,7 +95,9 @@ class AudioRegion : public Region void set_fade_out_is_xfade (bool yn); boost::shared_ptr fade_in() { return _fade_in; } + boost::shared_ptr inverse_fade_in() { return _inverse_fade_in; } boost::shared_ptr fade_out() { return _fade_out; } + boost::shared_ptr inverse_fade_out() { return _inverse_fade_out; } boost::shared_ptr envelope() { return _envelope; } Evoral::Range body_range () const; diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc index f1c89cc565..9c304967dc 100644 --- a/libs/ardour/audio_playlist.cc +++ b/libs/ardour/audio_playlist.cc @@ -329,6 +329,9 @@ AudioPlaylist::check_crossfades (Evoral::Range range) break; } + top->set_fade_in_active (true); + top->set_fade_in_is_xfade (true); + switch (_session.config.get_xfade_choice ()) { case ConstantPowerMinus3dB: top->set_fade_in (FadeConstantPowerMinus3dB, len); @@ -340,8 +343,6 @@ AudioPlaylist::check_crossfades (Evoral::Range range) top->set_fade_in_length (len); break; } - top->set_fade_in_active (true); - top->set_fade_in_is_xfade (true); done_start.insert (top); } @@ -367,6 +368,9 @@ AudioPlaylist::check_crossfades (Evoral::Range range) break; } + top->set_fade_out_active (true); + top->set_fade_out_is_xfade (true); + switch (_session.config.get_xfade_choice ()) { case ConstantPowerMinus3dB: top->set_fade_out (FadeConstantPowerMinus3dB, len); @@ -378,8 +382,6 @@ AudioPlaylist::check_crossfades (Evoral::Range range) top->set_fade_out_length (len); break; } - top->set_fade_out_active (true); - top->set_fade_out_is_xfade (true); done_end.insert (top); } diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index 3f685075d1..a4d290ae6d 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -1042,16 +1042,16 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) /* setup complementary fade in for lower layers */ if (!_inverse_fade_out) { - _inverse_fade_out.reset (new AutomationList (Evoral::Parameter (FadeInAutomation))); + _inverse_fade_out.reset (new AutomationList (Evoral::Parameter (FadeOutAutomation))); } _inverse_fade_out->clear (); _inverse_fade_out->fast_simple_add (0.0, 0.0); - _inverse_fade_out->fast_simple_add ((len * 0.166667), 0.166366); - _inverse_fade_out->fast_simple_add ((len * 0.333333), 0.332853); - _inverse_fade_out->fast_simple_add ((len * 0.500000), 0.499459); - _inverse_fade_out->fast_simple_add ((len * 0.666667), 0.666186); - _inverse_fade_out->fast_simple_add ((len * 0.833333), 0.833033); + _inverse_fade_out->fast_simple_add ((len * 0.166667), 0.282192); + _inverse_fade_out->fast_simple_add ((len * 0.333333), 0.518174); + _inverse_fade_out->fast_simple_add ((len * 0.500000), 0.707946); + _inverse_fade_out->fast_simple_add ((len * 0.666667), 0.851507); + _inverse_fade_out->fast_simple_add ((len * 0.833333), 0.948859); _inverse_fade_out->fast_simple_add (len, 1.0); break; @@ -1068,7 +1068,7 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) /* setup complementary fade in for lower layers */ if (!_inverse_fade_out) { - _inverse_fade_out.reset (new AutomationList (Evoral::Parameter (FadeInAutomation))); + _inverse_fade_out.reset (new AutomationList (Evoral::Parameter (FadeOutAutomation))); } _inverse_fade_out->clear ();