2 Copyright (C) 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.
18 #include "pbd/error.h"
20 #include "ardour/amp.h"
21 #include "ardour/audioengine.h"
22 #include "ardour/audiofilesource.h"
23 #include "ardour/audioplaylist.h"
24 #include "ardour/audioregion.h"
25 #include "ardour/debug.h"
26 #include "ardour/delivery.h"
27 #include "ardour/disk_reader.h"
28 #include "ardour/disk_writer.h"
29 #include "ardour/event_type_map.h"
30 #include "ardour/io_processor.h"
31 #include "ardour/meter.h"
32 #include "ardour/midi_playlist.h"
33 #include "ardour/midi_region.h"
34 #include "ardour/monitor_control.h"
35 #include "ardour/playlist.h"
36 #include "ardour/playlist_factory.h"
37 #include "ardour/port.h"
38 #include "ardour/processor.h"
39 #include "ardour/profile.h"
40 #include "ardour/region_factory.h"
41 #include "ardour/record_enable_control.h"
42 #include "ardour/record_safe_control.h"
43 #include "ardour/route_group_specialized.h"
44 #include "ardour/session.h"
45 #include "ardour/session_playlists.h"
46 #include "ardour/smf_source.h"
47 #include "ardour/track.h"
48 #include "ardour/types_convert.h"
49 #include "ardour/utils.h"
54 using namespace ARDOUR;
57 Track::Track (Session& sess, string name, PresentationInfo::Flag flag, TrackMode mode, DataType default_type)
58 : Route (sess, name, flag, default_type)
59 , _saved_meter_point (_meter_point)
61 , _alignment_choice (Automatic)
63 _freeze_record.state = NoFreeze;
70 DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
73 _disk_reader->set_route (boost::shared_ptr<Route>());
74 _disk_reader.reset ();
78 _disk_writer->set_route (boost::shared_ptr<Route>());
79 _disk_writer.reset ();
90 DiskIOProcessor::Flag dflags = DiskIOProcessor::Recordable;
92 if (_mode == Destructive && !Profile->get_trx()) {
93 dflags = DiskIOProcessor::Flag (dflags | DiskIOProcessor::Destructive);
96 _disk_reader.reset (new DiskReader (_session, name(), dflags));
97 _disk_reader->set_block_size (_session.get_block_size ());
98 _disk_reader->set_route (boost::dynamic_pointer_cast<Route> (shared_from_this()));
99 _disk_reader->set_owner (this);
101 _disk_writer.reset (new DiskWriter (_session, name(), dflags));
102 _disk_writer->set_block_size (_session.get_block_size ());
103 _disk_writer->set_route (boost::dynamic_pointer_cast<Route> (shared_from_this()));
104 _disk_writer->set_owner (this);
106 set_align_choice_from_io ();
108 use_new_playlist (data_type());
110 boost::shared_ptr<Route> rp (boost::dynamic_pointer_cast<Route> (shared_from_this()));
111 boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
113 _record_enable_control.reset (new RecordEnableControl (_session, EventTypeMap::instance().to_symbol (RecEnableAutomation), *this));
114 add_control (_record_enable_control);
116 _record_safe_control.reset (new RecordSafeControl (_session, EventTypeMap::instance().to_symbol (RecSafeAutomation), *this));
117 add_control (_record_safe_control);
119 _monitoring_control.reset (new MonitorControl (_session, EventTypeMap::instance().to_symbol (MonitoringAutomation), *this));
120 add_control (_monitoring_control);
122 _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
124 _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2));
125 _record_safe_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_safe_changed, this, _1, _2));
126 _record_enable_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_enable_changed, this, _1, _2));
128 _input->changed.connect_same_thread (*this, boost::bind (&Track::input_changed, this));
134 Track::input_changed ()
136 if (_disk_writer && _alignment_choice == Automatic) {
137 set_align_choice_from_io ();
148 Track::state (bool full)
150 XMLNode& root (Route::state (full));
152 if (_playlists[DataType::AUDIO]) {
153 root.set_property (X_("audio-playlist"), _playlists[DataType::AUDIO]->id().to_s());
156 if (_playlists[DataType::MIDI]) {
157 root.set_property (X_("midi-playlist"), _playlists[DataType::MIDI]->id().to_s());
160 root.add_child_nocopy (_monitoring_control->get_state ());
161 root.add_child_nocopy (_record_safe_control->get_state ());
162 root.add_child_nocopy (_record_enable_control->get_state ());
164 root.set_property (X_("saved-meter-point"), _saved_meter_point);
165 root.set_property (X_("alignment-choice"), _alignment_choice);
171 Track::set_state (const XMLNode& node, int version)
173 if (Route::set_state (node, version)) {
177 if (version >= 3000 && version < 6000) {
178 if (XMLNode* ds_node = find_named_node (node, "Diskstream")) {
180 if (ds_node->get_property ("name", name)) {
182 ds_node->set_property ("active", true);
184 _disk_writer->set_state (*ds_node, version);
185 _disk_reader->set_state (*ds_node, version);
188 if (ds_node->get_property (X_("capture-alignment"), ac)) {
189 set_align_choice (ac, true);
192 if (boost::shared_ptr<AudioPlaylist> pl = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_name (name))) {
193 use_playlist (DataType::AUDIO, pl);
196 if (boost::shared_ptr<MidiPlaylist> pl = boost::dynamic_pointer_cast<MidiPlaylist> (_session.playlists->by_name (name))) {
197 use_playlist (DataType::MIDI, pl);
204 std::string playlist_id;
206 if (node.get_property (X_("audio-playlist"), playlist_id)) {
207 find_and_use_playlist (DataType::AUDIO, PBD::ID (playlist_id));
210 if (node.get_property (X_("midi-playlist"), playlist_id)) {
211 find_and_use_playlist (DataType::MIDI, PBD::ID (playlist_id));
214 XMLNodeList nlist = node.children();
215 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
218 if (child->name() == Controllable::xml_node_name) {
220 if (!child->get_property ("name", name)) {
224 if (name == _record_enable_control->name()) {
225 _record_enable_control->set_state (*child, version);
226 } else if (name == _record_safe_control->name()) {
227 _record_safe_control->set_state (*child, version);
228 } else if (name == _monitoring_control->name()) {
229 _monitoring_control->set_state (*child, version);
234 if (!node.get_property (X_("saved-meter-point"), _saved_meter_point)) {
235 _saved_meter_point = _meter_point;
241 if (node.get_property (X_("alignment-choice"), ac)) {
242 set_align_choice (ac, true);
249 Track::get_template ()
251 return state (false);
254 Track::FreezeRecord::~FreezeRecord ()
256 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
262 Track::freeze_state() const
264 return _freeze_record.state;
270 bool will_record = true;
271 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
280 Track::prep_record_enabled (bool yn)
282 if (yn && _record_safe_control->get_value()) {
286 if (!can_be_record_enabled()) {
290 /* keep track of the meter point as it was before we rec-enabled */
291 if (!_disk_writer->record_enabled()) {
292 _saved_meter_point = _meter_point;
298 will_follow = _disk_writer->prep_record_enable ();
300 will_follow = _disk_writer->prep_record_disable ();
305 if (_meter_point != MeterCustom) {
306 set_meter_point (MeterInput);
309 set_meter_point (_saved_meter_point);
317 Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
319 _disk_writer->set_record_enabled (_record_enable_control->get_value());
323 Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
325 _disk_writer->set_record_safe (_record_safe_control->get_value());
329 Track::can_be_record_safe ()
331 return !_record_enable_control->get_value() && _disk_writer && _session.writable() && (_freeze_record.state != Frozen);
335 Track::can_be_record_enabled ()
337 return !_record_safe_control->get_value() && _disk_writer && !_disk_writer->record_safe() && _session.writable() && (_freeze_record.state != Frozen);
341 Track::parameter_changed (string const & p)
343 if (p == "track-name-number") {
344 resync_track_name ();
346 else if (p == "track-name-take") {
347 resync_track_name ();
349 else if (p == "take-name") {
350 if (_session.config.get_track_name_take()) {
351 resync_track_name ();
357 Track::resync_track_name ()
363 Track::set_name (const string& str)
371 if (_record_enable_control->get_value()) {
372 /* when re-arm'ed the file (named after the track) is already ready to rolll */
376 string diskstream_name = "";
377 if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
378 // Note: any text is fine, legalize_for_path() fixes this later
379 diskstream_name += _session.config.get_take_name ();
380 diskstream_name += "_";
382 const int64_t tracknumber = track_number();
383 if (tracknumber > 0 && _session.config.get_track_name_number()) {
384 char num[64], fmt[10];
385 snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
386 snprintf(num, sizeof(num), fmt, tracknumber);
387 diskstream_name += num;
388 diskstream_name += "_";
390 diskstream_name += str;
392 if (diskstream_name == _diskstream_name) {
395 _diskstream_name = diskstream_name;
397 _disk_writer->set_write_source_name (diskstream_name);
399 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
401 if (_playlists[data_type()]->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
402 /* Only rename the diskstream (and therefore the playlist) if
403 a) the playlist has never had a region added to it and
404 b) there is only one playlist for this track.
406 If (a) is not followed, people can get confused if, say,
407 they have notes about a playlist with a given name and then
408 it changes (see mantis #4759).
410 If (b) is not followed, we rename the current playlist and not
411 the other ones, which is a bit confusing (see mantis #4977).
413 _disk_reader->set_name (str);
414 _disk_writer->set_name (str);
417 for (uint32_t n = 0; n < DataType::num_types; ++n) {
419 _playlists[n]->set_name (str);
423 /* save state so that the statefile fully reflects any filename changes */
425 if ((ret = Route::set_name (str)) == 0) {
426 _session.save_state ("");
432 boost::shared_ptr<Playlist>
435 return _playlists[data_type()];
439 Track::request_input_monitoring (bool m)
441 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
442 AudioEngine::instance()->request_input_monitoring ((*i)->name(), m);
447 Track::ensure_input_monitoring (bool m)
449 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
450 AudioEngine::instance()->ensure_input_monitoring ((*i)->name(), m);
455 Track::destructive () const
457 return _disk_writer->destructive ();
460 list<boost::shared_ptr<Source> > &
461 Track::last_capture_sources ()
463 return _disk_writer->last_capture_sources ();
467 Track::steal_write_source_name()
469 return _disk_writer->steal_write_source_name ();
473 Track::reset_write_sources (bool r, bool force)
475 _disk_writer->reset_write_sources (r, force);
479 Track::playback_buffer_load () const
481 return _disk_reader->buffer_load ();
485 Track::capture_buffer_load () const
487 return _disk_writer->buffer_load ();
493 return _disk_reader->do_refill ();
497 Track::do_flush (RunContext c, bool force)
499 return _disk_writer->do_flush (c, force);
503 Track::set_pending_overwrite (bool o)
505 _disk_reader->set_pending_overwrite (o);
509 Track::seek (samplepos_t p, bool complete_refill)
511 if (_disk_reader->seek (p, complete_refill)) {
514 return _disk_writer->seek (p, complete_refill);
518 Track::can_internal_playback_seek (samplecnt_t p)
520 return _disk_reader->can_internal_playback_seek (p);
524 Track::internal_playback_seek (samplecnt_t p)
526 return _disk_reader->internal_playback_seek (p);
530 Track::non_realtime_locate (samplepos_t p)
532 Route::non_realtime_locate (p);
534 if (!is_private_route()) {
535 /* don't waste i/o cycles and butler calls
536 for private tracks (e.g.auditioner)
538 _disk_reader->non_realtime_locate (p);
539 _disk_writer->non_realtime_locate (p);
544 Track::non_realtime_speed_change ()
546 _disk_reader->non_realtime_speed_change ();
550 Track::overwrite_existing_buffers ()
552 return _disk_reader->overwrite_existing_buffers ();
556 Track::get_captured_samples (uint32_t n) const
558 return _disk_writer->get_captured_samples (n);
562 Track::set_loop (Location* l)
564 if (_disk_reader->set_loop (l)) {
567 return _disk_writer->set_loop (l);
571 Track::transport_looped (samplepos_t p)
573 return _disk_writer->transport_looped (p);
577 Track::realtime_handle_transport_stopped ()
579 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
585 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
586 (*i)->realtime_handle_transport_stopped ();
591 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
593 _disk_writer->transport_stopped_wallclock (n, t, g);
597 Track::pending_overwrite () const
599 return _disk_reader->pending_overwrite ();
603 Track::set_slaved (bool s)
605 _disk_reader->set_slaved (s);
606 _disk_writer->set_slaved (s);
612 return _disk_reader->output_streams();
616 Track::get_capture_start_sample (uint32_t n) const
618 return _disk_writer->get_capture_start_sample (n);
622 Track::alignment_style () const
624 return _disk_writer->alignment_style ();
628 Track::alignment_choice () const
630 return _alignment_choice;
634 Track::current_capture_start () const
636 return _disk_writer->current_capture_start ();
640 Track::current_capture_end () const
642 return _disk_writer->current_capture_end ();
646 Track::playlist_modified ()
648 _disk_reader->playlist_modified ();
652 Track::find_and_use_playlist (DataType dt, PBD::ID const & id)
654 boost::shared_ptr<Playlist> playlist;
656 if ((playlist = _session.playlists->by_id (id)) == 0) {
661 error << string_compose(_("DiskIOProcessor: \"%1\" isn't an playlist"), id.to_s()) << endmsg;
665 return use_playlist (dt, playlist);
669 Track::use_playlist (DataType dt, boost::shared_ptr<Playlist> p)
673 if ((ret = _disk_reader->use_playlist (dt, p)) == 0) {
674 if ((ret = _disk_writer->use_playlist (dt, p)) == 0) {
675 p->set_orig_track_id (id());
683 _session.set_dirty ();
684 PlaylistChanged (); /* EMIT SIGNAL */
690 Track::use_copy_playlist ()
692 assert (_playlists[data_type()]);
694 if (_playlists[data_type()] == 0) {
695 error << string_compose(_("DiskIOProcessor %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
700 boost::shared_ptr<Playlist> playlist;
702 newname = Playlist::bump_name (_playlists[data_type()]->name(), _session);
704 if ((playlist = PlaylistFactory::create (_playlists[data_type()], newname)) == 0) {
708 playlist->reset_shares();
710 return use_playlist (data_type(), playlist);
714 Track::use_new_playlist (DataType dt)
717 boost::shared_ptr<Playlist> playlist = _playlists[dt];
720 newname = Playlist::bump_name (playlist->name(), _session);
722 newname = Playlist::bump_name (_name, _session);
725 playlist = PlaylistFactory::create (dt, _session, newname, is_private_route());
731 return use_playlist (dt, playlist);
735 Track::set_align_choice (AlignChoice ac, bool force)
737 _alignment_choice = ac;
740 set_align_choice_from_io ();
743 _disk_writer->set_align_style (CaptureTime, force);
745 case UseExistingMaterial:
746 _disk_writer->set_align_style (ExistingMaterial, force);
752 Track::set_align_style (AlignStyle s, bool force)
754 _disk_writer->set_align_style (s, force);
758 Track::set_align_choice_from_io ()
760 bool have_physical = false;
764 vector<string> connections;
765 boost::shared_ptr<Port> p;
769 p = _input->nth (n++);
775 if (p->get_connections (connections) != 0) {
776 if (AudioEngine::instance()->port_is_physical (connections[0])) {
777 have_physical = true;
782 connections.clear ();
787 // compensate for latency when bouncing from master or mixbus.
788 // we need to use "ExistingMaterial" to pick up the master bus' latency
789 // see also Route::direct_feeds_according_to_reality
791 ios.push_back (_input);
792 if (_session.master_out() && ios.fed_by (_session.master_out()->output())) {
793 have_physical = true;
795 for (uint32_t n = 0; n < NUM_MIXBUSES && !have_physical; ++n) {
796 if (_session.get_mixbus (n) && ios.fed_by (_session.get_mixbus(n)->output())) {
797 have_physical = true;
803 _disk_writer->set_align_style (ExistingMaterial);
805 _disk_writer->set_align_style (CaptureTime);
810 Track::set_block_size (pframes_t n)
812 Route::set_block_size (n);
813 _disk_reader->set_block_size (n);
814 _disk_writer->set_block_size (n);
818 Track::adjust_playback_buffering ()
821 _disk_reader->adjust_buffering ();
826 Track::adjust_capture_buffering ()
829 _disk_writer->adjust_buffering ();
835 Track::maybe_declick (BufferSet& bufs, samplecnt_t nframes, int declick)
837 /* never declick if there is an internal generator - we just want it to
838 keep generating sound without interruption.
840 ditto if we are monitoring inputs.
843 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
848 declick = _pending_declick;
852 Amp::declick (bufs, nframes, declick);
857 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
859 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
860 (*i)->monitoring_changed ();
865 Track::metering_state () const
868 if (_session.transport_rolling ()) {
869 // audio_track.cc || midi_track.cc roll() runs meter IFF:
870 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled());
872 // track no_roll() always metering if
873 rv = _meter_point == MeterInput;
875 return rv ? MeteringInput : MeteringRoute;
879 Track::set_processor_state (XMLNode const & node, XMLProperty const* prop, ProcessorList& new_order, bool& must_configure)
881 if (Route::set_processor_state (node, prop, new_order, must_configure)) {
885 cerr << name() << " looking for state for track procs, DR = " << _disk_reader << endl;
887 if (prop->value() == "diskreader") {
889 _disk_reader->set_state (node, Stateful::current_state_version);
890 new_order.push_back (_disk_reader);
893 } else if (prop->value() == "diskwriter") {
895 _disk_writer->set_state (node, Stateful::current_state_version);
896 new_order.push_back (_disk_writer);
901 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
906 Track::use_captured_sources (SourceList& srcs, CaptureInfos const & capture_info)
912 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
913 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
916 use_captured_audio_sources (srcs, capture_info);
920 use_captured_midi_sources (srcs, capture_info);
925 Track::use_captured_midi_sources (SourceList& srcs, CaptureInfos const & capture_info)
927 if (srcs.empty() || data_type() != DataType::MIDI) {
931 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
932 boost::shared_ptr<Playlist> pl = _playlists[DataType::MIDI];
933 boost::shared_ptr<MidiRegion> midi_region;
934 CaptureInfos::const_iterator ci;
940 samplecnt_t total_capture = 0;
942 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
943 total_capture += (*ci)->samples;
946 /* we will want to be able to keep (over)writing the source
947 but we don't want it to be removable. this also differs
948 from the audio situation, where the source at this point
949 must be considered immutable. luckily, we can rely on
950 MidiSource::mark_streaming_write_completed() to have
951 already done the necessary work for that.
954 string whole_file_region_name;
955 whole_file_region_name = region_name_from_path (mfs->name(), true);
957 /* Register a new region with the Session that
958 describes the entire source. Do this first
959 so that any sub-regions will obviously be
960 children of this one (later!)
966 plist.add (Properties::name, whole_file_region_name);
967 plist.add (Properties::whole_file, true);
968 plist.add (Properties::automatic, true);
969 plist.add (Properties::start, 0);
970 plist.add (Properties::length, total_capture);
971 plist.add (Properties::layer, 0);
973 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
975 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
976 midi_region->special_set_position (capture_info.front()->start);
979 catch (failed_constructor& err) {
980 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
984 pl->clear_changes ();
987 /* Session sample time of the initial capture in this pass, which is where the source starts */
988 samplepos_t initial_capture = 0;
989 if (!capture_info.empty()) {
990 initial_capture = capture_info.front()->start;
993 BeatsSamplesConverter converter (_session.tempo_map(), capture_info.front()->start);
994 const samplepos_t preroll_off = _session.preroll_record_trim_len ();
996 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1000 RegionFactory::region_name (region_name, mfs->name(), false);
1002 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1003 _name, (*ci)->start, (*ci)->samples, region_name));
1006 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->samples << " add a region\n";
1011 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1012 plist.add (Properties::start, (*ci)->start - initial_capture);
1013 plist.add (Properties::length, (*ci)->samples);
1014 plist.add (Properties::length_beats, converter.from((*ci)->samples).to_double());
1015 plist.add (Properties::name, region_name);
1017 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1018 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1019 if (preroll_off > 0) {
1020 midi_region->trim_front ((*ci)->start - initial_capture + preroll_off);
1024 catch (failed_constructor& err) {
1025 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1026 continue; /* XXX is this OK? */
1029 cerr << "add new region, len = " << (*ci)->samples << " @ " << (*ci)->start << endl;
1031 pl->add_region (midi_region, (*ci)->start + preroll_off, 1, _session.config.get_layered_record_mode ());
1035 _session.add_command (new StatefulDiffCommand (pl));
1039 Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & capture_info)
1041 if (srcs.empty() || data_type() != DataType::AUDIO) {
1045 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1046 boost::shared_ptr<Playlist> pl = _playlists[DataType::AUDIO];
1047 boost::shared_ptr<AudioRegion> region;
1053 /* destructive tracks have a single, never changing region */
1055 if (destructive()) {
1057 /* send a signal that any UI can pick up to do the right thing. there is
1058 a small problem here in that a UI may need the peak data to be ready
1059 for the data that was recorded and this isn't interlocked with that
1060 process. this problem is deferred to the UI.
1063 pl->LayeringChanged(); // XXX this may not get the UI to do the right thing
1067 string whole_file_region_name;
1068 whole_file_region_name = region_name_from_path (afs->name(), true);
1070 /* Register a new region with the Session that
1071 describes the entire source. Do this first
1072 so that any sub-regions will obviously be
1073 children of this one (later!)
1079 plist.add (Properties::start, afs->last_capture_start_sample());
1080 plist.add (Properties::length, afs->length(0));
1081 plist.add (Properties::name, whole_file_region_name);
1082 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1083 rx->set_automatic (true);
1084 rx->set_whole_file (true);
1086 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1087 region->special_set_position (afs->natural_position());
1091 catch (failed_constructor& err) {
1092 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1096 pl->clear_changes ();
1097 pl->set_capture_insertion_in_progress (true);
1100 const samplepos_t preroll_off = _session.preroll_record_trim_len ();
1101 samplecnt_t buffer_position = afs->last_capture_start_sample ();
1102 CaptureInfos::const_iterator ci;
1104 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1108 RegionFactory::region_name (region_name, whole_file_region_name, false);
1110 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture bufpos %5 start @ %2 length %3 add new region %4\n",
1111 _name, (*ci)->start, (*ci)->samples, region_name, buffer_position));
1117 plist.add (Properties::start, buffer_position);
1118 plist.add (Properties::length, (*ci)->samples);
1119 plist.add (Properties::name, region_name);
1121 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1122 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1123 if (preroll_off > 0) {
1124 region->trim_front (buffer_position + preroll_off);
1128 catch (failed_constructor& err) {
1129 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1130 continue; /* XXX is this OK? */
1133 pl->add_region (region, (*ci)->start + preroll_off, 1, _session.config.get_layered_record_mode());
1134 pl->set_layer (region, DBL_MAX);
1136 buffer_position += (*ci)->samples;
1140 pl->set_capture_insertion_in_progress (false);
1141 _session.add_command (new StatefulDiffCommand (pl));