2 Copyright (C) 2000-2006 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.
28 #include <glibmm/thread.h>
30 #include "pbd/basename.h"
31 #include "pbd/xml++.h"
32 #include "pbd/stacktrace.h"
33 #include "pbd/enumwriter.h"
34 #include "pbd/convert.h"
36 #include "evoral/Curve.hpp"
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/audiofilesource.h"
44 #include "ardour/region_factory.h"
45 #include "ardour/runtime_functions.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();
68 _scale_amplitude = 1.0;
71 set_default_envelope ();
73 listen_to_my_curves ();
74 connect_to_analysis_changed ();
77 /** Constructor for use by derived types only */
78 AudioRegion::AudioRegion (Session& s, nframes_t start, nframes_t length, string name)
79 : Region (s, start, length, name, DataType::AUDIO)
81 , _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation)))
82 , _fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation)))
83 , _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation)))
86 assert (_sources.size() == _master_sources.size());
89 /** Basic AudioRegion constructor (one channel) */
90 AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, nframes_t length)
91 : Region (src, start, length, PBD::basename_nosuffix(src->name()), DataType::AUDIO, 0, Region::Flag(Region::DefaultFlags|Region::External))
92 , _automatable(src->session())
93 , _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation)))
94 , _fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation)))
95 , _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation)))
97 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
99 afs->HeaderPositionOffsetChanged.connect_same_thread (*this, boost::bind (&AudioRegion::source_offset_changed, this));
103 assert (_sources.size() == _master_sources.size());
106 /* Basic AudioRegion constructor (one channel) */
107 AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, nframes_t length, const string& name, layer_t layer, Flag flags)
108 : Region (src, start, length, name, DataType::AUDIO, layer, flags)
109 , _automatable(src->session())
110 , _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation)))
111 , _fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation)))
112 , _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation)))
114 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
116 afs->HeaderPositionOffsetChanged.connect_same_thread (*this, boost::bind (&AudioRegion::source_offset_changed, this));
120 assert (_sources.size() == _master_sources.size());
123 /** Basic AudioRegion constructor (many channels) */
124 AudioRegion::AudioRegion (const SourceList& srcs, nframes_t start, nframes_t length, const string& name, layer_t layer, Flag flags)
125 : Region (srcs, start, length, name, DataType::AUDIO, layer, flags)
126 , _automatable(srcs[0]->session())
127 , _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation)))
128 , _fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation)))
129 , _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation)))
132 connect_to_analysis_changed ();
133 assert (_sources.size() == _master_sources.size());
136 /** Create a new AudioRegion, that is part of an existing one */
137 AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, nframes_t offset, nframes_t length, const string& name, layer_t layer, Flag flags)
138 : Region (other, offset, length, name, layer, flags)
139 , _automatable(other->session())
140 , _fade_in (new AutomationList(*other->_fade_in))
141 , _fade_out (new AutomationList(*other->_fade_out))
142 , _envelope (new AutomationList(*other->_envelope, offset, offset + length))
144 connect_to_header_position_offset_changed ();
146 /* return to default fades if the existing ones are too long */
148 if (_flags & LeftOfSplit) {
149 if (_fade_in->back()->when >= _length) {
150 set_default_fade_in ();
152 _fade_in_disabled = other->_fade_in_disabled;
154 set_default_fade_out ();
155 _flags = Flag (_flags & ~Region::LeftOfSplit);
158 if (_flags & RightOfSplit) {
159 if (_fade_out->back()->when >= _length) {
160 set_default_fade_out ();
162 _fade_out_disabled = other->_fade_out_disabled;
164 set_default_fade_in ();
165 _flags = Flag (_flags & ~Region::RightOfSplit);
168 _scale_amplitude = other->_scale_amplitude;
170 assert(_type == DataType::AUDIO);
172 listen_to_my_curves ();
173 connect_to_analysis_changed ();
175 assert (_sources.size() == _master_sources.size());
178 AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other)
180 , _automatable (other->session())
181 , _fade_in (new AutomationList (*other->_fade_in))
182 , _fade_out (new AutomationList (*other->_fade_out))
183 , _envelope (new AutomationList (*other->_envelope))
185 assert(_type == DataType::AUDIO);
186 _scale_amplitude = other->_scale_amplitude;
188 listen_to_my_curves ();
189 connect_to_analysis_changed ();
191 assert (_sources.size() == _master_sources.size());
194 AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, const SourceList& /*srcs*/,
195 nframes_t length, const string& name, layer_t layer, Flag flags)
196 : Region (other, length, name, layer, flags)
197 , _automatable (other->session())
198 , _fade_in (new AutomationList (*other->_fade_in))
199 , _fade_out (new AutomationList (*other->_fade_out))
200 , _envelope (new AutomationList (*other->_envelope))
202 /* make-a-sort-of-copy-with-different-sources constructor (used by audio filter) */
204 for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
206 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> ((*i));
208 afs->HeaderPositionOffsetChanged.connect_same_thread (*this, boost::bind (&AudioRegion::source_offset_changed, this));
212 _scale_amplitude = other->_scale_amplitude;
214 _fade_in_disabled = 0;
215 _fade_out_disabled = 0;
217 listen_to_my_curves ();
218 connect_to_analysis_changed ();
220 assert (_sources.size() == _master_sources.size());
223 AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, const XMLNode& node)
225 , _automatable(src->session())
226 , _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation)))
227 , _fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation)))
228 , _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation)))
230 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
232 afs->HeaderPositionOffsetChanged.connect_same_thread (*this, boost::bind (&AudioRegion::source_offset_changed, this));
237 if (set_state (node, Stateful::loading_state_version)) {
238 throw failed_constructor();
241 assert(_type == DataType::AUDIO);
242 connect_to_analysis_changed ();
244 assert (_sources.size() == _master_sources.size());
247 AudioRegion::AudioRegion (SourceList& srcs, const XMLNode& node)
248 : Region (srcs, node)
249 , _automatable(srcs[0]->session())
250 , _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation)))
251 , _fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation)))
252 , _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation)))
256 if (set_state (node, Stateful::loading_state_version)) {
257 throw failed_constructor();
260 assert(_type == DataType::AUDIO);
261 connect_to_analysis_changed ();
262 assert (_sources.size() == _master_sources.size());
265 AudioRegion::~AudioRegion ()
270 AudioRegion::connect_to_analysis_changed ()
272 for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
273 (*i)->AnalysisChanged.connect_same_thread (*this, boost::bind (&AudioRegion::invalidate_transients, this));
278 AudioRegion::connect_to_header_position_offset_changed ()
280 set<boost::shared_ptr<Source> > unique_srcs;
282 for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
284 if (unique_srcs.find (*i) == unique_srcs.end ()) {
285 unique_srcs.insert (*i);
286 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (*i);
288 afs->HeaderPositionOffsetChanged.connect_same_thread (*this, boost::bind (&AudioRegion::source_offset_changed, this));
295 AudioRegion::listen_to_my_curves ()
297 _envelope->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::envelope_changed, this));
298 _fade_in->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::fade_in_changed, this));
299 _fade_out->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::fade_out_changed, this));
303 AudioRegion::set_envelope_active (bool yn)
305 if (envelope_active() != yn) {
308 snprintf (buf, sizeof (buf), "envelope active");
309 _flags = Flag (_flags|EnvelopeActive);
311 snprintf (buf, sizeof (buf), "envelope off");
312 _flags = Flag (_flags & ~EnvelopeActive);
314 send_change (EnvelopeActiveChanged);
319 AudioRegion::read_peaks (PeakData *buf, nframes_t npeaks, nframes_t offset, nframes_t cnt, uint32_t chan_n, double samples_per_unit) const
321 if (chan_n >= _sources.size()) {
325 if (audio_source(chan_n)->read_peaks (buf, npeaks, offset, cnt, samples_per_unit)) {
328 if (_scale_amplitude != 1.0) {
329 for (nframes_t n = 0; n < npeaks; ++n) {
330 buf[n].max *= _scale_amplitude;
331 buf[n].min *= _scale_amplitude;
339 AudioRegion::read (Sample* buf, sframes_t timeline_position, nframes_t cnt, int channel) const
341 /* raw read, no fades, no gain, nada */
342 return _read_at (_sources, _length, buf, 0, 0, _position + timeline_position, cnt, channel, 0, 0, ReadOps (0));
346 AudioRegion::read_with_ops (Sample* buf, sframes_t file_position, nframes_t cnt, int channel, ReadOps rops) const
348 return _read_at (_sources, _length, buf, 0, 0, file_position, cnt, channel, 0, 0, rops);
352 AudioRegion::read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer,
353 sframes_t file_position, nframes_t cnt, uint32_t chan_n,
354 nframes_t read_frames, nframes_t skip_frames) const
356 /* regular diskstream/butler read complete with fades etc */
357 return _read_at (_sources, _length, buf, mixdown_buffer, gain_buffer,
358 file_position, cnt, chan_n, read_frames, skip_frames, ReadOps (~0));
362 AudioRegion::master_read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer,
363 sframes_t position, nframes_t cnt, uint32_t chan_n) const
365 /* do not read gain/scaling/fades and do not count this disk i/o in statistics */
367 return _read_at (_master_sources, _master_sources.front()->length(_master_sources.front()->timeline_position()),
368 buf, mixdown_buffer, gain_buffer, position, cnt, chan_n, 0, 0, ReadOps (0));
372 AudioRegion::_read_at (const SourceList& /*srcs*/, nframes_t limit,
373 Sample *buf, Sample *mixdown_buffer, float *gain_buffer,
374 sframes_t position, nframes_t cnt,
376 nframes_t /*read_frames*/,
377 nframes_t /*skip_frames*/,
380 nframes_t internal_offset;
381 nframes_t buf_offset;
383 bool raw = (rops == ReadOpsNone);
385 if (muted() && !raw) {
386 return 0; /* read nothing */
389 /* precondition: caller has verified that we cover the desired section */
391 if (position < _position) {
393 buf_offset = _position - position;
396 internal_offset = position - _position;
400 if (internal_offset >= limit) {
401 return 0; /* read nothing */
404 if ((to_read = min (cnt, limit - internal_offset)) == 0) {
405 return 0; /* read nothing */
408 if (opaque() || raw) {
409 /* overwrite whatever is there */
410 mixdown_buffer = buf + buf_offset;
412 mixdown_buffer += buf_offset;
415 if (rops & ReadOpsCount) {
416 _read_data_count = 0;
419 if (chan_n < n_channels()) {
421 boost::shared_ptr<AudioSource> src = audio_source(chan_n);
422 if (src->read (mixdown_buffer, _start + internal_offset, to_read) != to_read) {
423 return 0; /* "read nothing" */
426 if (rops & ReadOpsCount) {
427 _read_data_count += src->read_data_count();
432 /* track is N-channel, this region has less channels; silence the ones
436 memset (mixdown_buffer, 0, sizeof (Sample) * cnt);
439 if (rops & ReadOpsFades) {
443 if ((_flags & FadeIn) && _session.config.get_use_region_fades()) {
445 nframes_t fade_in_length = (nframes_t) _fade_in->back()->when;
447 /* see if this read is within the fade in */
449 if (internal_offset < fade_in_length) {
453 fi_limit = min (to_read, fade_in_length - internal_offset);
456 _fade_in->curve().get_vector (internal_offset, internal_offset+fi_limit, gain_buffer, fi_limit);
458 for (nframes_t n = 0; n < fi_limit; ++n) {
459 mixdown_buffer[n] *= gain_buffer[n];
466 if ((_flags & FadeOut) && _session.config.get_use_region_fades()) {
468 /* see if some part of this read is within the fade out */
470 /* ................. >| REGION
476 limit - fade_out_length
479 ^internal_offset + to_read
481 we need the intersection of [internal_offset,internal_offset+to_read] with
482 [limit - fade_out_length, limit]
487 nframes_t fade_out_length = (nframes_t) _fade_out->back()->when;
488 nframes_t fade_interval_start = max(internal_offset, limit-fade_out_length);
489 nframes_t fade_interval_end = min(internal_offset + to_read, limit);
491 if (fade_interval_end > fade_interval_start) {
492 /* (part of the) the fade out is in this buffer */
494 nframes_t fo_limit = fade_interval_end - fade_interval_start;
495 nframes_t curve_offset = fade_interval_start - (limit-fade_out_length);
496 nframes_t fade_offset = fade_interval_start - internal_offset;
498 _fade_out->curve().get_vector (curve_offset, curve_offset+fo_limit, gain_buffer, fo_limit);
500 for (nframes_t n = 0, m = fade_offset; n < fo_limit; ++n, ++m) {
501 mixdown_buffer[m] *= gain_buffer[n];
508 /* Regular gain curves and scaling */
510 if ((rops & ReadOpsOwnAutomation) && envelope_active()) {
511 _envelope->curve().get_vector (internal_offset, internal_offset + to_read, gain_buffer, to_read);
513 if ((rops & ReadOpsOwnScaling) && _scale_amplitude != 1.0f) {
514 for (nframes_t n = 0; n < to_read; ++n) {
515 mixdown_buffer[n] *= gain_buffer[n] * _scale_amplitude;
518 for (nframes_t n = 0; n < to_read; ++n) {
519 mixdown_buffer[n] *= gain_buffer[n];
522 } else if ((rops & ReadOpsOwnScaling) && _scale_amplitude != 1.0f) {
524 // XXX this should be using what in 2.0 would have been:
525 // Session::apply_gain_to_buffer (mixdown_buffer, to_read, _scale_amplitude);
527 for (nframes_t n = 0; n < to_read; ++n) {
528 mixdown_buffer[n] *= _scale_amplitude;
534 /* gack. the things we do for users.
539 for (nframes_t n = 0; n < to_read; ++n) {
540 buf[n] += mixdown_buffer[n];
548 AudioRegion::state (bool full)
550 XMLNode& node (Region::state (full));
554 LocaleGuard lg (X_("POSIX"));
556 node.add_property ("flags", enum_2_string (_flags));
558 snprintf (buf, sizeof(buf), "%.12g", _scale_amplitude);
559 node.add_property ("scale-gain", buf);
561 // XXX these should move into Region
563 for (uint32_t n=0; n < _sources.size(); ++n) {
564 snprintf (buf2, sizeof(buf2), "source-%d", n);
565 _sources[n]->id().print (buf, sizeof (buf));
566 node.add_property (buf2, buf);
569 for (uint32_t n=0; n < _master_sources.size(); ++n) {
570 snprintf (buf2, sizeof(buf2), "master-source-%d", n);
571 _master_sources[n]->id().print (buf, sizeof (buf));
572 node.add_property (buf2, buf);
575 snprintf (buf, sizeof (buf), "%u", (uint32_t) _sources.size());
576 node.add_property ("channels", buf);
580 child = node.add_child (X_("FadeIn"));
582 if ((_flags & DefaultFadeIn)) {
583 child->add_property (X_("default"), X_("yes"));
585 child->add_child_nocopy (_fade_in->get_state ());
588 child->add_property (X_("active"), fade_in_active () ? X_("yes") : X_("no"));
590 child = node.add_child (X_("FadeOut"));
592 if ((_flags & DefaultFadeOut)) {
593 child->add_property (X_("default"), X_("yes"));
595 child->add_child_nocopy (_fade_out->get_state ());
598 child->add_property (X_("active"), fade_out_active () ? X_("yes") : X_("no"));
601 child = node.add_child ("Envelope");
604 bool default_env = false;
606 // If there are only two points, the points are in the start of the region and the end of the region
607 // so, if they are both at 1.0f, that means the default region.
609 if (_envelope->size() == 2 &&
610 _envelope->front()->value == 1.0f &&
611 _envelope->back()->value==1.0f) {
612 if (_envelope->front()->when == 0 && _envelope->back()->when == _length) {
618 child->add_property ("default", "yes");
620 child->add_child_nocopy (_envelope->get_state ());
624 child->add_property ("default", "yes");
627 if (full && _extra_xml) {
628 node.add_child_copy (*_extra_xml);
635 AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_changed, bool send)
637 const XMLNodeList& nlist = node.children();
638 const XMLProperty *prop;
639 LocaleGuard lg (X_("POSIX"));
641 Region::set_live_state (node, version, what_changed, false);
643 uint32_t old_flags = _flags;
645 if ((prop = node.property ("flags")) != 0) {
646 _flags = Flag (string_2_enum (prop->value(), _flags));
648 //_flags = Flag (strtol (prop->value().c_str(), (char **) 0, 16));
650 _flags = Flag (_flags & ~Region::LeftOfSplit);
651 _flags = Flag (_flags & ~Region::RightOfSplit);
654 /* leave this flag setting in place, no matter what */
656 if ((old_flags & DoNotSendPropertyChanges)) {
657 _flags = Flag (_flags | DoNotSendPropertyChanges);
660 /* find out if any flags changed that we signal about */
662 if ((old_flags ^ _flags) & Muted) {
663 what_changed = Change (what_changed|MuteChanged);
665 if ((old_flags ^ _flags) & Opaque) {
666 what_changed = Change (what_changed|OpacityChanged);
668 if ((old_flags ^ _flags) & Locked) {
669 what_changed = Change (what_changed|LockChanged);
672 if ((prop = node.property ("scale-gain")) != 0) {
673 _scale_amplitude = atof (prop->value().c_str());
674 what_changed = Change (what_changed|ScaleAmplitudeChanged);
676 _scale_amplitude = 1.0;
679 /* Now find envelope description and other misc child items */
681 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
688 if (child->name() == "Envelope") {
692 if ((prop = child->property ("default")) != 0 || _envelope->set_state (*child, version)) {
693 set_default_envelope ();
696 _envelope->set_max_xval (_length);
697 _envelope->truncate_end (_length);
699 } else if (child->name() == "FadeIn") {
703 if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0) {
704 set_default_fade_in ();
706 XMLNode* grandchild = child->child ("AutomationList");
708 _fade_in->set_state (*grandchild, version);
712 if ((prop = child->property ("active")) != 0) {
713 if (string_is_affirmative (prop->value())) {
714 set_fade_in_active (true);
716 set_fade_in_active (false);
720 } else if (child->name() == "FadeOut") {
724 if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0) {
725 set_default_fade_out ();
727 XMLNode* grandchild = child->child ("AutomationList");
729 _fade_out->set_state (*grandchild, version);
733 if ((prop = child->property ("active")) != 0) {
734 if (string_is_affirmative (prop->value())) {
735 set_fade_out_active (true);
737 set_fade_out_active (false);
745 send_change (what_changed);
752 AudioRegion::set_state (const XMLNode& node, int version)
754 /* Region::set_state() calls the virtual set_live_state(),
755 which will get us back to AudioRegion::set_live_state()
756 to handle the relevant stuff.
759 return Region::set_state (node, version);
763 AudioRegion::set_fade_in_shape (FadeShape shape)
765 set_fade_in (shape, (nframes_t) _fade_in->back()->when);
769 AudioRegion::set_fade_out_shape (FadeShape shape)
771 set_fade_out (shape, (nframes_t) _fade_out->back()->when);
775 AudioRegion::set_fade_in (boost::shared_ptr<AutomationList> f)
781 send_change (FadeInChanged);
785 AudioRegion::set_fade_in (FadeShape shape, nframes_t len)
792 _fade_in->fast_simple_add (0.0, 0.0);
793 _fade_in->fast_simple_add (len, 1.0);
797 _fade_in->fast_simple_add (0, 0);
798 _fade_in->fast_simple_add (len * 0.389401, 0.0333333);
799 _fade_in->fast_simple_add (len * 0.629032, 0.0861111);
800 _fade_in->fast_simple_add (len * 0.829493, 0.233333);
801 _fade_in->fast_simple_add (len * 0.9447, 0.483333);
802 _fade_in->fast_simple_add (len * 0.976959, 0.697222);
803 _fade_in->fast_simple_add (len, 1);
807 _fade_in->fast_simple_add (0, 0);
808 _fade_in->fast_simple_add (len * 0.0207373, 0.197222);
809 _fade_in->fast_simple_add (len * 0.0645161, 0.525);
810 _fade_in->fast_simple_add (len * 0.152074, 0.802778);
811 _fade_in->fast_simple_add (len * 0.276498, 0.919444);
812 _fade_in->fast_simple_add (len * 0.481567, 0.980556);
813 _fade_in->fast_simple_add (len * 0.767281, 1);
814 _fade_in->fast_simple_add (len, 1);
818 _fade_in->fast_simple_add (0, 0);
819 _fade_in->fast_simple_add (len * 0.0737327, 0.308333);
820 _fade_in->fast_simple_add (len * 0.246544, 0.658333);
821 _fade_in->fast_simple_add (len * 0.470046, 0.886111);
822 _fade_in->fast_simple_add (len * 0.652074, 0.972222);
823 _fade_in->fast_simple_add (len * 0.771889, 0.988889);
824 _fade_in->fast_simple_add (len, 1);
828 _fade_in->fast_simple_add (0, 0);
829 _fade_in->fast_simple_add (len * 0.304147, 0.0694444);
830 _fade_in->fast_simple_add (len * 0.529954, 0.152778);
831 _fade_in->fast_simple_add (len * 0.725806, 0.333333);
832 _fade_in->fast_simple_add (len * 0.847926, 0.558333);
833 _fade_in->fast_simple_add (len * 0.919355, 0.730556);
834 _fade_in->fast_simple_add (len, 1);
840 send_change (FadeInChanged);
844 AudioRegion::set_fade_out (boost::shared_ptr<AutomationList> f)
846 _fade_out->freeze ();
850 send_change (FadeInChanged);
854 AudioRegion::set_fade_out (FadeShape shape, nframes_t len)
856 _fade_out->freeze ();
861 _fade_out->fast_simple_add (len * 0, 1);
862 _fade_out->fast_simple_add (len * 0.023041, 0.697222);
863 _fade_out->fast_simple_add (len * 0.0553, 0.483333);
864 _fade_out->fast_simple_add (len * 0.170507, 0.233333);
865 _fade_out->fast_simple_add (len * 0.370968, 0.0861111);
866 _fade_out->fast_simple_add (len * 0.610599, 0.0333333);
867 _fade_out->fast_simple_add (len * 1, 0);
871 _fade_out->fast_simple_add (len * 0, 1);
872 _fade_out->fast_simple_add (len * 0.228111, 0.988889);
873 _fade_out->fast_simple_add (len * 0.347926, 0.972222);
874 _fade_out->fast_simple_add (len * 0.529954, 0.886111);
875 _fade_out->fast_simple_add (len * 0.753456, 0.658333);
876 _fade_out->fast_simple_add (len * 0.9262673, 0.308333);
877 _fade_out->fast_simple_add (len * 1, 0);
881 _fade_out->fast_simple_add (len * 0, 1);
882 _fade_out->fast_simple_add (len * 0.305556, 1);
883 _fade_out->fast_simple_add (len * 0.548611, 0.991736);
884 _fade_out->fast_simple_add (len * 0.759259, 0.931129);
885 _fade_out->fast_simple_add (len * 0.918981, 0.68595);
886 _fade_out->fast_simple_add (len * 0.976852, 0.22865);
887 _fade_out->fast_simple_add (len * 1, 0);
891 _fade_out->fast_simple_add (len * 0, 1);
892 _fade_out->fast_simple_add (len * 0.080645, 0.730556);
893 _fade_out->fast_simple_add (len * 0.277778, 0.289256);
894 _fade_out->fast_simple_add (len * 0.470046, 0.152778);
895 _fade_out->fast_simple_add (len * 0.695853, 0.0694444);
896 _fade_out->fast_simple_add (len * 1, 0);
900 _fade_out->fast_simple_add (len * 0, 1);
901 _fade_out->fast_simple_add (len * 1, 0);
907 send_change (FadeOutChanged);
911 AudioRegion::set_fade_in_length (nframes_t len)
917 bool changed = _fade_in->extend_to (len);
920 _flags = Flag (_flags & ~DefaultFadeIn);
921 send_change (FadeInChanged);
926 AudioRegion::set_fade_out_length (nframes_t len)
932 bool changed = _fade_out->extend_to (len);
935 _flags = Flag (_flags & ~DefaultFadeOut);
936 send_change (FadeOutChanged);
941 AudioRegion::set_fade_in_active (bool yn)
943 if (yn == (_flags & FadeIn)) {
947 _flags = Flag (_flags|FadeIn);
949 _flags = Flag (_flags & ~FadeIn);
952 send_change (FadeInActiveChanged);
956 AudioRegion::set_fade_out_active (bool yn)
958 if (yn == (_flags & FadeOut)) {
962 _flags = Flag (_flags | FadeOut);
964 _flags = Flag (_flags & ~FadeOut);
967 send_change (FadeOutActiveChanged);
971 AudioRegion::fade_in_is_default () const
973 return _fade_in->size() == 2 && _fade_in->front()->when == 0 && _fade_in->back()->when == 64;
977 AudioRegion::fade_out_is_default () const
979 return _fade_out->size() == 2 && _fade_out->front()->when == 0 && _fade_out->back()->when == 64;
983 AudioRegion::set_default_fade_in ()
985 _fade_in_disabled = 0;
986 set_fade_in (Linear, 64);
990 AudioRegion::set_default_fade_out ()
992 _fade_out_disabled = 0;
993 set_fade_out (Linear, 64);
997 AudioRegion::set_default_fades ()
999 set_default_fade_in ();
1000 set_default_fade_out ();
1004 AudioRegion::set_default_envelope ()
1006 _envelope->freeze ();
1007 _envelope->clear ();
1008 _envelope->fast_simple_add (0, 1.0f);
1009 _envelope->fast_simple_add (_length, 1.0f);
1014 AudioRegion::recompute_at_end ()
1016 /* our length has changed. recompute a new final point by interpolating
1017 based on the the existing curve.
1020 _envelope->freeze ();
1021 _envelope->truncate_end (_length);
1022 _envelope->set_max_xval (_length);
1025 if (_fade_in->back()->when > _length) {
1026 _fade_in->extend_to (_length);
1027 send_change (FadeInChanged);
1030 if (_fade_out->back()->when > _length) {
1031 _fade_out->extend_to (_length);
1032 send_change (FadeOutChanged);
1037 AudioRegion::recompute_at_start ()
1039 /* as above, but the shift was from the front */
1041 _envelope->truncate_start (_length);
1043 if (_fade_in->back()->when > _length) {
1044 _fade_in->extend_to (_length);
1045 send_change (FadeInChanged);
1048 if (_fade_out->back()->when > _length) {
1049 _fade_out->extend_to (_length);
1050 send_change (FadeOutChanged);
1055 AudioRegion::separate_by_channel (Session& /*session*/, vector<boost::shared_ptr<Region> >& v) const
1061 if (_sources.size() < 2) {
1065 for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
1067 srcs.push_back (*i);
1071 if (_sources.size() == 2) {
1079 new_name += ('0' + n + 1);
1082 /* create a copy with just one source. prevent if from being thought of as
1083 "whole file" even if it covers the entire source file(s).
1086 Flag f = Flag (_flags & ~WholeFile);
1088 v.push_back(RegionFactory::create (srcs, _start, _length, new_name, _layer, f));
1097 AudioRegion::read_raw_internal (Sample* buf, sframes_t pos, nframes_t cnt, int channel) const
1099 return audio_source()->read (buf, pos, cnt, channel);
1103 AudioRegion::exportme (Session& /*session*/, ARDOUR::ExportSpecification& /*spec*/)
1106 // const nframes_t blocksize = 4096;
1107 // nframes_t to_read;
1110 // spec.channels = _sources.size();
1112 // if (spec.prepare (blocksize, session.frame_rate())) {
1117 // spec.total_frames = _length;
1119 // while (spec.pos < _length && !spec.stop) {
1122 // /* step 1: interleave */
1124 // to_read = min (_length - spec.pos, blocksize);
1126 // if (spec.channels == 1) {
1128 // if (read_raw_internal (spec.dataF, _start + spec.pos, to_read) != to_read) {
1134 // Sample buf[blocksize];
1136 // for (uint32_t chan = 0; chan < spec.channels; ++chan) {
1138 // if (audio_source(chan)->read (buf, _start + spec.pos, to_read) != to_read) {
1142 // for (nframes_t x = 0; x < to_read; ++x) {
1143 // spec.dataF[chan+(x*spec.channels)] = buf[x];
1148 // if (spec.process (to_read)) {
1152 // spec.pos += to_read;
1153 // spec.progress = (double) spec.pos /_length;
1160 // spec.running = false;
1161 // spec.status = status;
1169 AudioRegion::set_scale_amplitude (gain_t g)
1171 boost::shared_ptr<Playlist> pl (playlist());
1173 _scale_amplitude = g;
1175 /* tell the diskstream we're in */
1181 /* tell everybody else */
1183 send_change (ScaleAmplitudeChanged);
1187 AudioRegion::normalize_to (float target_dB)
1189 const nframes_t blocksize = 64 * 1024;
1190 Sample buf[blocksize];
1195 gain_t target = dB_to_coefficient (target_dB);
1197 if (target == 1.0f) {
1198 /* do not normalize to precisely 1.0 (0 dBFS), to avoid making it appear
1199 that we may have clipped.
1201 target -= FLT_EPSILON;
1205 fend = _start + _length;
1207 /* first pass: find max amplitude */
1209 while (fpos < fend) {
1213 to_read = min (fend - fpos, blocksize);
1215 for (n = 0; n < n_channels(); ++n) {
1219 if (read_raw_internal (buf, fpos, to_read, 0) != to_read) {
1223 maxamp = compute_peak (buf, to_read, maxamp);
1229 if (maxamp == 0.0f) {
1230 /* don't even try */
1234 if (maxamp == target) {
1235 /* we can't do anything useful */
1239 /* compute scale factor */
1241 _scale_amplitude = target/maxamp;
1243 /* tell the diskstream we're in */
1245 boost::shared_ptr<Playlist> pl (playlist());
1251 /* tell everybody else */
1253 send_change (ScaleAmplitudeChanged);
1257 AudioRegion::fade_in_changed ()
1259 send_change (FadeInChanged);
1263 AudioRegion::fade_out_changed ()
1265 send_change (FadeOutChanged);
1269 AudioRegion::envelope_changed ()
1271 send_change (EnvelopeChanged);
1275 AudioRegion::suspend_fade_in ()
1277 if (++_fade_in_disabled == 1) {
1278 if (fade_in_is_default()) {
1279 set_fade_in_active (false);
1285 AudioRegion::resume_fade_in ()
1287 if (--_fade_in_disabled == 0 && _fade_in_disabled) {
1288 set_fade_in_active (true);
1293 AudioRegion::suspend_fade_out ()
1295 if (++_fade_out_disabled == 1) {
1296 if (fade_out_is_default()) {
1297 set_fade_out_active (false);
1303 AudioRegion::resume_fade_out ()
1305 if (--_fade_out_disabled == 0 &&_fade_out_disabled) {
1306 set_fade_out_active (true);
1311 AudioRegion::speed_mismatch (float sr) const
1313 if (_sources.empty()) {
1314 /* impossible, but ... */
1318 float fsr = audio_source()->sample_rate();
1324 AudioRegion::source_offset_changed ()
1326 /* XXX this fixes a crash that should not occur. It does occur
1327 becauses regions are not being deleted when a session
1328 is unloaded. That bug must be fixed.
1331 if (_sources.empty()) {
1335 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(_sources.front());
1337 if (afs && afs->destructive()) {
1338 // set_start (source()->natural_position(), this);
1339 set_position (source()->natural_position(), this);
1343 boost::shared_ptr<AudioSource>
1344 AudioRegion::audio_source (uint32_t n) const
1346 // Guaranteed to succeed (use a static cast for speed?)
1347 return boost::dynamic_pointer_cast<AudioSource>(source(n));
1351 AudioRegion::get_transients (AnalysisFeatureList& results, bool force_new)
1353 boost::shared_ptr<Playlist> pl = playlist();
1359 if (_valid_transients && !force_new) {
1360 results = _transients;
1364 SourceList::iterator s;
1366 for (s = _sources.begin() ; s != _sources.end(); ++s) {
1367 if (!(*s)->has_been_analysed()) {
1368 cerr << "For " << name() << " source " << (*s)->name() << " has not been analyzed\n";
1373 if (s == _sources.end()) {
1374 /* all sources are analyzed, merge data from each one */
1376 for (s = _sources.begin() ; s != _sources.end(); ++s) {
1378 /* find the set of transients within the bounds of this region */
1380 AnalysisFeatureList::iterator low = lower_bound ((*s)->transients.begin(),
1381 (*s)->transients.end(),
1384 AnalysisFeatureList::iterator high = upper_bound ((*s)->transients.begin(),
1385 (*s)->transients.end(),
1390 results.insert (results.end(), low, high);
1393 TransientDetector::cleanup_transients (results, pl->session().frame_rate(), 3.0);
1395 /* translate all transients to current position */
1397 for (AnalysisFeatureList::iterator x = results.begin(); x != results.end(); ++x) {
1402 _transients = results;
1403 _valid_transients = true;
1408 /* no existing/complete transient info */
1410 if (!Config->get_auto_analyse_audio()) {
1411 pl->session().Dialog (_("\
1412 You have requested an operation that requires audio analysis.\n\n\
1413 You currently have \"auto-analyse-audio\" disabled, which means\n\
1414 that transient data must be generated every time it is required.\n\n\
1415 If you are doing work that will require transient data on a\n\
1416 regular basis, you should probably enable \"auto-analyse-audio\"\n\
1417 then quit ardour and restart."));
1420 TransientDetector t (pl->session().frame_rate());
1421 bool existing_results = !results.empty();
1423 _transients.clear ();
1424 _valid_transients = false;
1426 for (uint32_t i = 0; i < n_channels(); ++i) {
1428 AnalysisFeatureList these_results;
1432 if (t.run ("", this, i, these_results)) {
1436 /* translate all transients to give absolute position */
1438 for (AnalysisFeatureList::iterator i = these_results.begin(); i != these_results.end(); ++i) {
1444 _transients.insert (_transients.end(), these_results.begin(), these_results.end());
1447 if (!results.empty()) {
1448 if (existing_results) {
1450 /* merge our transients into the existing ones, then clean up
1454 results.insert (results.end(), _transients.begin(), _transients.end());
1455 TransientDetector::cleanup_transients (results, pl->session().frame_rate(), 3.0);
1458 /* make sure ours are clean too */
1460 TransientDetector::cleanup_transients (_transients, pl->session().frame_rate(), 3.0);
1464 TransientDetector::cleanup_transients (_transients, pl->session().frame_rate(), 3.0);
1465 results = _transients;
1468 _valid_transients = true;
1473 /** Find areas of `silence' within a region.
1475 * @param threshold Threshold below which signal is considered silence (as a sample value)
1476 * @param min_length Minimum length of silent period to be reported.
1477 * @return Silent periods; first of pair is the offset within the region, second is the length of the period
1480 std::list<std::pair<nframes_t, nframes_t> >
1481 AudioRegion::find_silence (Sample threshold, nframes_t min_length) const
1483 nframes_t const block_size = 64 * 1024;
1484 Sample loudest[block_size];
1485 Sample buf[block_size];
1487 nframes_t pos = _start;
1488 nframes_t const end = _start + _length - 1;
1490 std::list<std::pair<nframes_t, nframes_t> > silent_periods;
1492 bool in_silence = false;
1493 nframes_t silence_start = 0;
1498 /* fill `loudest' with the loudest absolute sample at each instant, across all channels */
1499 memset (loudest, 0, sizeof (Sample) * block_size);
1500 for (uint32_t n = 0; n < n_channels(); ++n) {
1502 read_raw_internal (buf, pos, block_size, n);
1503 for (nframes_t i = 0; i < block_size; ++i) {
1504 loudest[i] = max (loudest[i], abs (buf[i]));
1508 /* now look for silence */
1509 for (nframes_t i = 0; i < block_size; ++i) {
1510 silence = abs (loudest[i]) < threshold;
1511 if (silence && !in_silence) {
1512 /* non-silence to silence */
1514 silence_start = pos + i;
1515 } else if (!silence && in_silence) {
1516 /* silence to non-silence */
1518 if (pos + i - 1 - silence_start >= min_length) {
1519 silent_periods.push_back (std::make_pair (silence_start, pos + i - 1));
1527 if (in_silence && end - 1 - silence_start >= min_length) {
1528 /* last block was silent, so finish off the last period */
1529 silent_periods.push_back (std::make_pair (silence_start, end));
1532 return silent_periods;
1538 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)
1540 return ((AudioRegion *) arg)->read_peaks ((PeakData *) data, (nframes_t) npeaks, (nframes_t) start, (nframes_t) cnt, n_chan,samples_per_unit);
1543 uint32_t region_length_from_c (void *arg)
1546 return ((AudioRegion *) arg)->length();
1549 uint32_t sourcefile_length_from_c (void *arg, double zoom_factor)
1551 return ( (AudioRegion *) arg)->audio_source()->available_peaks (zoom_factor) ;