apply gain automation on bounce - fixes 5887
[ardour.git] / libs / ardour / audioregion.cc
index e9b0b1fc076d9b876935742f8ea5cd0101d00d0c..63530e2f01774b48835ff02d26e84652df270e4f 100644 (file)
@@ -409,14 +409,22 @@ AudioRegion::set_envelope_active (bool yn)
        }
 }
 
+/** @param buf Buffer to put peak data in.
+ *  @param npeaks Number of peaks to read (ie the number of PeakDatas in buf)
+ *  @param offset Start position, as an offset from the start of this region's source.
+ *  @param cnt Number of samples to read.
+ *  @param chan_n Channel.
+ *  @param frames_per_pixel Number of samples to use to generate one peak value.
+ */
 ARDOUR::framecnt_t
-AudioRegion::read_peaks (PeakData *buf, framecnt_t npeaks, framecnt_t offset, framecnt_t cnt, uint32_t chan_n, double samples_per_unit) const
+AudioRegion::read_peaks (PeakData *buf, framecnt_t npeaks, framecnt_t offset, framecnt_t cnt, uint32_t chan_n, double frames_per_pixel) const
 {
        if (chan_n >= _sources.size()) {
                return 0;
        }
 
-       if (audio_source(chan_n)->read_peaks (buf, npeaks, offset, cnt, samples_per_unit)) {
+       if (audio_source(chan_n)->read_peaks (buf, npeaks, offset, cnt, frames_per_pixel)) {
                return 0;
        } else {
                if (_scale_amplitude != 1.0f) {
@@ -979,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 ();
@@ -991,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);
@@ -1007,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);
@@ -1021,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++) {
@@ -1202,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
@@ -1852,22 +1861,3 @@ AudioRegion::verify_xfade_bounds (framecnt_t len, bool start)
                
 }
 
-extern "C" {
-
-       int region_read_peaks_from_c (void *arg, uint32_t npeaks, uint32_t start, uint32_t cnt, intptr_t data, uint32_t n_chan, double samples_per_unit)
-{
-       return ((AudioRegion *) arg)->read_peaks ((PeakData *) data, (framecnt_t) npeaks, (framepos_t) start, (framecnt_t) cnt, n_chan,samples_per_unit);
-}
-
-uint32_t region_length_from_c (void *arg)
-{
-
-       return ((AudioRegion *) arg)->length();
-}
-
-uint32_t sourcefile_length_from_c (void *arg, double zoom_factor)
-{
-       return ( (AudioRegion *) arg)->audio_source()->available_peaks (zoom_factor) ;
-}
-
-} /* extern "C" */