Superficial code cleanup.
[ardour.git] / gtk2_ardour / crossfade_edit.cc
index a4e7281870c77b3b9db25d82be3f7177735a362b..6e4cbb345755ef337a019ecde64871fafecce27a 100644 (file)
@@ -27,8 +27,8 @@
 
 #include <libgnomecanvasmm/line.h>
 
-#include <ardour/automation_event.h>
-#include <ardour/curve.h>
+#include <ardour/automation_list.h>
+#include <evoral/Curve.hpp>
 #include <ardour/crossfade.h>
 #include <ardour/session.h>
 #include <ardour/auditioner.h>
@@ -65,8 +65,9 @@ CrossfadeEditor::Presets* CrossfadeEditor::fade_out_presets = 0;
 
 CrossfadeEditor::Half::Half ()
        : line (0), 
-         normative_curve (Parameter(GainAutomation), 0.0, 1.0, 1.0), // FIXME: GainAutomation?
-         gain_curve (Parameter(GainAutomation), 0.0, 2.0, 1.0)
+         //normative_curve (Parameter(GainAutomation, 0.0, 1.0, 1.0)), // FIXME: GainAutomation?
+         normative_curve (Parameter(GainAutomation)),
+         gain_curve (Parameter(GainAutomation))
 {
 }
 
@@ -343,13 +344,13 @@ CrossfadeEditor::set (const ARDOUR::AutomationList& 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::AutomationList::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);
@@ -433,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()
@@ -771,7 +772,7 @@ CrossfadeEditor::_apply_to (boost::shared_ptr<Crossfade> xf)
        /* IN */
 
 
-       ARDOUR::AutomationList::const_iterator the_end = in.const_end();
+       ARDOUR::AutomationList::const_iterator the_end = in.end();
        --the_end;
 
        double firstx = (*in.begin())->when;
@@ -791,7 +792,7 @@ CrossfadeEditor::_apply_to (boost::shared_ptr<Crossfade> xf)
 
        /* OUT */
 
-       the_end = out.const_end();
+       the_end = out.end();
        --the_end;
 
        firstx = (*out.begin())->when;
@@ -1115,42 +1116,43 @@ CrossfadeEditor::peaks_ready (boost::shared_ptr<AudioRegion> 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()) {
+       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()) {
+       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<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (xfade->out(), left_start_offset, left_length, "xfade out", 
@@ -1158,16 +1160,33 @@ CrossfadeEditor::audition_both ()
        boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion> (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 ()
 {
@@ -1180,25 +1199,7 @@ CrossfadeEditor::audition_left_dry ()
 void
 CrossfadeEditor::audition_left ()
 {
-       AudioPlaylist& pl (session.the_auditioner()->prepare_playlist());
-
-       boost::shared_ptr<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (xfade->out(), xfade->out()->length() - xfade->length(), xfade->length(), "xfade left", 
-                                                                                                             0, Region::DefaultFlags, false)));
-       boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion> (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
@@ -1212,23 +1213,7 @@ CrossfadeEditor::audition_right_dry ()
 void
 CrossfadeEditor::audition_right ()
 {
-       AudioPlaylist& pl (session.the_auditioner()->prepare_playlist());
-
-       boost::shared_ptr<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (xfade->out(), xfade->out()->length() - xfade->length(), xfade->length(), "xfade out", 
-                                                                                                             0, Region::DefaultFlags, false)));
-                                            boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion> (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