don't use llrint on already-integral variables
[ardour.git] / libs / ardour / audioregion.cc
index 9694e2430b14b9c9ae314f94ad0031bcfdc7a75d..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) {
@@ -736,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) {
@@ -754,17 +762,24 @@ AudioRegion::read_from_sources (SourceList const & srcs, framecnt_t limit, Sampl
 }
 
 XMLNode&
-AudioRegion::state ()
+AudioRegion::get_basic_state ()
 {
        XMLNode& node (Region::state ());
-       XMLNode *child;
        char buf[64];
        LocaleGuard lg (X_("POSIX"));
 
        snprintf (buf, sizeof (buf), "%u", (uint32_t) _sources.size());
        node.add_property ("channels", buf);
 
-       Stateful::add_properties (node);
+       return node;
+}
+
+XMLNode&
+AudioRegion::state ()
+{
+       XMLNode& node (get_basic_state());
+       XMLNode *child;
+       LocaleGuard lg (X_("POSIX"));
 
        child = node.add_child ("Envelope");
 
@@ -796,7 +811,7 @@ AudioRegion::state ()
        }
 
        if (_inverse_fade_in) {
-               child = node.add_child (X_("InvFadeIn"));
+               child = node.add_child (X_("InverseFadeIn"));
                child->add_child_nocopy (_inverse_fade_in->get_state ());
        }
 
@@ -809,7 +824,7 @@ AudioRegion::state ()
        }
 
        if (_inverse_fade_out) {
-               child = node.add_child (X_("InvFadeOut"));
+               child = node.add_child (X_("InverseFadeOut"));
                child->add_child_nocopy (_inverse_fade_out->get_state ());
        }
 
@@ -908,12 +923,12 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_
                                }
                        }
        
-               } else if (child->name() == "InvFadeIn") {
+               } else if (child->name() == "InverseFadeIn") {
                        XMLNode* grandchild = child->child ("AutomationList");
                        if (grandchild) {
                                _inverse_fade_in->set_state (*grandchild, version);
                        }
-               } else if (child->name() == "InvFadeOut") {
+               } else if (child->name() == "InverseFadeOut") {
                        XMLNode* grandchild = child->child ("AutomationList");
                        if (grandchild) {
                                _inverse_fade_out->set_state (*grandchild, version);
@@ -972,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 ();
@@ -984,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);
@@ -1000,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);
@@ -1014,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++) {
@@ -1195,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
@@ -1845,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" */