Introduce global default-fade-shape configuration variable
[ardour.git] / libs / ardour / audioregion.cc
index 0909140f91be8db7e0500c6fd23141706002af02..63530e2f01774b48835ff02d26e84652df270e4f 100644 (file)
@@ -744,7 +744,7 @@ AudioRegion::read_from_sources (SourceList const & srcs, framecnt_t limit, Sampl
 
                        /* copy an existing channel's data in for this non-existant one */
 
-                       uint32_t channel = n_channels() % chan_n;
+                       uint32_t channel = chan_n % n_channels();
                        boost::shared_ptr<AudioSource> src = boost::dynamic_pointer_cast<AudioSource> (srcs[channel]);
 
                        if (src->read (buf, _start + internal_offset, to_read) != to_read) {
@@ -987,6 +987,8 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len)
        boost::shared_ptr<Evoral::ControlList> c2 (new Evoral::ControlList (FadeInAutomation));
        boost::shared_ptr<Evoral::ControlList> c3 (new Evoral::ControlList (FadeInAutomation));
 
+       const int num_steps = min ((framecnt_t) 16, len);
+
        _fade_in->freeze ();
        _fade_in->clear ();
        _inverse_fade_in->clear ();
@@ -999,15 +1001,15 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len)
                break;
 
        case FadeFast:
-               generate_db_fade (_fade_in.val(), len, 10, -60);
+               generate_db_fade (_fade_in.val(), len, num_steps, -60);
                reverse_curve (c1, _fade_in.val());
                _fade_in->copy_events (*c1);
                generate_inverse_power_curve (_inverse_fade_in.val(), _fade_in.val());
                break;
 
        case FadeSlow:
-               generate_db_fade (c1, len, 10, -1);  // start off with a slow fade
-               generate_db_fade (c2, len, 10, -80); // end with a fast fade
+               generate_db_fade (c1, len, num_steps/2, -1);  // start off with a slow fade
+               generate_db_fade (c2, len, num_steps/2, -80); // end with a fast fade
                merge_curves (_fade_in.val(), c1, c2);
                reverse_curve (c3, _fade_in.val());
                _fade_in->copy_events (*c3);
@@ -1015,8 +1017,8 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len)
                break;
 
        case FadeConstantPower:
-               for (int i = 0; i < 9; ++i) {
-                       float dist = (float) i / 10.0f;
+               for (int i = 0; i < num_steps; ++i) {
+                       float dist = (float) i / (num_steps+1.0);
                        _fade_in->fast_simple_add (len*dist, sin (dist*M_PI/2));
                }
                _fade_in->fast_simple_add (len, 1.0);
@@ -1029,7 +1031,6 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len)
                _fade_in->fast_simple_add (0.5*len, 0.6);
                //now generate a fade-out curve by successively applying a gain drop
                const float breakpoint = 0.7;  //linear for first 70%
-               const int num_steps = 9;
                for (int i = 2; i < num_steps; i++) {
                        float coeff = (1.0-breakpoint);
                        for (int j = 0; j < i; j++) {
@@ -1210,14 +1211,14 @@ void
 AudioRegion::set_default_fade_in ()
 {
        _fade_in_suspended = 0;
-       set_fade_in (FadeLinear, 64);
+       set_fade_in (Config->get_default_fade_shape(), 64);
 }
 
 void
 AudioRegion::set_default_fade_out ()
 {
        _fade_out_suspended = 0;
-       set_fade_out (FadeLinear, 64);
+       set_fade_out (Config->get_default_fade_shape(), 64);
 }
 
 void