#include <pbd/xml++.h>
#include <pbd/stacktrace.h>
#include <pbd/enumwriter.h>
+#include <pbd/convert.h>
#include <ardour/audioregion.h>
#include <ardour/session.h>
#include <ardour/gain.h>
#include <ardour/dB.h>
#include <ardour/playlist.h>
-#include <ardour/audiofilter.h>
#include <ardour/audiofilesource.h>
#include <ardour/region_factory.h>
#include <ardour/runtime_functions.h>
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
/* a Session will reset these to its chosen defaults by calling AudioRegion::set_default_fade() */
}
/* constructor for use by derived types only */
-AudioRegion::AudioRegion (nframes_t start, nframes_t length, string name)
- : Region (start, length, name, DataType::AUDIO),
- _fade_in (ParamID(FadeInAutomation), 0.0, 2.0, 1.0),
- _fade_out (ParamID(FadeOutAutomation), 0.0, 2.0, 1.0),
- _envelope (ParamID(EnvelopeAutomation), 0.0, 2.0, 1.0)
+AudioRegion::AudioRegion (Session& s, nframes_t start, nframes_t length, string name)
+ : Region (s, start, length, name, DataType::AUDIO)
+ , _fade_in (new AutomationList(Parameter(FadeInAutomation), 0.0, 2.0, 1.0))
+ , _fade_out (new AutomationList(Parameter(FadeOutAutomation), 0.0, 2.0, 1.0))
+ , _envelope (new AutomationList(Parameter(EnvelopeAutomation), 0.0, 2.0, 1.0))
{
init ();
}
/** Basic AudioRegion constructor (one channel) */
AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, nframes_t length)
- : Region (src, start, length, PBD::basename_nosuffix(src->name()), DataType::AUDIO, 0, Region::Flag(Region::DefaultFlags|Region::External)),
- _fade_in (ParamID(FadeInAutomation), 0.0, 2.0, 1.0),
- _fade_out (ParamID(FadeOutAutomation), 0.0, 2.0, 1.0),
- _envelope (ParamID(EnvelopeAutomation), 0.0, 2.0, 1.0)
+ : Region (src, start, length, PBD::basename_nosuffix(src->name()), DataType::AUDIO, 0, Region::Flag(Region::DefaultFlags|Region::External))
+ , _fade_in (new AutomationList(Parameter(FadeInAutomation), 0.0, 2.0, 1.0))
+ , _fade_out (new AutomationList(Parameter(FadeOutAutomation), 0.0, 2.0, 1.0))
+ , _envelope (new AutomationList(Parameter(EnvelopeAutomation), 0.0, 2.0, 1.0))
{
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
if (afs) {
/* Basic AudioRegion constructor (one channel) */
AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, nframes_t length, const string& name, layer_t layer, Flag flags)
: Region (src, start, length, name, DataType::AUDIO, layer, flags)
- , _fade_in (ParamID(FadeInAutomation), 0.0, 2.0, 1.0)
- , _fade_out (ParamID(FadeOutAutomation), 0.0, 2.0, 1.0)
- , _envelope (ParamID(EnvelopeAutomation), 0.0, 2.0, 1.0)
+ , _fade_in (new AutomationList(Parameter(FadeInAutomation), 0.0, 2.0, 1.0))
+ , _fade_out (new AutomationList(Parameter(FadeOutAutomation), 0.0, 2.0, 1.0))
+ , _envelope (new AutomationList(Parameter(EnvelopeAutomation), 0.0, 2.0, 1.0))
{
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
if (afs) {
/* Basic AudioRegion constructor (many channels) */
AudioRegion::AudioRegion (SourceList& srcs, nframes_t start, nframes_t length, const string& name, layer_t layer, Flag flags)
: Region (srcs, start, length, name, DataType::AUDIO, layer, flags)
- , _fade_in (ParamID(FadeInAutomation), 0.0, 2.0, 1.0)
- , _fade_out (ParamID(FadeOutAutomation), 0.0, 2.0, 1.0)
- , _envelope (ParamID(EnvelopeAutomation), 0.0, 2.0, 1.0)
+ , _fade_in (new AutomationList(Parameter(FadeInAutomation), 0.0, 2.0, 1.0))
+ , _fade_out (new AutomationList(Parameter(FadeOutAutomation), 0.0, 2.0, 1.0))
+ , _envelope (new AutomationList(Parameter(EnvelopeAutomation), 0.0, 2.0, 1.0))
{
init ();
}
/** Create a new AudioRegion, that is part of an existing one */
AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, nframes_t offset, nframes_t length, const string& name, layer_t layer, Flag flags)
- : Region (other, offset, length, name, layer, flags),
- _fade_in (other->_fade_in),
- _fade_out (other->_fade_out),
- _envelope (other->_envelope, (double) offset, (double) offset + length)
+ : Region (other, offset, length, name, layer, flags)
+ , _fade_in (new AutomationList(Parameter(FadeInAutomation), 0.0, 2.0, 1.0))
+ , _fade_out (new AutomationList(Parameter(FadeOutAutomation), 0.0, 2.0, 1.0))
+ , _envelope (new AutomationList(Parameter(EnvelopeAutomation), 0.0, 2.0, 1.0))
{
- /* return to default fades if the existing ones are too long */
- _fade_in_disabled = 0;
- _fade_out_disabled = 0;
+ set<boost::shared_ptr<Source> > unique_srcs;
+
+ for (SourceList::const_iterator i= other->_sources.begin(); i != other->_sources.end(); ++i) {
+ _sources.push_back (*i);
+
+ pair<set<boost::shared_ptr<Source> >::iterator,bool> result;
+
+ result = unique_srcs.insert (*i);
+
+ if (result.second) {
+ boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (*i);
+ if (afs) {
+ afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
+ }
+ }
+ }
+ /* return to default fades if the existing ones are too long */
+ init ();
if (_flags & LeftOfSplit) {
- if (_fade_in.back()->when >= _length) {
+ if (_fade_in->back()->when >= _length) {
set_default_fade_in ();
} else {
_fade_in_disabled = other->_fade_in_disabled;
}
if (_flags & RightOfSplit) {
- if (_fade_out.back()->when >= _length) {
+ if (_fade_out->back()->when >= _length) {
set_default_fade_out ();
} else {
_fade_out_disabled = other->_fade_out_disabled;
_scale_amplitude = other->_scale_amplitude;
- listen_to_my_curves ();
-
assert(_type == DataType::AUDIO);
}
AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other)
- : Region (other),
- _fade_in (other->_fade_in),
- _fade_out (other->_fade_out),
- _envelope (other->_envelope)
+ : Region (other)
+ , _fade_in (new AutomationList(Parameter(FadeInAutomation), 0.0, 2.0, 1.0))
+ , _fade_out (new AutomationList(Parameter(FadeOutAutomation), 0.0, 2.0, 1.0))
+ , _envelope (new AutomationList(Parameter(EnvelopeAutomation), 0.0, 2.0, 1.0))
{
_scale_amplitude = other->_scale_amplitude;
_envelope = other->_envelope;
- _fade_in_disabled = 0;
- _fade_out_disabled = 0;
+ set_default_fades ();
listen_to_my_curves ();
AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, const XMLNode& node)
: Region (src, node)
- , _fade_in (ParamID(FadeInAutomation), 0.0, 2.0, 1.0)
- , _fade_out (ParamID(FadeOutAutomation), 0.0, 2.0, 1.0)
- , _envelope (ParamID(EnvelopeAutomation), 0.0, 2.0, 1.0)
+ , _fade_in (new AutomationList(Parameter(FadeInAutomation), 0.0, 2.0, 1.0))
+ , _fade_out (new AutomationList(Parameter(FadeOutAutomation), 0.0, 2.0, 1.0))
+ , _envelope (new AutomationList(Parameter(EnvelopeAutomation), 0.0, 2.0, 1.0))
{
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
if (afs) {
afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
}
- set_default_fades ();
+ init ();
if (set_state (node)) {
throw failed_constructor();
}
- listen_to_my_curves ();
-
assert(_type == DataType::AUDIO);
}
AudioRegion::AudioRegion (SourceList& srcs, const XMLNode& node)
: Region (srcs, node)
- , _fade_in (ParamID(FadeInAutomation), 0.0, 2.0, 1.0)
- , _fade_out (ParamID(FadeOutAutomation), 0.0, 2.0, 1.0)
- , _envelope (ParamID(EnvelopeAutomation), 0.0, 2.0, 1.0)
+ , _fade_in (new AutomationList(Parameter(FadeInAutomation), 0.0, 2.0, 1.0))
+ , _fade_out (new AutomationList(Parameter(FadeOutAutomation), 0.0, 2.0, 1.0))
+ , _envelope (new AutomationList(Parameter(EnvelopeAutomation), 0.0, 2.0, 1.0))
{
- set_default_fades ();
- _scale_amplitude = 1.0;
+ init ();
if (set_state (node)) {
throw failed_constructor();
}
- listen_to_my_curves ();
-
assert(_type == DataType::AUDIO);
}
void
AudioRegion::listen_to_my_curves ()
{
- _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
- _fade_in.StateChanged.connect (mem_fun (*this, &AudioRegion::fade_in_changed));
- _fade_out.StateChanged.connect (mem_fun (*this, &AudioRegion::fade_out_changed));
+ _envelope->StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+ _fade_in->StateChanged.connect (mem_fun (*this, &AudioRegion::fade_in_changed));
+ _fade_out->StateChanged.connect (mem_fun (*this, &AudioRegion::fade_out_changed));
}
bool
if (_flags & FadeIn) {
- nframes_t fade_in_length = (nframes_t) _fade_in.back()->when;
+ nframes_t fade_in_length = (nframes_t) _fade_in->back()->when;
/* see if this read is within the fade in */
limit = min (to_read, fade_in_length - internal_offset);
- _fade_in.curve().get_vector (internal_offset, internal_offset+limit, gain_buffer, limit);
+ _fade_in->curve().get_vector (internal_offset, internal_offset+limit, gain_buffer, limit);
for (nframes_t n = 0; n < limit; ++n) {
mixdown_buffer[n] *= gain_buffer[n];
*/
- nframes_t fade_out_length = (nframes_t) _fade_out.back()->when;
+ nframes_t fade_out_length = (nframes_t) _fade_out->back()->when;
nframes_t fade_interval_start = max(internal_offset, _length-fade_out_length);
nframes_t fade_interval_end = min(internal_offset + to_read, _length);
nframes_t curve_offset = fade_interval_start - (_length-fade_out_length);
nframes_t fade_offset = fade_interval_start - internal_offset;
- _fade_out.curve().get_vector (curve_offset,curve_offset+limit, gain_buffer, limit);
+ _fade_out->curve().get_vector (curve_offset,curve_offset+limit, gain_buffer, limit);
for (nframes_t n = 0, m = fade_offset; n < limit; ++n, ++m) {
mixdown_buffer[m] *= gain_buffer[n];
/* Regular gain curves */
if (envelope_active()) {
- _envelope.curve().get_vector (internal_offset, internal_offset + to_read, gain_buffer, to_read);
+ _envelope->curve().get_vector (internal_offset, internal_offset + to_read, gain_buffer, to_read);
if (_scale_amplitude != 1.0f) {
for (nframes_t n = 0; n < to_read; ++n) {
snprintf (buf, sizeof(buf), "%.12g", _scale_amplitude);
node.add_property ("scale-gain", buf);
+ // XXX these should move into Region
+
for (uint32_t n=0; n < _sources.size(); ++n) {
snprintf (buf2, sizeof(buf2), "source-%d", n);
_sources[n]->id().print (buf, sizeof (buf));
node.add_property (buf2, buf);
}
+ for (uint32_t n=0; n < _master_sources.size(); ++n) {
+ snprintf (buf2, sizeof(buf2), "master-source-%d", n);
+ _master_sources[n]->id().print (buf, sizeof (buf));
+ node.add_property (buf2, buf);
+ }
+
snprintf (buf, sizeof (buf), "%u", (uint32_t) _sources.size());
node.add_property ("channels", buf);
if ((_flags & DefaultFadeIn)) {
child->add_property (X_("default"), X_("yes"));
} else {
- child->add_child_nocopy (_fade_in.get_state ());
+ child->add_child_nocopy (_fade_in->get_state ());
}
child->add_property (X_("active"), _fade_in_disabled ? X_("no") : X_("yes"));
if ((_flags & DefaultFadeOut)) {
child->add_property (X_("default"), X_("yes"));
} else {
- child->add_child_nocopy (_fade_out.get_state ());
+ child->add_child_nocopy (_fade_out->get_state ());
}
child->add_property (X_("active"), _fade_out_disabled ? X_("no") : X_("yes"));
// If there are only two points, the points are in the start of the region and the end of the region
// so, if they are both at 1.0f, that means the default region.
- if (_envelope.size() == 2 &&
- _envelope.front()->value == 1.0f &&
- _envelope.back()->value==1.0f) {
- if (_envelope.front()->when == 0 && _envelope.back()->when == _length) {
+ if (_envelope->size() == 2 &&
+ _envelope->front()->value == 1.0f &&
+ _envelope->back()->value==1.0f) {
+ if (_envelope->front()->when == 0 && _envelope->back()->when == _length) {
default_env = true;
}
}
-
+
if (default_env) {
child->add_property ("default", "yes");
} else {
- child->add_child_nocopy (_envelope.get_state ());
+ child->add_child_nocopy (_envelope->get_state ());
}
} else {
if ((prop = node.property ("scale-gain")) != 0) {
_scale_amplitude = atof (prop->value().c_str());
+ what_changed = Change (what_changed|ScaleAmplitudeChanged);
} else {
_scale_amplitude = 1.0;
}
child = (*niter);
if (child->name() == "Envelope") {
-
- _envelope.clear ();
- if ((prop = child->property ("default")) != 0 || _envelope.set_state (*child)) {
+ _envelope->clear ();
+
+ if ((prop = child->property ("default")) != 0 || _envelope->set_state (*child)) {
set_default_envelope ();
}
- _envelope.set_max_xval (_length);
- _envelope.truncate_end (_length);
+ _envelope->set_max_xval (_length);
+ _envelope->truncate_end (_length);
} else if (child->name() == "FadeIn") {
- _fade_in.clear ();
+ _fade_in->clear ();
- if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0 || _fade_in.set_state (*child)) {
+ if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0 || _fade_in->set_state (*child)) {
set_default_fade_in ();
}
} else if (child->name() == "FadeOut") {
- _fade_out.clear ();
+ _fade_out->clear ();
- if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0 || _fade_out.set_state (*child)) {
+ if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0 || _fade_out->set_state (*child)) {
set_default_fade_out ();
}
}
void
AudioRegion::set_fade_in_shape (FadeShape shape)
{
- set_fade_in (shape, (nframes_t) _fade_in.back()->when);
+ set_fade_in (shape, (nframes_t) _fade_in->back()->when);
}
void
AudioRegion::set_fade_out_shape (FadeShape shape)
{
- set_fade_out (shape, (nframes_t) _fade_out.back()->when);
+ set_fade_out (shape, (nframes_t) _fade_out->back()->when);
}
void
AudioRegion::set_fade_in (FadeShape shape, nframes_t len)
{
- _fade_in.freeze ();
- _fade_in.clear ();
+ _fade_in->freeze ();
+ _fade_in->clear ();
switch (shape) {
case Linear:
- _fade_in.fast_simple_add (0.0, 0.0);
- _fade_in.fast_simple_add (len, 1.0);
+ _fade_in->fast_simple_add (0.0, 0.0);
+ _fade_in->fast_simple_add (len, 1.0);
break;
case Fast:
- _fade_in.fast_simple_add (0, 0);
- _fade_in.fast_simple_add (len * 0.389401, 0.0333333);
- _fade_in.fast_simple_add (len * 0.629032, 0.0861111);
- _fade_in.fast_simple_add (len * 0.829493, 0.233333);
- _fade_in.fast_simple_add (len * 0.9447, 0.483333);
- _fade_in.fast_simple_add (len * 0.976959, 0.697222);
- _fade_in.fast_simple_add (len, 1);
+ _fade_in->fast_simple_add (0, 0);
+ _fade_in->fast_simple_add (len * 0.389401, 0.0333333);
+ _fade_in->fast_simple_add (len * 0.629032, 0.0861111);
+ _fade_in->fast_simple_add (len * 0.829493, 0.233333);
+ _fade_in->fast_simple_add (len * 0.9447, 0.483333);
+ _fade_in->fast_simple_add (len * 0.976959, 0.697222);
+ _fade_in->fast_simple_add (len, 1);
break;
case Slow:
- _fade_in.fast_simple_add (0, 0);
- _fade_in.fast_simple_add (len * 0.0207373, 0.197222);
- _fade_in.fast_simple_add (len * 0.0645161, 0.525);
- _fade_in.fast_simple_add (len * 0.152074, 0.802778);
- _fade_in.fast_simple_add (len * 0.276498, 0.919444);
- _fade_in.fast_simple_add (len * 0.481567, 0.980556);
- _fade_in.fast_simple_add (len * 0.767281, 1);
- _fade_in.fast_simple_add (len, 1);
+ _fade_in->fast_simple_add (0, 0);
+ _fade_in->fast_simple_add (len * 0.0207373, 0.197222);
+ _fade_in->fast_simple_add (len * 0.0645161, 0.525);
+ _fade_in->fast_simple_add (len * 0.152074, 0.802778);
+ _fade_in->fast_simple_add (len * 0.276498, 0.919444);
+ _fade_in->fast_simple_add (len * 0.481567, 0.980556);
+ _fade_in->fast_simple_add (len * 0.767281, 1);
+ _fade_in->fast_simple_add (len, 1);
break;
case LogA:
- _fade_in.fast_simple_add (0, 0);
- _fade_in.fast_simple_add (len * 0.0737327, 0.308333);
- _fade_in.fast_simple_add (len * 0.246544, 0.658333);
- _fade_in.fast_simple_add (len * 0.470046, 0.886111);
- _fade_in.fast_simple_add (len * 0.652074, 0.972222);
- _fade_in.fast_simple_add (len * 0.771889, 0.988889);
- _fade_in.fast_simple_add (len, 1);
+ _fade_in->fast_simple_add (0, 0);
+ _fade_in->fast_simple_add (len * 0.0737327, 0.308333);
+ _fade_in->fast_simple_add (len * 0.246544, 0.658333);
+ _fade_in->fast_simple_add (len * 0.470046, 0.886111);
+ _fade_in->fast_simple_add (len * 0.652074, 0.972222);
+ _fade_in->fast_simple_add (len * 0.771889, 0.988889);
+ _fade_in->fast_simple_add (len, 1);
break;
case LogB:
- _fade_in.fast_simple_add (0, 0);
- _fade_in.fast_simple_add (len * 0.304147, 0.0694444);
- _fade_in.fast_simple_add (len * 0.529954, 0.152778);
- _fade_in.fast_simple_add (len * 0.725806, 0.333333);
- _fade_in.fast_simple_add (len * 0.847926, 0.558333);
- _fade_in.fast_simple_add (len * 0.919355, 0.730556);
- _fade_in.fast_simple_add (len, 1);
+ _fade_in->fast_simple_add (0, 0);
+ _fade_in->fast_simple_add (len * 0.304147, 0.0694444);
+ _fade_in->fast_simple_add (len * 0.529954, 0.152778);
+ _fade_in->fast_simple_add (len * 0.725806, 0.333333);
+ _fade_in->fast_simple_add (len * 0.847926, 0.558333);
+ _fade_in->fast_simple_add (len * 0.919355, 0.730556);
+ _fade_in->fast_simple_add (len, 1);
break;
}
- _fade_in.thaw ();
+ _fade_in->thaw ();
_fade_in_shape = shape;
send_change (FadeInChanged);
void
AudioRegion::set_fade_out (FadeShape shape, nframes_t len)
{
- _fade_out.freeze ();
- _fade_out.clear ();
+ _fade_out->freeze ();
+ _fade_out->clear ();
switch (shape) {
case Fast:
- _fade_out.fast_simple_add (len * 0, 1);
- _fade_out.fast_simple_add (len * 0.023041, 0.697222);
- _fade_out.fast_simple_add (len * 0.0553, 0.483333);
- _fade_out.fast_simple_add (len * 0.170507, 0.233333);
- _fade_out.fast_simple_add (len * 0.370968, 0.0861111);
- _fade_out.fast_simple_add (len * 0.610599, 0.0333333);
- _fade_out.fast_simple_add (len * 1, 0);
+ _fade_out->fast_simple_add (len * 0, 1);
+ _fade_out->fast_simple_add (len * 0.023041, 0.697222);
+ _fade_out->fast_simple_add (len * 0.0553, 0.483333);
+ _fade_out->fast_simple_add (len * 0.170507, 0.233333);
+ _fade_out->fast_simple_add (len * 0.370968, 0.0861111);
+ _fade_out->fast_simple_add (len * 0.610599, 0.0333333);
+ _fade_out->fast_simple_add (len * 1, 0);
break;
case LogA:
- _fade_out.fast_simple_add (len * 0, 1);
- _fade_out.fast_simple_add (len * 0.228111, 0.988889);
- _fade_out.fast_simple_add (len * 0.347926, 0.972222);
- _fade_out.fast_simple_add (len * 0.529954, 0.886111);
- _fade_out.fast_simple_add (len * 0.753456, 0.658333);
- _fade_out.fast_simple_add (len * 0.9262673, 0.308333);
- _fade_out.fast_simple_add (len * 1, 0);
+ _fade_out->fast_simple_add (len * 0, 1);
+ _fade_out->fast_simple_add (len * 0.228111, 0.988889);
+ _fade_out->fast_simple_add (len * 0.347926, 0.972222);
+ _fade_out->fast_simple_add (len * 0.529954, 0.886111);
+ _fade_out->fast_simple_add (len * 0.753456, 0.658333);
+ _fade_out->fast_simple_add (len * 0.9262673, 0.308333);
+ _fade_out->fast_simple_add (len * 1, 0);
break;
case Slow:
- _fade_out.fast_simple_add (len * 0, 1);
- _fade_out.fast_simple_add (len * 0.305556, 1);
- _fade_out.fast_simple_add (len * 0.548611, 0.991736);
- _fade_out.fast_simple_add (len * 0.759259, 0.931129);
- _fade_out.fast_simple_add (len * 0.918981, 0.68595);
- _fade_out.fast_simple_add (len * 0.976852, 0.22865);
- _fade_out.fast_simple_add (len * 1, 0);
+ _fade_out->fast_simple_add (len * 0, 1);
+ _fade_out->fast_simple_add (len * 0.305556, 1);
+ _fade_out->fast_simple_add (len * 0.548611, 0.991736);
+ _fade_out->fast_simple_add (len * 0.759259, 0.931129);
+ _fade_out->fast_simple_add (len * 0.918981, 0.68595);
+ _fade_out->fast_simple_add (len * 0.976852, 0.22865);
+ _fade_out->fast_simple_add (len * 1, 0);
break;
case LogB:
- _fade_out.fast_simple_add (len * 0, 1);
- _fade_out.fast_simple_add (len * 0.080645, 0.730556);
- _fade_out.fast_simple_add (len * 0.277778, 0.289256);
- _fade_out.fast_simple_add (len * 0.470046, 0.152778);
- _fade_out.fast_simple_add (len * 0.695853, 0.0694444);
- _fade_out.fast_simple_add (len * 1, 0);
+ _fade_out->fast_simple_add (len * 0, 1);
+ _fade_out->fast_simple_add (len * 0.080645, 0.730556);
+ _fade_out->fast_simple_add (len * 0.277778, 0.289256);
+ _fade_out->fast_simple_add (len * 0.470046, 0.152778);
+ _fade_out->fast_simple_add (len * 0.695853, 0.0694444);
+ _fade_out->fast_simple_add (len * 1, 0);
break;
case Linear:
- _fade_out.fast_simple_add (len * 0, 1);
- _fade_out.fast_simple_add (len * 1, 0);
+ _fade_out->fast_simple_add (len * 0, 1);
+ _fade_out->fast_simple_add (len * 1, 0);
break;
}
- _fade_out.thaw ();
+ _fade_out->thaw ();
_fade_out_shape = shape;
send_change (FadeOutChanged);
void
AudioRegion::set_fade_in_length (nframes_t len)
{
- bool changed = _fade_in.extend_to (len);
+ if (len > _length) {
+ len = _length - 1;
+ }
+
+ bool changed = _fade_in->extend_to (len);
if (changed) {
_flags = Flag (_flags & ~DefaultFadeIn);
void
AudioRegion::set_fade_out_length (nframes_t len)
{
- bool changed = _fade_out.extend_to (len);
+ if (len > _length) {
+ len = _length - 1;
+ }
+
+ bool changed = _fade_out->extend_to (len);
if (changed) {
_flags = Flag (_flags & ~DefaultFadeOut);
+ send_change (FadeOutChanged);
}
-
- send_change (FadeOutChanged);
}
void
bool
AudioRegion::fade_in_is_default () const
{
- return _fade_in_shape == Linear && _fade_in.back()->when == 64;
+ return _fade_in_shape == Linear && _fade_in->back()->when == 64;
}
bool
AudioRegion::fade_out_is_default () const
{
- return _fade_out_shape == Linear && _fade_out.back()->when == 64;
+ return _fade_out_shape == Linear && _fade_out->back()->when == 64;
}
void
void
AudioRegion::set_default_envelope ()
{
- _envelope.freeze ();
- _envelope.clear ();
- _envelope.fast_simple_add (0, 1.0f);
- _envelope.fast_simple_add (_length, 1.0f);
- _envelope.thaw ();
+ _envelope->freeze ();
+ _envelope->clear ();
+ _envelope->fast_simple_add (0, 1.0f);
+ _envelope->fast_simple_add (_length, 1.0f);
+ _envelope->thaw ();
}
void
based on the the existing curve.
*/
- _envelope.freeze ();
- _envelope.truncate_end (_length);
- _envelope.set_max_xval (_length);
- _envelope.thaw ();
+ _envelope->freeze ();
+ _envelope->truncate_end (_length);
+ _envelope->set_max_xval (_length);
+ _envelope->thaw ();
- if (_fade_in.back()->when > _length) {
- _fade_in.extend_to (_length);
+ if (_fade_in->back()->when > _length) {
+ _fade_in->extend_to (_length);
send_change (FadeInChanged);
}
- if (_fade_out.back()->when > _length) {
- _fade_out.extend_to (_length);
+ if (_fade_out->back()->when > _length) {
+ _fade_out->extend_to (_length);
send_change (FadeOutChanged);
}
}
{
/* as above, but the shift was from the front */
- _envelope.truncate_start (_length);
+ _envelope->truncate_start (_length);
- if (_fade_in.back()->when > _length) {
- _fade_in.extend_to (_length);
+ if (_fade_in->back()->when > _length) {
+ _fade_in->extend_to (_length);
send_change (FadeInChanged);
}
- if (_fade_out.back()->when > _length) {
- _fade_out.extend_to (_length);
+ if (_fade_out->back()->when > _length) {
+ _fade_out->extend_to (_length);
send_change (FadeOutChanged);
}
}
return 0;
}
-int
-AudioRegion::apply (AudioFilter& filter)
-{
- boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (shared_from_this());
- return filter.run (ar);
-}
-
nframes_t
AudioRegion::read_raw_internal (Sample* buf, nframes_t pos, nframes_t cnt) const
{
return audio_source()->read (buf, pos, cnt);
}
+
int
AudioRegion::exportme (Session& session, AudioExportSpecification& spec)
{