2 Copyright (C) 2000-2001 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <sigc++/bind.h>
28 #include <sigc++/class_slot.h>
30 #include <glibmm/thread.h>
32 #include <pbd/basename.h>
33 #include <pbd/xml++.h>
34 #include <pbd/stacktrace.h>
35 #include <pbd/enumwriter.h>
36 #include <pbd/convert.h>
38 #include <ardour/audioregion.h>
39 #include <ardour/session.h>
40 #include <ardour/gain.h>
41 #include <ardour/dB.h>
42 #include <ardour/playlist.h>
43 #include <ardour/audiofilter.h>
44 #include <ardour/audiofilesource.h>
45 #include <ardour/region_factory.h>
46 #include <ardour/transient_detector.h>
52 using namespace ARDOUR;
55 /* a Session will reset these to its chosen defaults by calling AudioRegion::set_default_fade() */
57 Change AudioRegion::FadeInChanged = ARDOUR::new_change();
58 Change AudioRegion::FadeOutChanged = ARDOUR::new_change();
59 Change AudioRegion::FadeInActiveChanged = ARDOUR::new_change();
60 Change AudioRegion::FadeOutActiveChanged = ARDOUR::new_change();
61 Change AudioRegion::EnvelopeActiveChanged = ARDOUR::new_change();
62 Change AudioRegion::ScaleAmplitudeChanged = ARDOUR::new_change();
63 Change AudioRegion::EnvelopeChanged = ARDOUR::new_change();
65 AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, nframes_t length)
66 : Region (start, length, PBD::basename_nosuffix(src->name()), 0, Region::Flag(Region::DefaultFlags|Region::External)),
67 _fade_in (0.0, 2.0, 1.0, false),
68 _fade_out (0.0, 2.0, 1.0, false),
69 _envelope (0.0, 2.0, 1.0, false)
71 /* basic AudioRegion constructor */
73 sources.push_back (src);
74 master_sources.push_back (src);
75 src->GoingAway.connect (mem_fun (*this, &AudioRegion::source_deleted));
77 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
79 afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
82 _scale_amplitude = 1.0;
85 set_default_envelope ();
87 listen_to_my_curves ();
88 listen_to_my_sources ();
91 AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, nframes_t length, const string& name, layer_t layer, Flag flags)
92 : Region (start, length, name, layer, flags),
93 _fade_in (0.0, 2.0, 1.0, false),
94 _fade_out (0.0, 2.0, 1.0, false),
95 _envelope (0.0, 2.0, 1.0, false)
97 /* basic AudioRegion constructor */
99 sources.push_back (src);
100 master_sources.push_back (src);
101 src->GoingAway.connect (mem_fun (*this, &AudioRegion::source_deleted));
103 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
105 afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
108 _scale_amplitude = 1.0;
110 set_default_fades ();
111 set_default_envelope ();
113 listen_to_my_curves ();
114 listen_to_my_sources ();
117 AudioRegion::AudioRegion (const SourceList& srcs, nframes_t start, nframes_t length, const string& name, layer_t layer, Flag flags)
118 : Region (start, length, name, layer, flags),
119 _fade_in (0.0, 2.0, 1.0, false),
120 _fade_out (0.0, 2.0, 1.0, false),
121 _envelope (0.0, 2.0, 1.0, false)
123 /* basic AudioRegion constructor */
125 for (SourceList::const_iterator i=srcs.begin(); i != srcs.end(); ++i) {
126 sources.push_back (*i);
127 master_sources.push_back (*i);
128 (*i)->GoingAway.connect (mem_fun (*this, &AudioRegion::source_deleted));
130 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> ((*i));
132 afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
136 _scale_amplitude = 1.0;
138 set_default_fades ();
139 set_default_envelope ();
141 listen_to_my_curves ();
142 listen_to_my_sources ();
146 AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, nframes_t offset, nframes_t length, const string& name, layer_t layer, Flag flags)
147 : Region (other, offset, length, name, layer, flags),
148 _fade_in (other->_fade_in),
149 _fade_out (other->_fade_out),
150 _envelope (other->_envelope, (double) offset, (double) offset + length)
152 /* create a new AudioRegion, that is part of an existing one */
154 set<boost::shared_ptr<AudioSource> > unique_srcs;
156 for (SourceList::const_iterator i= other->sources.begin(); i != other->sources.end(); ++i) {
157 sources.push_back (*i);
158 (*i)->GoingAway.connect (mem_fun (*this, &AudioRegion::source_deleted));
160 pair<set<boost::shared_ptr<AudioSource> >::iterator,bool> result;
162 result = unique_srcs.insert (*i);
165 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (*i);
167 afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
172 for (SourceList::const_iterator i = other->master_sources.begin(); i != other->master_sources.end(); ++i) {
173 if (unique_srcs.find (*i) == unique_srcs.end()) {
174 (*i)->GoingAway.connect (mem_fun (*this, &AudioRegion::source_deleted));
176 master_sources.push_back (*i);
180 /* return to default fades if the existing ones are too long */
181 _fade_in_disabled = 0;
182 _fade_out_disabled = 0;
185 if (_flags & LeftOfSplit) {
186 if (_fade_in.back()->when >= _length) {
187 set_default_fade_in ();
189 _fade_in_disabled = other->_fade_in_disabled;
191 set_default_fade_out ();
192 _flags = Flag (_flags & ~Region::LeftOfSplit);
195 if (_flags & RightOfSplit) {
196 if (_fade_out.back()->when >= _length) {
197 set_default_fade_out ();
199 _fade_out_disabled = other->_fade_out_disabled;
201 set_default_fade_in ();
202 _flags = Flag (_flags & ~Region::RightOfSplit);
205 _scale_amplitude = other->_scale_amplitude;
207 listen_to_my_curves ();
208 listen_to_my_sources ();
211 AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other)
213 _fade_in (other->_fade_in),
214 _fade_out (other->_fade_out),
215 _envelope (other->_envelope)
218 /* Pure copy constructor */
220 set<boost::shared_ptr<AudioSource> > unique_srcs;
222 for (SourceList::const_iterator i = other->sources.begin(); i != other->sources.end(); ++i) {
223 sources.push_back (*i);
224 (*i)->GoingAway.connect (mem_fun (*this, &AudioRegion::source_deleted));
225 pair<set<boost::shared_ptr<AudioSource> >::iterator,bool> result;
227 result = unique_srcs.insert (*i);
230 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (*i);
232 afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
237 for (SourceList::const_iterator i = other->master_sources.begin(); i != other->master_sources.end(); ++i) {
238 master_sources.push_back (*i);
239 if (unique_srcs.find (*i) == unique_srcs.end()) {
240 (*i)->GoingAway.connect (mem_fun (*this, &AudioRegion::source_deleted));
244 _scale_amplitude = other->_scale_amplitude;
246 _fade_in_disabled = 0;
247 _fade_out_disabled = 0;
249 listen_to_my_curves ();
250 listen_to_my_sources ();
253 AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, const SourceList& srcs,
254 nframes_t length, const string& name, layer_t layer, Flag flags)
255 : Region (other, length, name, layer, flags),
256 _fade_in (other->_fade_in),
257 _fade_out (other->_fade_out),
258 _envelope (other->_envelope)
261 /* make-a-sort-of-copy-with-different-sources constructor (used by audio filter) */
263 set<boost::shared_ptr<AudioSource> > unique_srcs;
265 for (SourceList::const_iterator i=srcs.begin(); i != srcs.end(); ++i) {
266 sources.push_back (*i);
267 master_sources.push_back (*i);
268 (*i)->GoingAway.connect (mem_fun (*this, &AudioRegion::source_deleted));
270 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> ((*i));
272 afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
276 _scale_amplitude = other->_scale_amplitude;
278 _fade_in_disabled = 0;
279 _fade_out_disabled = 0;
281 listen_to_my_curves ();
282 listen_to_my_sources ();
285 AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, const XMLNode& node)
287 _fade_in (0.0, 2.0, 1.0, false),
288 _fade_out (0.0, 2.0, 1.0, false),
289 _envelope (0.0, 2.0, 1.0, false)
291 sources.push_back (src);
292 master_sources.push_back (src);
293 src->GoingAway.connect (mem_fun (*this, &AudioRegion::source_deleted));
295 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
297 afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
300 set_default_fades ();
302 if (set_state (node)) {
303 throw failed_constructor();
306 listen_to_my_curves ();
307 listen_to_my_sources ();
310 AudioRegion::AudioRegion (SourceList& srcs, const XMLNode& node)
312 _fade_in (0.0, 2.0, 1.0, false),
313 _fade_out (0.0, 2.0, 1.0, false),
314 _envelope (0.0, 2.0, 1.0, false)
316 set<boost::shared_ptr<AudioSource> > unique_srcs;
318 for (SourceList::iterator i=srcs.begin(); i != srcs.end(); ++i) {
319 sources.push_back (*i);
320 (*i)->GoingAway.connect (mem_fun (*this, &AudioRegion::source_deleted));
321 pair<set<boost::shared_ptr<AudioSource> >::iterator,bool> result;
323 result = unique_srcs.insert (*i);
326 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (*i);
328 afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
333 for (SourceList::iterator i = srcs.begin(); i != srcs.end(); ++i) {
334 master_sources.push_back (*i);
335 if (unique_srcs.find (*i) == unique_srcs.end()) {
336 (*i)->GoingAway.connect (mem_fun (*this, &AudioRegion::source_deleted));
340 set_default_fades ();
341 _scale_amplitude = 1.0;
343 if (set_state (node)) {
344 throw failed_constructor();
347 listen_to_my_curves ();
348 listen_to_my_sources ();
351 AudioRegion::~AudioRegion ()
353 boost::shared_ptr<Playlist> pl (playlist());
356 for (SourceList::const_iterator i = sources.begin(); i != sources.end(); ++i) {
357 (*i)->remove_playlist (pl);
359 for (SourceList::const_iterator i = master_sources.begin(); i != master_sources.end(); ++i) {
360 (*i)->remove_playlist (pl);
365 GoingAway (); /* EMIT SIGNAL */
369 AudioRegion::listen_to_my_sources ()
371 for (SourceList::const_iterator i = sources.begin(); i != sources.end(); ++i) {
372 (*i)->AnalysisChanged.connect (mem_fun (*this, &AudioRegion::invalidate_transients));
377 AudioRegion::listen_to_my_curves ()
379 _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
380 _fade_in.StateChanged.connect (mem_fun (*this, &AudioRegion::fade_in_changed));
381 _fade_out.StateChanged.connect (mem_fun (*this, &AudioRegion::fade_out_changed));
385 AudioRegion::verify_length (nframes_t& len)
387 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source());
389 if (afs && afs->destructive()) {
393 nframes_t maxlen = 0;
395 for (uint32_t n=0; n < sources.size(); ++n) {
396 maxlen = max (maxlen, sources[n]->length() - _start);
399 len = min (len, maxlen);
405 AudioRegion::verify_start_and_length (nframes_t new_start, nframes_t& new_length)
407 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source());
409 if (afs && afs->destructive()) {
413 nframes_t maxlen = 0;
415 for (uint32_t n=0; n < sources.size(); ++n) {
416 maxlen = max (maxlen, sources[n]->length() - new_start);
419 new_length = min (new_length, maxlen);
425 AudioRegion::verify_start (nframes_t pos)
427 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source());
429 if (afs && afs->destructive()) {
433 for (uint32_t n=0; n < sources.size(); ++n) {
434 if (pos > sources[n]->length() - _length) {
442 AudioRegion::verify_start_mutable (nframes_t& new_start)
444 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source());
446 if (afs && afs->destructive()) {
450 for (uint32_t n=0; n < sources.size(); ++n) {
451 if (new_start > sources[n]->length() - _length) {
452 new_start = sources[n]->length() - _length;
458 AudioRegion::set_envelope_active (bool yn)
460 if (envelope_active() != yn) {
463 snprintf (buf, sizeof (buf), "envelope active");
464 _flags = Flag (_flags|EnvelopeActive);
466 snprintf (buf, sizeof (buf), "envelope off");
467 _flags = Flag (_flags & ~EnvelopeActive);
469 send_change (EnvelopeActiveChanged);
474 AudioRegion::read_peaks (PeakData *buf, nframes_t npeaks, nframes_t offset, nframes_t cnt, uint32_t chan_n, double samples_per_unit) const
476 if (chan_n >= sources.size()) {
480 if (sources[chan_n]->read_peaks (buf, npeaks, offset, cnt, samples_per_unit)) {
483 if (_scale_amplitude != 1.0) {
484 for (nframes_t n = 0; n < npeaks; ++n) {
485 buf[n].max *= _scale_amplitude;
486 buf[n].min *= _scale_amplitude;
494 AudioRegion::read (Sample* buf, nframes64_t timeline_position, nframes64_t cnt, int channel) const
496 /* raw read, no fades, no gain, nada */
497 return _read_at (sources, _length, buf, 0, 0, _position + timeline_position, cnt, channel, 0, 0, ReadOps (0));
501 AudioRegion::read_with_ops (Sample* buf, nframes64_t file_position, nframes64_t cnt, int channel, ReadOps rops) const
503 return _read_at (sources, _length, buf, 0, 0, file_position, cnt, channel, 0, 0, rops);
507 AudioRegion::read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, nframes_t file_position,
509 uint32_t chan_n, nframes_t read_frames, nframes_t skip_frames) const
511 /* regular diskstream/butler read complete with fades etc */
512 return _read_at (sources, _length, buf, mixdown_buffer, gain_buffer, file_position, cnt, chan_n, read_frames, skip_frames, ReadOps (~0));
516 AudioRegion::master_read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, nframes_t position,
517 nframes_t cnt, uint32_t chan_n) const
519 return _read_at (master_sources, master_sources.front()->length(), buf, mixdown_buffer, gain_buffer, position, cnt, chan_n, 0, 0);
523 AudioRegion::_read_at (const SourceList& srcs, nframes_t limit,
524 Sample *buf, Sample *mixdown_buffer, float *gain_buffer,
525 nframes_t position, nframes_t cnt,
527 nframes_t read_frames,
528 nframes_t skip_frames,
531 nframes_t internal_offset;
532 nframes_t buf_offset;
534 bool raw = (rops == ReadOpsNone);
536 if (muted() && !raw) {
537 return 0; /* read nothing */
540 /* precondition: caller has verified that we cover the desired section */
542 if (position < _position) {
544 buf_offset = _position - position;
547 internal_offset = position - _position;
551 if (internal_offset >= limit) {
552 return 0; /* read nothing */
555 if ((to_read = min (cnt, limit - internal_offset)) == 0) {
556 return 0; /* read nothing */
559 if (opaque() || raw) {
560 /* overwrite whatever is there */
561 mixdown_buffer = buf + buf_offset;
563 mixdown_buffer += buf_offset;
566 if (rops & ReadOpsCount) {
567 _read_data_count = 0;
570 if (chan_n < n_channels()) {
572 if (srcs[chan_n]->read (mixdown_buffer, _start + internal_offset, to_read) != to_read) {
573 return 0; /* "read nothing" */
576 if (rops & ReadOpsCount) {
577 _read_data_count += srcs[chan_n]->read_data_count();
582 /* track is N-channel, this region has less channels; silence the ones
586 memset (mixdown_buffer, 0, sizeof (Sample) * cnt);
589 if (rops & ReadOpsFades) {
593 if ((_flags & FadeIn) && Config->get_use_region_fades()) {
595 nframes_t fade_in_length = (nframes_t) _fade_in.back()->when;
597 /* see if this read is within the fade in */
599 if (internal_offset < fade_in_length) {
603 fi_limit = min (to_read, fade_in_length - internal_offset);
605 _fade_in.get_vector (internal_offset, internal_offset+fi_limit, gain_buffer, fi_limit);
607 for (nframes_t n = 0; n < fi_limit; ++n) {
608 mixdown_buffer[n] *= gain_buffer[n];
615 if ((_flags & FadeOut) && Config->get_use_region_fades()) {
617 /* see if some part of this read is within the fade out */
619 /* ................. >| REGION
625 limit - fade_out_length
628 ^internal_offset + to_read
630 we need the intersection of [internal_offset,internal_offset+to_read] with
631 [limit - fade_out_length, limit]
636 nframes_t fade_out_length = (nframes_t) _fade_out.back()->when;
637 nframes_t fade_interval_start = max(internal_offset, limit-fade_out_length);
638 nframes_t fade_interval_end = min(internal_offset + to_read, limit);
640 if (fade_interval_end > fade_interval_start) {
641 /* (part of the) the fade out is in this buffer */
643 nframes_t fo_limit = fade_interval_end - fade_interval_start;
644 nframes_t curve_offset = fade_interval_start - (limit-fade_out_length);
645 nframes_t fade_offset = fade_interval_start - internal_offset;
647 _fade_out.get_vector (curve_offset,curve_offset+fo_limit, gain_buffer, fo_limit);
649 for (nframes_t n = 0, m = fade_offset; n < fo_limit; ++n, ++m) {
650 mixdown_buffer[m] *= gain_buffer[n];
657 /* Regular gain curves and scaling */
659 if ((rops & ReadOpsOwnAutomation) && envelope_active()) {
660 _envelope.get_vector (internal_offset, internal_offset + to_read, gain_buffer, to_read);
662 if ((rops & ReadOpsOwnScaling) && _scale_amplitude != 1.0f) {
663 for (nframes_t n = 0; n < to_read; ++n) {
664 mixdown_buffer[n] *= gain_buffer[n] * _scale_amplitude;
667 for (nframes_t n = 0; n < to_read; ++n) {
668 mixdown_buffer[n] *= gain_buffer[n];
671 } else if ((rops & ReadOpsOwnScaling) && _scale_amplitude != 1.0f) {
672 Session::apply_gain_to_buffer (mixdown_buffer, to_read, _scale_amplitude);
677 /* gack. the things we do for users.
682 for (nframes_t n = 0; n < to_read; ++n) {
683 buf[n] += mixdown_buffer[n];
691 AudioRegion::state (bool full)
693 XMLNode& node (Region::state (full));
697 LocaleGuard lg (X_("POSIX"));
699 node.add_property ("flags", enum_2_string (_flags));
701 snprintf (buf, sizeof(buf), "%.12g", _scale_amplitude);
702 node.add_property ("scale-gain", buf);
704 for (uint32_t n=0; n < sources.size(); ++n) {
705 snprintf (buf2, sizeof(buf2), "source-%d", n);
706 sources[n]->id().print (buf, sizeof (buf));
707 node.add_property (buf2, buf);
710 snprintf (buf, sizeof (buf), "%u", (uint32_t) sources.size());
711 node.add_property ("channels", buf);
715 child = node.add_child (X_("FadeIn"));
717 if ((_flags & DefaultFadeIn)) {
718 child->add_property (X_("default"), X_("yes"));
720 child->add_child_nocopy (_fade_in.get_state ());
723 child->add_property (X_("active"), _fade_in_disabled ? X_("no") : X_("yes"));
725 child = node.add_child (X_("FadeOut"));
727 if ((_flags & DefaultFadeOut)) {
728 child->add_property (X_("default"), X_("yes"));
730 child->add_child_nocopy (_fade_out.get_state ());
733 child->add_property (X_("active"), _fade_out_disabled ? X_("no") : X_("yes"));
736 child = node.add_child ("Envelope");
739 bool default_env = false;
741 // If there are only two points, the points are in the start of the region and the end of the region
742 // so, if they are both at 1.0f, that means the default region.
744 if (_envelope.size() == 2 &&
745 _envelope.front()->value == 1.0f &&
746 _envelope.back()->value==1.0f) {
747 if (_envelope.front()->when == 0 && _envelope.back()->when == _length) {
753 child->add_property ("default", "yes");
755 child->add_child_nocopy (_envelope.get_state ());
759 child->add_property ("default", "yes");
762 for (uint32_t n=0; n < master_sources.size(); ++n) {
763 snprintf (buf2, sizeof(buf2), "master-source-%d", n);
764 master_sources[n]->id().print (buf, sizeof (buf));
765 node.add_property (buf2, buf);
768 if (full && _extra_xml) {
769 node.add_child_copy (*_extra_xml);
776 AudioRegion::set_live_state (const XMLNode& node, Change& what_changed, bool send)
778 const XMLNodeList& nlist = node.children();
779 const XMLProperty *prop;
780 LocaleGuard lg (X_("POSIX"));
782 Region::set_live_state (node, what_changed, false);
784 uint32_t old_flags = _flags;
786 if ((prop = node.property ("flags")) != 0) {
787 _flags = Flag (string_2_enum (prop->value(), _flags));
789 //_flags = Flag (strtol (prop->value().c_str(), (char **) 0, 16));
791 _flags = Flag (_flags & ~Region::LeftOfSplit);
792 _flags = Flag (_flags & ~Region::RightOfSplit);
795 if ((old_flags ^ _flags) & Muted) {
796 what_changed = Change (what_changed|MuteChanged);
798 if ((old_flags ^ _flags) & Opaque) {
799 what_changed = Change (what_changed|OpacityChanged);
801 if ((old_flags ^ _flags) & Locked) {
802 what_changed = Change (what_changed|LockChanged);
805 if ((prop = node.property ("scale-gain")) != 0) {
806 _scale_amplitude = atof (prop->value().c_str());
807 what_changed = Change (what_changed|ScaleAmplitudeChanged);
809 _scale_amplitude = 1.0;
812 /* Now find envelope description and other misc child items */
814 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
821 if (child->name() == "Envelope") {
825 if ((prop = child->property ("default")) != 0 || _envelope.set_state (*child)) {
826 set_default_envelope ();
829 _envelope.set_max_xval (_length);
830 _envelope.truncate_end (_length);
832 } else if (child->name() == "FadeIn") {
836 if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0) {
837 set_default_fade_in ();
839 XMLNode* grandchild = child->child ("AutomationList");
841 _fade_in.set_state (*grandchild);
845 if ((prop = child->property ("active")) != 0) {
846 if (prop->value() == "yes") {
847 set_fade_in_active (true);
849 set_fade_in_active (true);
853 } else if (child->name() == "FadeOut") {
857 if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0) {
858 set_default_fade_out ();
860 XMLNode* grandchild = child->child ("AutomationList");
862 _fade_out.set_state (*grandchild);
866 if ((prop = child->property ("active")) != 0) {
867 if (prop->value() == "yes") {
868 set_fade_out_active (true);
870 set_fade_out_active (false);
878 send_change (what_changed);
885 AudioRegion::set_state (const XMLNode& node)
887 /* Region::set_state() calls the virtual set_live_state(),
888 which will get us back to AudioRegion::set_live_state()
889 to handle the relevant stuff.
892 return Region::set_state (node);
896 AudioRegion::set_fade_in_shape (FadeShape shape)
898 set_fade_in (shape, (nframes_t) _fade_in.back()->when);
902 AudioRegion::set_fade_out_shape (FadeShape shape)
904 set_fade_out (shape, (nframes_t) _fade_out.back()->when);
908 AudioRegion::set_fade_in (FadeShape shape, nframes_t len)
915 _fade_in.fast_simple_add (0.0, 0.0);
916 _fade_in.fast_simple_add (len, 1.0);
920 _fade_in.fast_simple_add (0, 0);
921 _fade_in.fast_simple_add (len * 0.389401, 0.0333333);
922 _fade_in.fast_simple_add (len * 0.629032, 0.0861111);
923 _fade_in.fast_simple_add (len * 0.829493, 0.233333);
924 _fade_in.fast_simple_add (len * 0.9447, 0.483333);
925 _fade_in.fast_simple_add (len * 0.976959, 0.697222);
926 _fade_in.fast_simple_add (len, 1);
930 _fade_in.fast_simple_add (0, 0);
931 _fade_in.fast_simple_add (len * 0.0207373, 0.197222);
932 _fade_in.fast_simple_add (len * 0.0645161, 0.525);
933 _fade_in.fast_simple_add (len * 0.152074, 0.802778);
934 _fade_in.fast_simple_add (len * 0.276498, 0.919444);
935 _fade_in.fast_simple_add (len * 0.481567, 0.980556);
936 _fade_in.fast_simple_add (len * 0.767281, 1);
937 _fade_in.fast_simple_add (len, 1);
941 _fade_in.fast_simple_add (0, 0);
942 _fade_in.fast_simple_add (len * 0.0737327, 0.308333);
943 _fade_in.fast_simple_add (len * 0.246544, 0.658333);
944 _fade_in.fast_simple_add (len * 0.470046, 0.886111);
945 _fade_in.fast_simple_add (len * 0.652074, 0.972222);
946 _fade_in.fast_simple_add (len * 0.771889, 0.988889);
947 _fade_in.fast_simple_add (len, 1);
951 _fade_in.fast_simple_add (0, 0);
952 _fade_in.fast_simple_add (len * 0.304147, 0.0694444);
953 _fade_in.fast_simple_add (len * 0.529954, 0.152778);
954 _fade_in.fast_simple_add (len * 0.725806, 0.333333);
955 _fade_in.fast_simple_add (len * 0.847926, 0.558333);
956 _fade_in.fast_simple_add (len * 0.919355, 0.730556);
957 _fade_in.fast_simple_add (len, 1);
962 _fade_in_shape = shape;
964 send_change (FadeInChanged);
968 AudioRegion::set_fade_out (FadeShape shape, nframes_t len)
975 _fade_out.fast_simple_add (len * 0, 1);
976 _fade_out.fast_simple_add (len * 0.023041, 0.697222);
977 _fade_out.fast_simple_add (len * 0.0553, 0.483333);
978 _fade_out.fast_simple_add (len * 0.170507, 0.233333);
979 _fade_out.fast_simple_add (len * 0.370968, 0.0861111);
980 _fade_out.fast_simple_add (len * 0.610599, 0.0333333);
981 _fade_out.fast_simple_add (len * 1, 0);
985 _fade_out.fast_simple_add (len * 0, 1);
986 _fade_out.fast_simple_add (len * 0.228111, 0.988889);
987 _fade_out.fast_simple_add (len * 0.347926, 0.972222);
988 _fade_out.fast_simple_add (len * 0.529954, 0.886111);
989 _fade_out.fast_simple_add (len * 0.753456, 0.658333);
990 _fade_out.fast_simple_add (len * 0.9262673, 0.308333);
991 _fade_out.fast_simple_add (len * 1, 0);
995 _fade_out.fast_simple_add (len * 0, 1);
996 _fade_out.fast_simple_add (len * 0.305556, 1);
997 _fade_out.fast_simple_add (len * 0.548611, 0.991736);
998 _fade_out.fast_simple_add (len * 0.759259, 0.931129);
999 _fade_out.fast_simple_add (len * 0.918981, 0.68595);
1000 _fade_out.fast_simple_add (len * 0.976852, 0.22865);
1001 _fade_out.fast_simple_add (len * 1, 0);
1005 _fade_out.fast_simple_add (len * 0, 1);
1006 _fade_out.fast_simple_add (len * 0.080645, 0.730556);
1007 _fade_out.fast_simple_add (len * 0.277778, 0.289256);
1008 _fade_out.fast_simple_add (len * 0.470046, 0.152778);
1009 _fade_out.fast_simple_add (len * 0.695853, 0.0694444);
1010 _fade_out.fast_simple_add (len * 1, 0);
1014 _fade_out.fast_simple_add (len * 0, 1);
1015 _fade_out.fast_simple_add (len * 1, 0);
1020 _fade_out_shape = shape;
1022 send_change (FadeOutChanged);
1026 AudioRegion::set_fade_in_length (nframes_t len)
1028 if (len > _length) {
1032 bool changed = _fade_in.extend_to (len);
1035 _flags = Flag (_flags & ~DefaultFadeIn);
1036 send_change (FadeInChanged);
1041 AudioRegion::set_fade_out_length (nframes_t len)
1043 if (len > _length) {
1047 bool changed = _fade_out.extend_to (len);
1050 _flags = Flag (_flags & ~DefaultFadeOut);
1051 send_change (FadeOutChanged);
1056 AudioRegion::set_fade_in_active (bool yn)
1058 if (yn == (_flags & FadeIn)) {
1062 _flags = Flag (_flags|FadeIn);
1064 _flags = Flag (_flags & ~FadeIn);
1067 send_change (FadeInActiveChanged);
1071 AudioRegion::set_fade_out_active (bool yn)
1073 if (yn == (_flags & FadeOut)) {
1077 _flags = Flag (_flags | FadeOut);
1079 _flags = Flag (_flags & ~FadeOut);
1082 send_change (FadeOutActiveChanged);
1086 AudioRegion::fade_in_is_default () const
1088 return _fade_in_shape == Linear && _fade_in.back()->when == 64;
1092 AudioRegion::fade_out_is_default () const
1094 return _fade_out_shape == Linear && _fade_out.back()->when == 64;
1098 AudioRegion::set_default_fade_in ()
1100 set_fade_in (Linear, 64);
1104 AudioRegion::set_default_fade_out ()
1106 set_fade_out (Linear, 64);
1110 AudioRegion::set_default_fades ()
1112 _fade_in_disabled = 0;
1113 _fade_out_disabled = 0;
1114 set_default_fade_in ();
1115 set_default_fade_out ();
1119 AudioRegion::set_default_envelope ()
1121 _envelope.freeze ();
1123 _envelope.fast_simple_add (0, 1.0f);
1124 _envelope.fast_simple_add (_length, 1.0f);
1129 AudioRegion::recompute_at_end ()
1131 /* our length has changed. recompute a new final point by interpolating
1132 based on the the existing curve.
1135 _envelope.freeze ();
1136 _envelope.truncate_end (_length);
1137 _envelope.set_max_xval (_length);
1140 if (_fade_in.back()->when > _length) {
1141 _fade_in.extend_to (_length);
1142 send_change (FadeInChanged);
1145 if (_fade_out.back()->when > _length) {
1146 _fade_out.extend_to (_length);
1147 send_change (FadeOutChanged);
1152 AudioRegion::recompute_at_start ()
1154 /* as above, but the shift was from the front */
1156 _envelope.truncate_start (_length);
1158 if (_fade_in.back()->when > _length) {
1159 _fade_in.extend_to (_length);
1160 send_change (FadeInChanged);
1163 if (_fade_out.back()->when > _length) {
1164 _fade_out.extend_to (_length);
1165 send_change (FadeOutChanged);
1170 AudioRegion::separate_by_channel (Session& session, vector<boost::shared_ptr<AudioRegion> >& v) const
1176 if (sources.size() < 2) {
1182 for (SourceList::const_iterator i = sources.begin(); i != sources.end(); ++i) {
1185 srcs.push_back (*i);
1189 if (sources.size() == 2) {
1197 new_name += ('0' + n + 1);
1200 /* create a copy with just one source. prevent if from being thought of as "whole file" even if
1201 it covers the entire source file(s).
1204 Flag f = Flag (_flags & ~WholeFile);
1206 boost::shared_ptr<Region> r = RegionFactory::create (srcs, _start, _length, new_name, _layer, f);
1207 boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (r);
1218 AudioRegion::source_deleted ()
1225 AudioRegion::master_source_names ()
1227 SourceList::iterator i;
1229 vector<string> names;
1230 for (i = master_sources.begin(); i != master_sources.end(); ++i) {
1231 names.push_back((*i)->name());
1238 AudioRegion::set_master_sources (const SourceList& srcs)
1240 master_sources = srcs;
1244 AudioRegion::source_equivalent (boost::shared_ptr<const Region> o) const
1246 boost::shared_ptr<const AudioRegion> other = boost::dynamic_pointer_cast<const AudioRegion>(o);
1251 SourceList::const_iterator i;
1252 SourceList::const_iterator io;
1254 for (i = sources.begin(), io = other->sources.begin(); i != sources.end() && io != other->sources.end(); ++i, ++io) {
1255 if ((*i)->id() != (*io)->id()) {
1260 for (i = master_sources.begin(), io = other->master_sources.begin(); i != master_sources.end() && io != other->master_sources.end(); ++i, ++io) {
1261 if ((*i)->id() != (*io)->id()) {
1270 AudioRegion::apply (AudioFilter& filter)
1272 boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (shared_from_this());
1273 return filter.run (ar);
1277 AudioRegion::exportme (Session& session, AudioExportSpecification& spec)
1279 const nframes_t blocksize = 4096;
1283 spec.channels = sources.size();
1285 if (spec.prepare (blocksize, session.frame_rate())) {
1290 spec.total_frames = _length;
1292 while (spec.pos < _length && !spec.stop) {
1295 /* step 1: interleave */
1297 to_read = min (_length - spec.pos, blocksize);
1299 if (spec.channels == 1) {
1301 if (sources.front()->read (spec.dataF, _start + spec.pos, to_read) != to_read) {
1307 Sample buf[blocksize];
1309 for (uint32_t chan = 0; chan < spec.channels; ++chan) {
1311 if (sources[chan]->read (buf, _start + spec.pos, to_read) != to_read) {
1315 for (nframes_t x = 0; x < to_read; ++x) {
1316 spec.dataF[chan+(x*spec.channels)] = buf[x];
1321 if (spec.process (to_read)) {
1325 spec.pos += to_read;
1326 spec.progress = (double) spec.pos /_length;
1333 spec.running = false;
1334 spec.status = status;
1340 boost::shared_ptr<Region>
1341 AudioRegion::get_parent() const
1343 boost::shared_ptr<Playlist> pl (playlist());
1346 boost::shared_ptr<AudioRegion> ar;
1347 boost::shared_ptr<AudioRegion const> grrr2 = boost::dynamic_pointer_cast<AudioRegion const> (shared_from_this());
1349 if (grrr2 && (ar = pl->session().find_whole_file_parent (grrr2))) {
1350 return boost::static_pointer_cast<Region> (ar);
1354 return boost::shared_ptr<Region>();
1358 AudioRegion::set_scale_amplitude (gain_t g)
1360 boost::shared_ptr<Playlist> pl (playlist());
1362 _scale_amplitude = g;
1364 /* tell the diskstream we're in */
1370 /* tell everybody else */
1372 send_change (ScaleAmplitudeChanged);
1376 AudioRegion::normalize_to (float target_dB)
1378 const nframes_t blocksize = 64 * 1024;
1379 Sample buf[blocksize];
1384 gain_t target = dB_to_coefficient (target_dB);
1386 if (target == 1.0f) {
1387 /* do not normalize to precisely 1.0 (0 dBFS), to avoid making it appear
1388 that we may have clipped.
1390 target -= FLT_EPSILON;
1394 fend = _start + _length;
1396 /* first pass: find max amplitude */
1398 while (fpos < fend) {
1402 to_read = min (fend - fpos, blocksize);
1404 for (n = 0; n < n_channels(); ++n) {
1408 if (source (n)->read (buf, fpos, to_read) != to_read) {
1412 maxamp = Session::compute_peak (buf, to_read, maxamp);
1418 if (maxamp == 0.0f) {
1419 /* don't even try */
1423 if (maxamp == target) {
1424 /* we can't do anything useful */
1428 /* compute scale factor */
1430 _scale_amplitude = target/maxamp;
1432 /* tell the diskstream we're in */
1434 boost::shared_ptr<Playlist> pl (playlist());
1440 /* tell everybody else */
1442 send_change (ScaleAmplitudeChanged);
1446 AudioRegion::fade_in_changed ()
1448 send_change (FadeInChanged);
1452 AudioRegion::fade_out_changed ()
1454 send_change (FadeOutChanged);
1458 AudioRegion::envelope_changed ()
1460 send_change (EnvelopeChanged);
1464 AudioRegion::suspend_fade_in ()
1466 if (++_fade_in_disabled == 1) {
1467 if (fade_in_is_default()) {
1468 set_fade_in_active (false);
1474 AudioRegion::resume_fade_in ()
1476 if (--_fade_in_disabled == 0 && _fade_in_disabled) {
1477 set_fade_in_active (true);
1482 AudioRegion::suspend_fade_out ()
1484 if (++_fade_out_disabled == 1) {
1485 if (fade_out_is_default()) {
1486 set_fade_out_active (false);
1492 AudioRegion::resume_fade_out ()
1494 if (--_fade_out_disabled == 0 &&_fade_out_disabled) {
1495 set_fade_out_active (true);
1500 AudioRegion::speed_mismatch (float sr) const
1502 if (sources.empty()) {
1503 /* impossible, but ... */
1507 float fsr = sources.front()->sample_rate();
1513 AudioRegion::source_offset_changed ()
1515 /* XXX this fixes a crash that should not occur. It does occur
1516 becauses regions are not being deleted when a session
1517 is unloaded. That bug must be fixed.
1520 if (sources.empty()) {
1524 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(sources.front());
1526 if (afs && afs->destructive()) {
1527 // set_start (source()->natural_position(), this);
1528 set_position (source()->natural_position(), this);
1533 AudioRegion::set_playlist (boost::weak_ptr<Playlist> wpl)
1535 boost::shared_ptr<Playlist> old_playlist = (_playlist.lock());
1537 boost::shared_ptr<Playlist> pl (wpl.lock());
1539 if (old_playlist == pl) {
1543 Region::set_playlist (wpl);
1547 for (SourceList::const_iterator i = sources.begin(); i != sources.end(); ++i) {
1548 (*i)->remove_playlist (_playlist);
1549 (*i)->add_playlist (pl);
1551 for (SourceList::const_iterator i = master_sources.begin(); i != master_sources.end(); ++i) {
1552 (*i)->remove_playlist (_playlist);
1553 (*i)->add_playlist (pl);
1556 for (SourceList::const_iterator i = sources.begin(); i != sources.end(); ++i) {
1557 (*i)->add_playlist (pl);
1559 for (SourceList::const_iterator i = master_sources.begin(); i != master_sources.end(); ++i) {
1560 (*i)->add_playlist (pl);
1565 for (SourceList::const_iterator i = sources.begin(); i != sources.end(); ++i) {
1566 (*i)->remove_playlist (old_playlist);
1568 for (SourceList::const_iterator i = master_sources.begin(); i != master_sources.end(); ++i) {
1569 (*i)->remove_playlist (old_playlist);
1576 AudioRegion::get_transients (AnalysisFeatureList& results, bool force_new)
1578 boost::shared_ptr<Playlist> pl = playlist();
1584 if (valid_transients && !force_new) {
1585 results = _transients;
1589 SourceList::iterator s;
1591 for (s = sources.begin() ; s != sources.end(); ++s) {
1592 if (!(*s)->has_been_analysed()) {
1593 cerr << "For " << name() << " source " << (*s)->name() << " has not been analyzed\n";
1598 if (s == sources.end()) {
1599 /* all sources are analyzed, merge data from each one */
1601 for (s = sources.begin() ; s != sources.end(); ++s) {
1603 /* find the set of transients within the bounds of this region */
1605 AnalysisFeatureList::iterator low = lower_bound ((*s)->transients.begin(),
1606 (*s)->transients.end(),
1609 AnalysisFeatureList::iterator high = upper_bound ((*s)->transients.begin(),
1610 (*s)->transients.end(),
1615 results.insert (results.end(), low, high);
1618 TransientDetector::cleanup_transients (results, pl->session().frame_rate(), 3.0);
1620 /* translate all transients to current position */
1622 for (AnalysisFeatureList::iterator x = results.begin(); x != results.end(); ++x) {
1627 _transients = results;
1628 valid_transients = true;
1633 /* no existing/complete transient info */
1635 if (!Config->get_auto_analyse_audio()) {
1636 pl->session().Dialog (_("\
1637 You have requested an operation that requires audio analysis.\n\n\
1638 You currently have \"auto-analyse-audio\" disabled, which means\n\
1639 that transient data must be generated every time it is required.\n\n\
1640 If you are doing work that will require transient data on a\n\
1641 regular basis, you should probably enable \"auto-analyse-audio\"\n\
1642 then quit ardour and restart."));
1645 TransientDetector t (pl->session().frame_rate());
1646 bool existing_results = !results.empty();
1648 _transients.clear ();
1649 valid_transients = false;
1651 for (uint32_t i = 0; i < n_channels(); ++i) {
1653 AnalysisFeatureList these_results;
1657 if (t.run ("", this, i, these_results)) {
1661 /* translate all transients to give absolute position */
1663 for (AnalysisFeatureList::iterator i = these_results.begin(); i != these_results.end(); ++i) {
1669 _transients.insert (_transients.end(), these_results.begin(), these_results.end());
1672 if (!results.empty()) {
1673 if (existing_results) {
1675 /* merge our transients into the existing ones, then clean up
1679 results.insert (results.end(), _transients.begin(), _transients.end());
1680 TransientDetector::cleanup_transients (results, pl->session().frame_rate(), 3.0);
1683 /* make sure ours are clean too */
1685 TransientDetector::cleanup_transients (_transients, pl->session().frame_rate(), 3.0);
1689 TransientDetector::cleanup_transients (_transients, pl->session().frame_rate(), 3.0);
1690 results = _transients;
1693 valid_transients = true;
1700 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)
1702 return ((AudioRegion *) arg)->read_peaks ((PeakData *) data, (nframes_t) npeaks, (nframes_t) start, (nframes_t) cnt, n_chan,samples_per_unit);
1705 uint32_t region_length_from_c (void *arg)
1708 return ((AudioRegion *) arg)->length();
1711 uint32_t sourcefile_length_from_c (void *arg, double zoom_factor)
1713 return ( (AudioRegion *) arg)->source()->available_peaks (zoom_factor) ;