#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 (new AutomationList(ParamID(FadeInAutomation), 0.0, 2.0, 1.0))
- , _fade_out (new AutomationList(ParamID(FadeOutAutomation), 0.0, 2.0, 1.0))
- , _envelope (new AutomationList(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 (new AutomationList(ParamID(FadeInAutomation), 0.0, 2.0, 1.0))
- , _fade_out (new AutomationList(ParamID(FadeOutAutomation), 0.0, 2.0, 1.0))
- , _envelope (new AutomationList(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 (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 (new AutomationList(ParamID(FadeInAutomation), 0.0, 2.0, 1.0))
- , _fade_out (new AutomationList(ParamID(FadeOutAutomation), 0.0, 2.0, 1.0))
- , _envelope (new AutomationList(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 (new AutomationList(ParamID(FadeInAutomation), 0.0, 2.0, 1.0))
- , _fade_out (new AutomationList(ParamID(FadeOutAutomation), 0.0, 2.0, 1.0))
- , _envelope (new AutomationList(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 (new AutomationList(ParamID(FadeInAutomation), 0.0, 2.0, 1.0))
- , _fade_out (new AutomationList(ParamID(FadeOutAutomation), 0.0, 2.0, 1.0))
- , _envelope (new AutomationList(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))
{
- /* 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) {
_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 (new AutomationList(ParamID(FadeInAutomation), 0.0, 2.0, 1.0))
- , _fade_out (new AutomationList(ParamID(FadeOutAutomation), 0.0, 2.0, 1.0))
- , _envelope (new AutomationList(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))
{
_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 (new AutomationList(ParamID(FadeInAutomation), 0.0, 2.0, 1.0))
- , _fade_out (new AutomationList(ParamID(FadeOutAutomation), 0.0, 2.0, 1.0))
- , _envelope (new AutomationList(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 (new AutomationList(ParamID(FadeInAutomation), 0.0, 2.0, 1.0))
- , _fade_out (new AutomationList(ParamID(FadeOutAutomation), 0.0, 2.0, 1.0))
- , _envelope (new AutomationList(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);
}
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);
default_env = true;
}
}
-
+
if (default_env) {
child->add_property ("default", "yes");
} 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)) {
void
AudioRegion::set_fade_in_length (nframes_t len)
{
+ if (len > _length) {
+ len = _length - 1;
+ }
+
bool changed = _fade_in->extend_to (len);
if (changed) {
void
AudioRegion::set_fade_out_length (nframes_t 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
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)
{