remove some left over debugging
[ardour2.git] / libs / ardour / audio_track.cc
blob080538a34ee1c04df988f61c2a30817f81536eda
1 /*
2 Copyright (C) 2002 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.
20 #include <boost/scoped_array.hpp>
22 #include "pbd/error.h"
23 #include "pbd/enumwriter.h"
24 #include "pbd/boost_debug.h"
26 #include "evoral/Curve.hpp"
28 #include "ardour/amp.h"
29 #include "ardour/audio_buffer.h"
30 #include "ardour/audio_diskstream.h"
31 #include "ardour/audio_track.h"
32 #include "ardour/audioplaylist.h"
33 #include "ardour/audioregion.h"
34 #include "ardour/audiosource.h"
35 #include "ardour/buffer_set.h"
36 #include "ardour/io_processor.h"
37 #include "ardour/panner.h"
38 #include "ardour/meter.h"
39 #include "ardour/playlist_factory.h"
40 #include "ardour/plugin_insert.h"
41 #include "ardour/processor.h"
42 #include "ardour/region_factory.h"
43 #include "ardour/route_group_specialized.h"
44 #include "ardour/session.h"
45 #include "ardour/utils.h"
46 #include "ardour/session_playlists.h"
47 #include "ardour/delivery.h"
48 #include "ardour/meter.h"
49 #include "i18n.h"
51 using namespace std;
52 using namespace ARDOUR;
53 using namespace PBD;
55 AudioTrack::AudioTrack (Session& sess, string name, Route::Flag flag, TrackMode mode)
56 : Track (sess, name, flag, mode)
60 AudioTrack::~AudioTrack ()
64 void
65 AudioTrack::use_new_diskstream ()
67 AudioDiskstream::Flag dflags = AudioDiskstream::Flag (0);
69 if (_flags & Hidden) {
70 dflags = AudioDiskstream::Flag (dflags | AudioDiskstream::Hidden);
71 } else {
72 dflags = AudioDiskstream::Flag (dflags | AudioDiskstream::Recordable);
75 if (_mode == Destructive) {
76 dflags = AudioDiskstream::Flag (dflags | AudioDiskstream::Destructive);
77 } else if (_mode == NonLayered){
78 dflags = AudioDiskstream::Flag(dflags | AudioDiskstream::NonLayered);
81 AudioDiskstream* dsp (new AudioDiskstream (_session, name(), dflags));
82 boost::shared_ptr<AudioDiskstream> ds (dsp);
84 ds->do_refill_with_alloc ();
85 ds->set_block_size (_session.get_block_size ());
87 set_diskstream (ds);
90 void
91 AudioTrack::set_diskstream (boost::shared_ptr<Diskstream> ds)
93 Track::set_diskstream (ds);
95 _diskstream->set_track (this);
96 _diskstream->set_destructive (_mode == Destructive);
97 _diskstream->set_non_layered (_mode == NonLayered);
99 if (audio_diskstream()->deprecated_io_node) {
101 if (!IO::connecting_legal) {
102 IO::ConnectingLegal.connect_same_thread (*this, boost::bind (&AudioTrack::deprecated_use_diskstream_connections, this));
103 } else {
104 deprecated_use_diskstream_connections ();
108 _diskstream->set_record_enabled (false);
109 _diskstream->monitor_input (false);
111 DiskstreamChanged (); /* EMIT SIGNAL */
114 boost::shared_ptr<AudioDiskstream>
115 AudioTrack::audio_diskstream() const
117 return boost::dynamic_pointer_cast<AudioDiskstream>(_diskstream);
121 AudioTrack::set_mode (TrackMode m)
123 if (m != _mode) {
125 if (_diskstream->set_destructive (m == Destructive)) {
126 return -1;
129 _diskstream->set_non_layered (m == NonLayered);
130 _mode = m;
132 TrackModeChanged (); /* EMIT SIGNAL */
135 return 0;
138 bool
139 AudioTrack::can_use_mode (TrackMode m, bool& bounce_required)
141 switch (m) {
142 case NonLayered:
143 case Normal:
144 bounce_required = false;
145 return true;
147 case Destructive:
148 default:
149 return _diskstream->can_become_destructive (bounce_required);
154 AudioTrack::deprecated_use_diskstream_connections ()
156 boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream();
158 if (diskstream->deprecated_io_node == 0) {
159 return 0;
162 const XMLProperty* prop;
163 XMLNode& node (*diskstream->deprecated_io_node);
165 /* don't do this more than once. */
167 diskstream->deprecated_io_node = 0;
169 if ((prop = node.property ("gain")) != 0) {
170 _amp->set_gain (atof (prop->value().c_str()), this);
173 if ((prop = node.property ("input-connection")) != 0) {
174 boost::shared_ptr<Bundle> c = _session.bundle_by_name (prop->value());
176 if (c == 0) {
177 error << string_compose(_("Unknown bundle \"%1\" listed for input of %2"), prop->value(), _name) << endmsg;
179 if ((c = _session.bundle_by_name (_("in 1"))) == 0) {
180 error << _("No input bundles available as a replacement")
181 << endmsg;
182 return -1;
183 } else {
184 info << string_compose (_("Bundle %1 was not available - \"in 1\" used instead"), prop->value())
185 << endmsg;
189 _input->connect_ports_to_bundle (c, this);
191 } else if ((prop = node.property ("inputs")) != 0) {
192 if (_input->set_ports (prop->value())) {
193 error << string_compose(_("improper input channel list in XML node (%1)"), prop->value()) << endmsg;
194 return -1;
198 return 0;
202 AudioTrack::set_state (const XMLNode& node, int version)
204 return _set_state (node, version, true);
208 AudioTrack::_set_state (const XMLNode& node, int version, bool call_base)
210 const XMLProperty *prop;
211 XMLNodeConstIterator iter;
212 XMLNode *child;
214 if (call_base) {
215 if (Route::_set_state (node, version, call_base)) {
216 return -1;
220 if ((prop = node.property (X_("mode"))) != 0) {
221 _mode = TrackMode (string_2_enum (prop->value(), _mode));
222 } else {
223 _mode = Normal;
226 if (version >= 3000) {
227 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
228 boost::shared_ptr<AudioDiskstream> ds (new AudioDiskstream (_session, *child));
229 ds->do_refill_with_alloc ();
230 set_diskstream (ds);
234 /* set rec-enable control *AFTER* setting up diskstream, because it may want to operate
235 on the diskstream as it sets its own state
238 XMLNodeList nlist;
239 XMLNodeConstIterator niter;
241 nlist = node.children();
242 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
243 child = *niter;
245 if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) {
246 if (prop->value() == X_("recenable")) {
247 _rec_enable_control->set_state (*child, version);
252 pending_state = const_cast<XMLNode*> (&node);
254 if (_session.state_of_the_state() & Session::Loading) {
255 _session.StateReady.connect_same_thread (*this, boost::bind (&AudioTrack::set_state_part_two, this));
256 } else {
257 set_state_part_two ();
260 return 0;
263 XMLNode&
264 AudioTrack::state (bool full_state)
266 XMLNode& root (Route::state(full_state));
267 XMLNode* freeze_node;
268 char buf[64];
270 if (_freeze_record.playlist) {
271 XMLNode* inode;
273 freeze_node = new XMLNode (X_("freeze-info"));
274 freeze_node->add_property ("playlist", _freeze_record.playlist->name());
275 freeze_node->add_property ("state", enum_2_string (_freeze_record.state));
277 for (vector<FreezeRecordProcessorInfo*>::iterator i = _freeze_record.processor_info.begin(); i != _freeze_record.processor_info.end(); ++i) {
278 inode = new XMLNode (X_("processor"));
279 (*i)->id.print (buf, sizeof (buf));
280 inode->add_property (X_("id"), buf);
281 inode->add_child_copy ((*i)->state);
283 freeze_node->add_child_nocopy (*inode);
286 root.add_child_nocopy (*freeze_node);
289 root.add_property (X_("mode"), enum_2_string (_mode));
290 root.add_child_nocopy (_rec_enable_control->get_state());
291 root.add_child_nocopy (_diskstream->get_state ());
293 return root;
296 void
297 AudioTrack::set_state_part_two ()
299 XMLNode* fnode;
300 XMLProperty* prop;
301 LocaleGuard lg (X_("POSIX"));
303 /* This is called after all session state has been restored but before
304 have been made ports and connections are established.
307 if (pending_state == 0) {
308 return;
311 if ((fnode = find_named_node (*pending_state, X_("freeze-info"))) != 0) {
313 _freeze_record.state = Frozen;
315 for (vector<FreezeRecordProcessorInfo*>::iterator i = _freeze_record.processor_info.begin(); i != _freeze_record.processor_info.end(); ++i) {
316 delete *i;
318 _freeze_record.processor_info.clear ();
320 if ((prop = fnode->property (X_("playlist"))) != 0) {
321 boost::shared_ptr<Playlist> pl = _session.playlists->by_name (prop->value());
322 if (pl) {
323 _freeze_record.playlist = boost::dynamic_pointer_cast<AudioPlaylist> (pl);
324 } else {
325 _freeze_record.playlist.reset ();
326 _freeze_record.state = NoFreeze;
327 return;
331 if ((prop = fnode->property (X_("state"))) != 0) {
332 _freeze_record.state = FreezeState (string_2_enum (prop->value(), _freeze_record.state));
335 XMLNodeConstIterator citer;
336 XMLNodeList clist = fnode->children();
338 for (citer = clist.begin(); citer != clist.end(); ++citer) {
339 if ((*citer)->name() != X_("processor")) {
340 continue;
343 if ((prop = (*citer)->property (X_("id"))) == 0) {
344 continue;
347 FreezeRecordProcessorInfo* frii = new FreezeRecordProcessorInfo (*((*citer)->children().front()),
348 boost::shared_ptr<Processor>());
349 frii->id = prop->value ();
350 _freeze_record.processor_info.push_back (frii);
356 AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick,
357 bool can_record, bool rec_monitors_input, bool& need_butler)
359 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
360 if (!lm.locked()) {
361 return 0;
364 int dret;
365 Sample* b;
366 Sample* tmpb;
367 framepos_t transport_frame;
368 boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream();
370 automation_snapshot (start_frame, false);
372 if (n_outputs().n_total() == 0 && _processors.empty()) {
373 return 0;
376 if (!_active) {
377 silence (nframes);
378 return 0;
381 transport_frame = _session.transport_frame();
383 if ((nframes = check_initial_delay (nframes, transport_frame)) == 0) {
385 /* need to do this so that the diskstream sets its
386 playback distance to zero, thus causing diskstream::commit
387 to do nothing.
389 return diskstream->process (transport_frame, 0, can_record, rec_monitors_input, need_butler);
392 _silent = false;
393 _amp->apply_gain_automation(false);
395 if ((dret = diskstream->process (transport_frame, nframes, can_record, rec_monitors_input, need_butler)) != 0) {
396 silence (nframes);
397 return dret;
400 /* special condition applies */
402 if (_meter_point == MeterInput) {
403 _input->process_input (_meter, start_frame, end_frame, nframes);
406 if (diskstream->record_enabled() && !can_record && !_session.config.get_auto_input()) {
408 /* not actually recording, but we want to hear the input material anyway,
409 at least potentially (depending on monitoring options)
412 passthru (start_frame, end_frame, nframes, false);
414 } else if ((b = diskstream->playback_buffer(0)) != 0) {
417 XXX is it true that the earlier test on n_outputs()
418 means that we can avoid checking it again here? i think
419 so, because changing the i/o configuration of an IO
420 requires holding the AudioEngine lock, which we hold
421 while in the process() tree.
425 /* copy the diskstream data to all output buffers */
427 size_t limit = input_streams ().n_audio();
428 BufferSet& bufs = _session.get_scratch_buffers ();
429 const size_t blimit = bufs.count().n_audio();
431 uint32_t n;
432 uint32_t i;
434 if (limit > blimit) {
436 /* example case: auditioner configured for stereo output,
437 but loaded with an 8 channel file. there are only
438 2 passthrough buffers, but n_process_buffers() will
439 return 8.
441 arbitrary decision: map all channels in the diskstream
442 to the outputs available.
445 float scaling = limit/blimit;
447 for (i = 0, n = 1; i < blimit; ++i, ++n) {
449 /* first time through just copy a channel into
450 the output buffer.
453 Sample* bb = bufs.get_audio (i).data();
455 for (pframes_t xx = 0; xx < nframes; ++xx) {
456 bb[xx] = b[xx] * scaling;
459 if (n < diskstream->n_channels().n_audio()) {
460 tmpb = diskstream->playback_buffer(n);
461 if (tmpb!=0) {
462 b = tmpb;
467 for (;i < limit; ++i, ++n) {
469 /* for all remaining channels, sum with existing
470 data in the output buffers
473 bufs.get_audio (i%blimit).accumulate_with_gain_from (b, nframes, 0, scaling);
475 if (n < diskstream->n_channels().n_audio()) {
476 tmpb = diskstream->playback_buffer(n);
477 if (tmpb!=0) {
478 b = tmpb;
484 limit = blimit;
486 } else {
487 for (i = 0, n = 1; i < limit; ++i, ++n) {
488 memcpy (bufs.get_audio (i).data(), b, sizeof (Sample) * nframes);
489 if (n < diskstream->n_channels().n_audio()) {
490 tmpb = diskstream->playback_buffer(n);
491 if (tmpb!=0) {
492 b = tmpb;
497 /* try to leave any MIDI buffers alone */
499 ChanCount chn;
500 chn.set_audio (limit);
501 chn.set_midi (_input->n_ports().n_midi());
502 bufs.set_count (chn);
505 /* final argument: don't waste time with automation if we're recording or we've just stopped (yes it can happen) */
507 process_output_buffers (
508 bufs, start_frame, end_frame, nframes,
509 (!_session.get_record_enabled() || !Config->get_do_not_record_plugins()),
510 declick,
511 (!diskstream->record_enabled() && _session.transport_rolling()));
513 } else {
514 /* problem with the diskstream; just be quiet for a bit */
515 silence (nframes);
518 return 0;
522 AudioTrack::export_stuff (BufferSet& buffers, framepos_t start, framecnt_t nframes, bool enable_processing)
524 boost::scoped_array<gain_t> gain_buffer (new gain_t[nframes]);
525 boost::scoped_array<Sample> mix_buffer (new Sample[nframes]);
526 boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream();
528 Glib::RWLock::ReaderLock rlock (_processor_lock);
530 boost::shared_ptr<AudioPlaylist> apl = boost::dynamic_pointer_cast<AudioPlaylist>(diskstream->playlist());
532 assert(apl);
533 assert(buffers.count().n_audio() >= 1);
534 assert ((framecnt_t) buffers.get_audio(0).capacity() >= nframes);
536 if (apl->read (buffers.get_audio(0).data(), mix_buffer.get(), gain_buffer.get(), start, nframes) != nframes) {
537 return -1;
540 uint32_t n=1;
541 Sample* b = buffers.get_audio(0).data();
542 BufferSet::audio_iterator bi = buffers.audio_begin();
543 ++bi;
544 for ( ; bi != buffers.audio_end(); ++bi, ++n) {
545 if (n < diskstream->n_channels().n_audio()) {
546 if (apl->read (bi->data(), mix_buffer.get(), gain_buffer.get(), start, nframes, n) != nframes) {
547 return -1;
549 b = bi->data();
550 } else {
551 /* duplicate last across remaining buffers */
552 memcpy (bi->data(), b, sizeof (Sample) * nframes);
556 // If no processing is required, there's no need to go any further.
557 if (!enable_processing) {
558 return 0;
561 /* note: only run processors during export. other layers in the machinery
562 will already have checked that there are no external port processors.
563 Also, don't run deliveries that write to real output ports, and don't
564 run meters.
567 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
568 boost::shared_ptr<Processor> processor = boost::dynamic_pointer_cast<Processor> (*i);
569 boost::shared_ptr<Delivery> delivery = boost::dynamic_pointer_cast<Delivery> (*i);
570 boost::shared_ptr<PeakMeter> meter = boost::dynamic_pointer_cast<PeakMeter> (*i);
572 if (processor && (!delivery || !Delivery::role_requires_output_ports (delivery->role())) && !meter) {
573 processor->run (buffers, start, start+nframes, nframes, true);
577 return 0;
580 boost::shared_ptr<Region>
581 AudioTrack::bounce (InterThreadInfo& itt)
583 vector<boost::shared_ptr<Source> > srcs;
584 return _session.write_one_track (*this, _session.current_start_frame(), _session.current_end_frame(), false, srcs, itt);
587 boost::shared_ptr<Region>
588 AudioTrack::bounce_range (framepos_t start, framepos_t end, InterThreadInfo& itt, bool enable_processing)
590 vector<boost::shared_ptr<Source> > srcs;
591 return _session.write_one_track (*this, start, end, false, srcs, itt, enable_processing);
594 void
595 AudioTrack::freeze_me (InterThreadInfo& itt)
597 vector<boost::shared_ptr<Source> > srcs;
598 string new_playlist_name;
599 boost::shared_ptr<Playlist> new_playlist;
600 string dir;
601 string region_name;
602 boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream();
604 if ((_freeze_record.playlist = boost::dynamic_pointer_cast<AudioPlaylist>(diskstream->playlist())) == 0) {
605 return;
608 uint32_t n = 1;
610 while (n < (UINT_MAX-1)) {
612 string candidate;
614 candidate = string_compose ("<F%2>%1", _freeze_record.playlist->name(), n);
616 if (_session.playlists->by_name (candidate) == 0) {
617 new_playlist_name = candidate;
618 break;
621 ++n;
625 if (n == (UINT_MAX-1)) {
626 error << string_compose (X_("There are too many frozen versions of playlist \"%1\""
627 " to create another one"), _freeze_record.playlist->name())
628 << endmsg;
629 return;
632 boost::shared_ptr<Region> res;
634 if ((res = _session.write_one_track (*this, _session.current_start_frame(), _session.current_end_frame(), true, srcs, itt)) == 0) {
635 return;
638 _freeze_record.processor_info.clear ();
641 Glib::RWLock::ReaderLock lm (_processor_lock);
643 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
645 boost::shared_ptr<Processor> processor;
647 if ((processor = boost::dynamic_pointer_cast<Processor>(*r)) != 0) {
649 FreezeRecordProcessorInfo* frii = new FreezeRecordProcessorInfo ((*r)->get_state(), processor);
651 frii->id = processor->id();
653 _freeze_record.processor_info.push_back (frii);
655 /* now deactivate the processor */
657 processor->deactivate ();
658 _session.set_dirty ();
663 new_playlist = PlaylistFactory::create (DataType::AUDIO, _session, new_playlist_name, false);
665 /* XXX need main outs automation state _freeze_record.pan_automation_state = _mainpanner->automation_state(); */
667 region_name = new_playlist_name;
669 /* create a new region from all filesources, keep it private */
671 PropertyList plist;
673 plist.add (Properties::start, 0);
674 plist.add (Properties::length, srcs[0]->length(srcs[0]->timeline_position()));
675 plist.add (Properties::name, region_name);
676 plist.add (Properties::whole_file, true);
678 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist, false));
680 new_playlist->set_orig_diskstream_id (_diskstream->id());
681 new_playlist->add_region (region, _session.current_start_frame());
682 new_playlist->set_frozen (true);
683 region->set_locked (true);
685 diskstream->use_playlist (boost::dynamic_pointer_cast<AudioPlaylist>(new_playlist));
686 diskstream->set_record_enabled (false);
688 /* reset stuff that has already been accounted for in the freeze process */
690 set_gain (1.0, this);
691 _amp->gain_control()->set_automation_state (Off);
692 /* XXX need to use _main_outs _panner->set_automation_state (Off); */
694 _freeze_record.state = Frozen;
695 FreezeChange(); /* EMIT SIGNAL */
698 void
699 AudioTrack::unfreeze ()
701 if (_freeze_record.playlist) {
702 audio_diskstream()->use_playlist (_freeze_record.playlist);
705 Glib::RWLock::ReaderLock lm (_processor_lock); // should this be a write lock? jlc
706 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
707 for (vector<FreezeRecordProcessorInfo*>::iterator ii = _freeze_record.processor_info.begin(); ii != _freeze_record.processor_info.end(); ++ii) {
708 if ((*ii)->id == (*i)->id()) {
709 (*i)->set_state (((*ii)->state), Stateful::current_state_version);
710 break;
716 _freeze_record.playlist.reset ();
717 /* XXX need to use _main_outs _panner->set_automation_state (_freeze_record.pan_automation_state); */
720 _freeze_record.state = UnFrozen;
721 FreezeChange (); /* EMIT SIGNAL */
724 boost::shared_ptr<AudioFileSource>
725 AudioTrack::write_source (uint32_t n)
727 boost::shared_ptr<AudioDiskstream> ds = boost::dynamic_pointer_cast<AudioDiskstream> (_diskstream);
728 assert (ds);
729 return ds->write_source (n);
732 bool
733 AudioTrack::bounceable () const
735 return n_inputs().n_audio() >= n_outputs().n_audio();