#include "ardour/coreaudiosource.h"
#endif // HAVE_COREAUDIO
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <locale.h>
using namespace std;
assert (_sources.size() == _master_sources.size());
}
-AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, framecnt_t offset, const int32_t sub_num)
- : Region (other, offset, sub_num)
+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)
AudioRegion::get_basic_state ()
{
XMLNode& node (Region::state ());
- char buf[64];
- 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;
}
{
XMLNode& node (get_basic_state());
XMLNode *child;
- LocaleGuard lg;
child = node.add_child ("Envelope");
}
if (default_env) {
- child->add_property ("default", "yes");
+ child->set_property ("default", "yes");
} else {
child->add_child_nocopy (_envelope->get_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 ());
}
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 ());
}
AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_changed, bool send)
{
const XMLNodeList& nlist = node.children();
- XMLProperty const * prop;
- LocaleGuard lg;
boost::shared_ptr<Playlist> the_playlist (_playlist.lock());
suspend_property_changes ();
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);
}
}
_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");
}
}
- 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");
}
}
- 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") ) {
_fade_out->thaw ();
_default_fade_out = false;
- send_change (PropertyChange (Properties::fade_in));
+ send_change (PropertyChange (Properties::fade_out));
}
void
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
{
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 (2. * rms / (double)(total * n_chan));
+}
+
/** Normalize using a given maximum amplitude and target, so that region
* _scale_amplitude becomes target / max_amplitude.
*/