NO-OP: re-order code, add comments
[ardour.git] / libs / ardour / audioregion.cc
index 44e238fb7ef736caae9be50d3c41ced2a1492840..cf014aca84132e270296f5c17141314923dee3dd 100644 (file)
@@ -55,7 +55,7 @@
 #include "ardour/coreaudiosource.h"
 #endif // HAVE_COREAUDIO
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include <locale.h>
 
 using namespace std;
@@ -279,13 +279,13 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other)
        assert (_sources.size() == _master_sources.size());
 }
 
-AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, framecnt_t offset)
+AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, MusicFrame offset)
        : Region (other, offset)
        , AUDIOREGION_COPY_STATE (other)
          /* As far as I can see, the _envelope's times are relative to region position, and have nothing
             to do with sources (and hence _start).  So when we copy the envelope, we just use the supplied offset.
          */
-       , _envelope (Properties::envelope, boost::shared_ptr<AutomationList> (new AutomationList (*other->_envelope.val(), offset, other->_length)))
+       , _envelope (Properties::envelope, boost::shared_ptr<AutomationList> (new AutomationList (*other->_envelope.val(), offset.frame, other->_length)))
        , _automatable (other->session())
        , _fade_in_suspended (0)
        , _fade_out_suspended (0)
@@ -770,11 +770,9 @@ XMLNode&
 AudioRegion::get_basic_state ()
 {
        XMLNode& node (Region::state ());
-       char buf[64];
-       LocaleGuard lg ();
+       LocaleGuard lg;
 
-       snprintf (buf, sizeof (buf), "%u", (uint32_t) _sources.size());
-       node.add_property ("channels", buf);
+       node.set_property ("channels", (uint32_t)_sources.size());
 
        return node;
 }
@@ -784,7 +782,7 @@ AudioRegion::state ()
 {
        XMLNode& node (get_basic_state());
        XMLNode *child;
-       LocaleGuard lg ();
+       LocaleGuard lg;
 
        child = node.add_child ("Envelope");
 
@@ -802,7 +800,7 @@ AudioRegion::state ()
        }
 
        if (default_env) {
-               child->add_property ("default", "yes");
+               child->set_property ("default", "yes");
        } else {
                child->add_child_nocopy (_envelope->get_state ());
        }
@@ -810,7 +808,7 @@ AudioRegion::state ()
        child = node.add_child (X_("FadeIn"));
 
        if (_default_fade_in) {
-               child->add_property ("default", "yes");
+               child->set_property ("default", "yes");
        } else {
                child->add_child_nocopy (_fade_in->get_state ());
        }
@@ -823,7 +821,7 @@ AudioRegion::state ()
        child = node.add_child (X_("FadeOut"));
 
        if (_default_fade_out) {
-               child->add_property ("default", "yes");
+               child->set_property ("default", "yes");
        } else {
                child->add_child_nocopy (_fade_out->get_state ());
        }
@@ -840,8 +838,7 @@ int
 AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_changed, bool send)
 {
        const XMLNodeList& nlist = node.children();
-       XMLProperty const * prop;
-       LocaleGuard lg ();
+       LocaleGuard lg;
        boost::shared_ptr<Playlist> the_playlist (_playlist.lock());
 
        suspend_property_changes ();
@@ -857,10 +854,10 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_
 
        Region::_set_state (node, version, what_changed, false);
 
-       if ((prop = node.property ("scale-gain")) != 0) {
-               float a = atof (prop->value().c_str());
-               if (a != _scale_amplitude) {
-                       _scale_amplitude = a;
+       float val;
+       if (node.get_property ("scale-gain", val)) {
+               if (val != _scale_amplitude) {
+                       _scale_amplitude = val;
                        what_changed.add (Properties::scale_amplitude);
                }
        }
@@ -890,7 +887,8 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_
 
                        _fade_in->clear ();
 
-                       if (((prop = child->property ("default")) != 0 && string_is_affirmative (prop->value())) || (prop = child->property ("steepness")) != 0) {
+                       bool is_default;
+                       if ((child->get_property ("default", is_default) && is_default) || (prop = child->property ("steepness")) != 0) {
                                set_default_fade_in ();
                        } else {
                                XMLNode* grandchild = child->child ("AutomationList");
@@ -899,19 +897,17 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_
                                }
                        }
 
-                       if ((prop = child->property ("active")) != 0) {
-                               if (string_is_affirmative (prop->value())) {
-                                       set_fade_in_active (true);
-                               } else {
-                                       set_fade_in_active (false);
-                               }
+                       bool is_active;
+                       if (child->get_property ("active", is_active)) {
+                               set_fade_in_active (is_active);
                        }
 
                } else if (child->name() == "FadeOut") {
 
                        _fade_out->clear ();
 
-                       if (((prop = child->property ("default")) != 0 && (string_is_affirmative (prop->value()))) || (prop = child->property ("steepness")) != 0) {
+                       bool is_default;
+                       if ((child->get_property ("default", is_default) && is_default) || (prop = child->property ("steepness")) != 0) {
                                set_default_fade_out ();
                        } else {
                                XMLNode* grandchild = child->child ("AutomationList");
@@ -920,12 +916,9 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_
                                }
                        }
 
-                       if ((prop = child->property ("active")) != 0) {
-                               if (string_is_affirmative (prop->value())) {
-                                       set_fade_out_active (true);
-                               } else {
-                                       set_fade_out_active (false);
-                               }
+                       bool is_active;
+                       if (child->get_property ("active", is_active)) {
+                               set_fade_out_active (is_active);
                        }
 
                } else if ( (child->name() == "InverseFadeIn") || (child->name() == "InvFadeIn")  ) {
@@ -1095,7 +1088,7 @@ AudioRegion::set_fade_out (boost::shared_ptr<AutomationList> f)
        _fade_out->thaw ();
        _default_fade_out = false;
 
-       send_change (PropertyChange (Properties::fade_in));
+       send_change (PropertyChange (Properties::fade_out));
 }
 
 void
@@ -1402,9 +1395,6 @@ AudioRegion::set_scale_amplitude (gain_t g)
        send_change (PropertyChange (Properties::scale_amplitude));
 }
 
-/** @return the maximum (linear) amplitude of the region, or a -ve
- *  number if the Progress object reports that the process was cancelled.
- */
 double
 AudioRegion::maximum_amplitude (Progress* p) const
 {
@@ -1444,6 +1434,45 @@ AudioRegion::maximum_amplitude (Progress* p) const
        return maxamp;
 }
 
+double
+AudioRegion::rms (Progress* p) const
+{
+       framepos_t fpos = _start;
+       framepos_t const fend = _start + _length;
+       uint32_t const n_chan = n_channels ();
+       double rms = 0;
+
+       framecnt_t const blocksize = 64 * 1024;
+       Sample buf[blocksize];
+
+       framecnt_t total = 0;
+
+       if (n_chan == 0 || fend == fpos) {
+               return 0;
+       }
+
+       while (fpos < fend) {
+               framecnt_t const to_read = min (fend - fpos, blocksize);
+               for (uint32_t c = 0; c < n_chan; ++c) {
+                       if (read_raw_internal (buf, fpos, to_read, c) != to_read) {
+                               return 0;
+                       }
+                       for (framepos_t i = 0; i < to_read; ++i) {
+                               rms += buf[i] * buf[i];
+                       }
+               }
+               total += to_read;
+               fpos += to_read;
+               if (p) {
+                       p->set_progress (float (fpos - _start) / _length);
+                       if (p->cancelled ()) {
+                               return -1;
+                       }
+               }
+       }
+       return sqrt (rms / (double)(total * n_chan));
+}
+
 /** Normalize using a given maximum amplitude and target, so that region
  *  _scale_amplitude becomes target / max_amplitude.
  */