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/audioregion.h"
24 #include "ardour/debug.h"
25 #include "ardour/delivery.h"
26 #include "ardour/disk_reader.h"
27 #include "ardour/disk_writer.h"
28 #include "ardour/event_type_map.h"
29 #include "ardour/io_processor.h"
30 #include "ardour/meter.h"
31 #include "ardour/midi_region.h"
32 #include "ardour/monitor_control.h"
33 #include "ardour/playlist.h"
34 #include "ardour/playlist_factory.h"
35 #include "ardour/port.h"
36 #include "ardour/processor.h"
37 #include "ardour/profile.h"
38 #include "ardour/region_factory.h"
39 #include "ardour/record_enable_control.h"
40 #include "ardour/record_safe_control.h"
41 #include "ardour/route_group_specialized.h"
42 #include "ardour/session.h"
43 #include "ardour/session_playlists.h"
44 #include "ardour/smf_source.h"
45 #include "ardour/track.h"
46 #include "ardour/types_convert.h"
47 #include "ardour/utils.h"
52 using namespace ARDOUR;
55 Track::Track (Session& sess, string name, PresentationInfo::Flag flag, TrackMode mode, DataType default_type)
56 : Route (sess, name, flag, default_type)
57 , _saved_meter_point (_meter_point)
59 , _alignment_choice (Automatic)
61 _freeze_record.state = NoFreeze;
68 DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
71 _disk_reader->set_route (boost::shared_ptr<Route>());
72 _disk_reader.reset ();
76 _disk_writer->set_route (boost::shared_ptr<Route>());
77 _disk_writer.reset ();
88 DiskIOProcessor::Flag dflags = DiskIOProcessor::Recordable;
90 if (_mode == Destructive && !Profile->get_trx()) {
91 dflags = DiskIOProcessor::Flag (dflags | DiskIOProcessor::Destructive);
92 } else if (_mode == NonLayered){
93 dflags = DiskIOProcessor::Flag(dflags | DiskIOProcessor::NonLayered);
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()));
100 set_align_choice_from_io ();
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()));
105 use_new_playlist (data_type());
107 boost::shared_ptr<Route> rp (boost::dynamic_pointer_cast<Route> (shared_from_this()));
108 boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
110 _record_enable_control.reset (new RecordEnableControl (_session, EventTypeMap::instance().to_symbol (RecEnableAutomation), *this));
111 add_control (_record_enable_control);
113 _record_safe_control.reset (new RecordSafeControl (_session, EventTypeMap::instance().to_symbol (RecSafeAutomation), *this));
114 add_control (_record_safe_control);
116 _monitoring_control.reset (new MonitorControl (_session, EventTypeMap::instance().to_symbol (MonitoringAutomation), *this));
117 add_control (_monitoring_control);
119 _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
121 _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2));
122 _record_safe_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_safe_changed, this, _1, _2));
123 _record_enable_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_enable_changed, this, _1, _2));
125 _input->changed.connect_same_thread (*this, boost::bind (&Track::input_changed, this));
131 Track::input_changed ()
133 if (_disk_writer && _alignment_choice == Automatic) {
134 set_align_choice_from_io ();
145 Track::state (bool full)
147 XMLNode& root (Route::state (full));
149 if (_playlists[DataType::AUDIO]) {
150 root.set_property (X_("audio-playlist"), _playlists[DataType::AUDIO]->id().to_s());
153 if (_playlists[DataType::MIDI]) {
154 root.set_property (X_("midi-playlist"), _playlists[DataType::MIDI]->id().to_s());
157 root.add_child_nocopy (_monitoring_control->get_state ());
158 root.add_child_nocopy (_record_safe_control->get_state ());
159 root.add_child_nocopy (_record_enable_control->get_state ());
161 root.set_property (X_("saved-meter-point"), _saved_meter_point);
162 root.set_property (X_("alignment-choice"), _alignment_choice);
168 Track::set_state (const XMLNode& node, int version)
170 if (Route::set_state (node, version)) {
176 if (version >= 3000 && version < 4000) {
177 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
178 /* XXX if we remember anything from stored DiskStream
179 state (older Ardour versions) that is needed by a
180 DiskReader or DiskWriter, we should cook up a new
181 XMLNode here, populate it with that information
182 (child nodes, properties, etc.) and then call
183 ::set_state() on the writer/reader.
185 But at present (June 2017), there's no such state.
190 std::string playlist_id;
192 if (node.get_property (X_("audio-playlist"), playlist_id)) {
193 find_and_use_playlist (DataType::AUDIO, PBD::ID (playlist_id));
196 if (node.get_property (X_("midi-playlist"), playlist_id)) {
197 find_and_use_playlist (DataType::MIDI, PBD::ID (playlist_id));
200 XMLNodeList nlist = node.children();
201 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
204 if (child->name() == Controllable::xml_node_name) {
206 if (!child->get_property ("name", name)) {
210 if (name == _record_enable_control->name()) {
211 _record_enable_control->set_state (*child, version);
212 } else if (name == _record_safe_control->name()) {
213 _record_safe_control->set_state (*child, version);
214 } else if (name == _monitoring_control->name()) {
215 _monitoring_control->set_state (*child, version);
220 if (!node.get_property (X_("saved-meter-point"), _saved_meter_point)) {
221 _saved_meter_point = _meter_point;
227 if (node.get_property (X_("alignment-choice"), ac)) {
228 set_align_choice (ac, true);
235 Track::get_template ()
237 return state (false);
240 Track::FreezeRecord::~FreezeRecord ()
242 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
248 Track::freeze_state() const
250 return _freeze_record.state;
256 bool will_record = true;
257 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
266 Track::prep_record_enabled (bool yn)
268 if (yn && _record_safe_control->get_value()) {
272 if (!can_be_record_enabled()) {
276 /* keep track of the meter point as it was before we rec-enabled */
277 if (!_disk_writer->record_enabled()) {
278 _saved_meter_point = _meter_point;
284 will_follow = _disk_writer->prep_record_enable ();
286 will_follow = _disk_writer->prep_record_disable ();
291 if (_meter_point != MeterCustom) {
292 set_meter_point (MeterInput);
295 set_meter_point (_saved_meter_point);
303 Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
305 _disk_writer->set_record_enabled (_record_enable_control->get_value());
309 Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
311 _disk_writer->set_record_safe (_record_safe_control->get_value());
315 Track::can_be_record_safe ()
317 return !_record_enable_control->get_value() && _disk_writer && _session.writable() && (_freeze_record.state != Frozen);
321 Track::can_be_record_enabled ()
323 return !_record_safe_control->get_value() && _disk_writer && !_disk_writer->record_safe() && _session.writable() && (_freeze_record.state != Frozen);
327 Track::parameter_changed (string const & p)
329 if (p == "track-name-number") {
330 resync_track_name ();
332 else if (p == "track-name-take") {
333 resync_track_name ();
335 else if (p == "take-name") {
336 if (_session.config.get_track_name_take()) {
337 resync_track_name ();
343 Track::resync_track_name ()
349 Track::set_name (const string& str)
357 if (_record_enable_control->get_value()) {
358 /* when re-arm'ed the file (named after the track) is already ready to rolll */
362 string diskstream_name = "";
363 if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
364 // Note: any text is fine, legalize_for_path() fixes this later
365 diskstream_name += _session.config.get_take_name ();
366 diskstream_name += "_";
368 const int64_t tracknumber = track_number();
369 if (tracknumber > 0 && _session.config.get_track_name_number()) {
370 char num[64], fmt[10];
371 snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
372 snprintf(num, sizeof(num), fmt, tracknumber);
373 diskstream_name += num;
374 diskstream_name += "_";
376 diskstream_name += str;
378 if (diskstream_name == _diskstream_name) {
381 _diskstream_name = diskstream_name;
383 _disk_writer->set_write_source_name (diskstream_name);
385 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
387 if (_playlists[data_type()]->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
388 /* Only rename the diskstream (and therefore the playlist) if
389 a) the playlist has never had a region added to it and
390 b) there is only one playlist for this track.
392 If (a) is not followed, people can get confused if, say,
393 they have notes about a playlist with a given name and then
394 it changes (see mantis #4759).
396 If (b) is not followed, we rename the current playlist and not
397 the other ones, which is a bit confusing (see mantis #4977).
399 _disk_reader->set_name (str);
400 _disk_writer->set_name (str);
403 for (uint32_t n = 0; n < DataType::num_types; ++n) {
405 _playlists[n]->set_name (str);
409 /* save state so that the statefile fully reflects any filename changes */
411 if ((ret = Route::set_name (str)) == 0) {
412 _session.save_state ("");
419 Track::no_roll (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool session_state_changing)
421 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
427 bool can_record = _session.actively_recording ();
429 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
431 if (n_outputs().n_total() == 0 && !ARDOUR::Profile->get_mixbus()) {
432 //Note: Mixbus has its own output mechanism, so we should operate even if no explicit outputs are assigned
436 /* not active ... do the minimum possible by just outputting silence */
440 if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled())) {
446 if (session_state_changing) {
447 if (_session.transport_speed() != 0.0f) {
448 /* we're rolling but some state is changing (e.g. our
449 disk reader contents) so we cannot use them. Be
450 silent till this is over. Don't declick.
452 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
454 passthru_silence (start_sample, end_sample, nframes, 0);
457 /* we're really not rolling, so we're either delivery silence or actually
458 monitoring, both of which are safe to do while session_state_changing is true.
462 _disk_writer->check_record_status (start_sample, can_record);
466 MonitorState const s = monitoring_state ();
467 /* we are not rolling, so be silent even if we are monitoring disk, as there
468 will be no disk data coming in.
471 case MonitoringSilence:
477 case MonitoringInput:
485 //if we have an internal generator, let it play regardless of monitoring state
486 if (_have_internal_generator) {
490 /* if have_internal_generator, or .. */
494 if (_meter_point == MeterInput) {
495 /* still need input monitoring and metering */
497 bool const track_rec = _disk_writer->record_enabled ();
498 bool const auto_input = _session.config.get_auto_input ();
499 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
500 bool const tape_machine_mode = Config->get_tape_machine_mode ();
501 bool no_meter = false;
503 /* this needs a proper K-map
504 * and should be separated into a function similar to monitoring_state()
505 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
507 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
509 if (!auto_input && !track_rec) {
512 else if (tape_machine_mode && !track_rec && auto_input) {
515 else if (!software_monitor && tape_machine_mode && !track_rec) {
518 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
523 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
524 _meter->run (bufs, start_sample, end_sample, 1.0, nframes, true);
525 _input->process_input (boost::shared_ptr<Processor>(), start_sample, end_sample, _session.transport_speed(), nframes);
527 _input->process_input (_meter, start_sample, end_sample, _session.transport_speed(), nframes);
531 passthru_silence (start_sample, end_sample, nframes, 0);
535 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
537 fill_buffers_with_input (bufs, _input, nframes);
539 if (_meter_point == MeterInput) {
540 _meter->run (bufs, start_sample, end_sample, _session.transport_speed(), nframes, true);
543 passthru (bufs, start_sample, end_sample, nframes, false, true);
546 flush_processor_buffers_locked (nframes);
551 boost::shared_ptr<Playlist>
554 return _playlists[data_type()];
558 Track::request_input_monitoring (bool m)
560 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
561 AudioEngine::instance()->request_input_monitoring ((*i)->name(), m);
566 Track::ensure_input_monitoring (bool m)
568 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
569 AudioEngine::instance()->ensure_input_monitoring ((*i)->name(), m);
574 Track::destructive () const
576 return _disk_writer->destructive ();
579 list<boost::shared_ptr<Source> > &
580 Track::last_capture_sources ()
582 return _disk_writer->last_capture_sources ();
586 Track::update_latency_information ()
588 Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
589 samplecnt_t chain_latency = _input->latency ();
591 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
592 (*p)->set_input_latency (chain_latency);
593 chain_latency += (*p)->signal_latency ();
598 Track::steal_write_source_name()
600 return _disk_writer->steal_write_source_name ();
604 Track::reset_write_sources (bool r, bool force)
606 _disk_writer->reset_write_sources (r, force);
610 Track::playback_buffer_load () const
612 return _disk_reader->buffer_load ();
616 Track::capture_buffer_load () const
618 return _disk_writer->buffer_load ();
624 return _disk_reader->do_refill ();
628 Track::do_flush (RunContext c, bool force)
630 return _disk_writer->do_flush (c, force);
634 Track::set_pending_overwrite (bool o)
636 _disk_reader->set_pending_overwrite (o);
640 Track::seek (samplepos_t p, bool complete_refill)
642 if (_disk_reader->seek (p, complete_refill)) {
645 return _disk_writer->seek (p, complete_refill);
649 Track::can_internal_playback_seek (samplecnt_t p)
651 return _disk_reader->can_internal_playback_seek (p);
655 Track::internal_playback_seek (samplecnt_t p)
657 return _disk_reader->internal_playback_seek (p);
661 Track::non_realtime_locate (samplepos_t p)
663 Route::non_realtime_locate (p);
665 if (!is_private_route()) {
666 /* don't waste i/o cycles and butler calls
667 for private tracks (e.g.auditioner)
669 _disk_reader->non_realtime_locate (p);
670 _disk_writer->non_realtime_locate (p);
675 Track::non_realtime_speed_change ()
677 _disk_reader->non_realtime_speed_change ();
681 Track::overwrite_existing_buffers ()
683 return _disk_reader->overwrite_existing_buffers ();
687 Track::get_captured_samples (uint32_t n) const
689 return _disk_writer->get_captured_samples (n);
693 Track::set_loop (Location* l)
695 if (_disk_reader->set_loop (l)) {
698 return _disk_writer->set_loop (l);
702 Track::transport_looped (samplepos_t p)
704 return _disk_writer->transport_looped (p);
708 Track::realtime_speed_change ()
710 if (_disk_reader->realtime_speed_change ()) {
713 return _disk_writer->realtime_speed_change ();
717 Track::realtime_handle_transport_stopped ()
719 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
725 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
726 (*i)->realtime_handle_transport_stopped ();
731 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
733 _disk_writer->transport_stopped_wallclock (n, t, g);
737 Track::pending_overwrite () const
739 return _disk_reader->pending_overwrite ();
743 Track::prepare_to_stop (samplepos_t t, samplepos_t a)
745 _disk_writer->prepare_to_stop (t, a);
749 Track::set_slaved (bool s)
751 _disk_reader->set_slaved (s);
752 _disk_writer->set_slaved (s);
758 return _disk_reader->output_streams();
762 Track::get_capture_start_sample (uint32_t n) const
764 return _disk_writer->get_capture_start_sample (n);
768 Track::alignment_style () const
770 return _disk_writer->alignment_style ();
774 Track::alignment_choice () const
776 return _alignment_choice;
780 Track::current_capture_start () const
782 return _disk_writer->current_capture_start ();
786 Track::current_capture_end () const
788 return _disk_writer->current_capture_end ();
792 Track::playlist_modified ()
794 _disk_reader->playlist_modified ();
798 Track::find_and_use_playlist (DataType dt, PBD::ID const & id)
800 boost::shared_ptr<Playlist> playlist;
802 if ((playlist = _session.playlists->by_id (id)) == 0) {
807 error << string_compose(_("DiskIOProcessor: \"%1\" isn't an playlist"), id.to_s()) << endmsg;
811 return use_playlist (dt, playlist);
815 Track::use_playlist (DataType dt, boost::shared_ptr<Playlist> p)
819 if ((ret = _disk_reader->use_playlist (dt, p)) == 0) {
820 if ((ret = _disk_writer->use_playlist (dt, p)) == 0) {
821 p->set_orig_track_id (id());
833 Track::use_copy_playlist ()
835 assert (_playlists[data_type()]);
837 if (_playlists[data_type()] == 0) {
838 error << string_compose(_("DiskIOProcessor %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
843 boost::shared_ptr<Playlist> playlist;
845 newname = Playlist::bump_name (_playlists[data_type()]->name(), _session);
847 if ((playlist = PlaylistFactory::create (_playlists[data_type()], newname)) == 0) {
851 playlist->reset_shares();
853 return use_playlist (data_type(), playlist);
857 Track::use_new_playlist (DataType dt)
860 boost::shared_ptr<Playlist> playlist = _playlists[dt];
863 newname = Playlist::bump_name (playlist->name(), _session);
865 newname = Playlist::bump_name (_name, _session);
868 playlist = PlaylistFactory::create (dt, _session, newname, is_private_route());
874 return use_playlist (dt, playlist);
878 Track::set_align_choice (AlignChoice ac, bool force)
880 _alignment_choice = ac;
883 set_align_choice_from_io ();
886 _disk_writer->set_align_style (CaptureTime, force);
888 case UseExistingMaterial:
889 _disk_writer->set_align_style (ExistingMaterial, force);
895 Track::set_align_style (AlignStyle s, bool force)
897 _disk_writer->set_align_style (s, force);
901 Track::set_align_choice_from_io ()
903 bool have_physical = false;
907 vector<string> connections;
908 boost::shared_ptr<Port> p;
912 p = _input->nth (n++);
918 if (p->get_connections (connections) != 0) {
919 if (AudioEngine::instance()->port_is_physical (connections[0])) {
920 have_physical = true;
925 connections.clear ();
930 // compensate for latency when bouncing from master or mixbus.
931 // we need to use "ExistingMaterial" to pick up the master bus' latency
932 // see also Route::direct_feeds_according_to_reality
934 ios.push_back (_input);
935 if (_session.master_out() && ios.fed_by (_session.master_out()->output())) {
936 have_physical = true;
938 for (uint32_t n = 0; n < NUM_MIXBUSES && !have_physical; ++n) {
939 if (_session.get_mixbus (n) && ios.fed_by (_session.get_mixbus(n)->output())) {
940 have_physical = true;
946 _disk_writer->set_align_style (ExistingMaterial);
948 _disk_writer->set_align_style (CaptureTime);
953 Track::set_block_size (pframes_t n)
955 Route::set_block_size (n);
956 _disk_reader->set_block_size (n);
957 _disk_writer->set_block_size (n);
961 Track::adjust_playback_buffering ()
964 _disk_reader->adjust_buffering ();
969 Track::adjust_capture_buffering ()
972 _disk_writer->adjust_buffering ();
978 Track::maybe_declick (BufferSet& bufs, samplecnt_t nframes, int declick)
980 /* never declick if there is an internal generator - we just want it to
981 keep generating sound without interruption.
983 ditto if we are monitoring inputs.
986 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
991 declick = _pending_declick;
995 Amp::declick (bufs, nframes, declick);
1000 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
1002 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1003 (*i)->monitoring_changed ();
1008 Track::metering_state () const
1011 if (_session.transport_rolling ()) {
1012 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1013 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled());
1015 // track no_roll() always metering if
1016 rv = _meter_point == MeterInput;
1018 return rv ? MeteringInput : MeteringRoute;
1022 Track::set_processor_state (XMLNode const & node, XMLProperty const* prop, ProcessorList& new_order, bool& must_configure)
1024 if (Route::set_processor_state (node, prop, new_order, must_configure)) {
1028 cerr << name() << " looking for state for track procs, DR = " << _disk_reader << endl;
1030 if (prop->value() == "diskreader") {
1032 _disk_reader->set_state (node, Stateful::current_state_version);
1033 new_order.push_back (_disk_reader);
1036 } else if (prop->value() == "diskwriter") {
1038 _disk_writer->set_state (node, Stateful::current_state_version);
1039 new_order.push_back (_disk_writer);
1044 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
1049 Track::use_captured_sources (SourceList& srcs, CaptureInfos const & capture_info)
1055 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1056 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1059 use_captured_audio_sources (srcs, capture_info);
1063 use_captured_midi_sources (srcs, capture_info);
1068 Track::use_captured_midi_sources (SourceList& srcs, CaptureInfos const & capture_info)
1070 if (srcs.empty() || data_type() != DataType::MIDI) {
1074 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1075 boost::shared_ptr<Playlist> pl = _playlists[DataType::MIDI];
1076 boost::shared_ptr<MidiRegion> midi_region;
1077 CaptureInfos::const_iterator ci;
1083 samplecnt_t total_capture = 0;
1085 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1086 total_capture += (*ci)->samples;
1089 /* we will want to be able to keep (over)writing the source
1090 but we don't want it to be removable. this also differs
1091 from the audio situation, where the source at this point
1092 must be considered immutable. luckily, we can rely on
1093 MidiSource::mark_streaming_write_completed() to have
1094 already done the necessary work for that.
1097 string whole_file_region_name;
1098 whole_file_region_name = region_name_from_path (mfs->name(), true);
1100 /* Register a new region with the Session that
1101 describes the entire source. Do this first
1102 so that any sub-regions will obviously be
1103 children of this one (later!)
1109 plist.add (Properties::name, whole_file_region_name);
1110 plist.add (Properties::whole_file, true);
1111 plist.add (Properties::automatic, true);
1112 plist.add (Properties::start, 0);
1113 plist.add (Properties::length, total_capture);
1114 plist.add (Properties::layer, 0);
1116 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1118 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1119 midi_region->special_set_position (capture_info.front()->start);
1122 catch (failed_constructor& err) {
1123 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
1127 pl->clear_changes ();
1130 /* Session sample time of the initial capture in this pass, which is where the source starts */
1131 samplepos_t initial_capture = 0;
1132 if (!capture_info.empty()) {
1133 initial_capture = capture_info.front()->start;
1136 BeatsSamplesConverter converter (_session.tempo_map(), capture_info.front()->start);
1137 const samplepos_t preroll_off = _session.preroll_record_trim_len ();
1139 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1143 RegionFactory::region_name (region_name, mfs->name(), false);
1145 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1146 _name, (*ci)->start, (*ci)->samples, region_name));
1149 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->samples << " add a region\n";
1154 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1155 plist.add (Properties::start, (*ci)->start - initial_capture);
1156 plist.add (Properties::length, (*ci)->samples);
1157 plist.add (Properties::length_beats, converter.from((*ci)->samples).to_double());
1158 plist.add (Properties::name, region_name);
1160 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1161 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1162 if (preroll_off > 0) {
1163 midi_region->trim_front ((*ci)->start - initial_capture + preroll_off);
1167 catch (failed_constructor& err) {
1168 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1169 continue; /* XXX is this OK? */
1172 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1174 pl->add_region (midi_region, (*ci)->start + preroll_off, _disk_writer->non_layered());
1178 _session.add_command (new StatefulDiffCommand (pl));
1182 Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & capture_info)
1184 if (srcs.empty() || data_type() != DataType::AUDIO) {
1188 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1189 boost::shared_ptr<Playlist> pl = _playlists[DataType::AUDIO];
1190 boost::shared_ptr<AudioRegion> region;
1196 /* destructive tracks have a single, never changing region */
1198 if (destructive()) {
1200 /* send a signal that any UI can pick up to do the right thing. there is
1201 a small problem here in that a UI may need the peak data to be ready
1202 for the data that was recorded and this isn't interlocked with that
1203 process. this problem is deferred to the UI.
1206 pl->LayeringChanged(); // XXX this may not get the UI to do the right thing
1210 string whole_file_region_name;
1211 whole_file_region_name = region_name_from_path (afs->name(), true);
1213 /* Register a new region with the Session that
1214 describes the entire source. Do this first
1215 so that any sub-regions will obviously be
1216 children of this one (later!)
1222 plist.add (Properties::start, afs->last_capture_start_sample());
1223 plist.add (Properties::length, afs->length(0));
1224 plist.add (Properties::name, whole_file_region_name);
1225 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1226 rx->set_automatic (true);
1227 rx->set_whole_file (true);
1229 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1230 region->special_set_position (afs->natural_position());
1234 catch (failed_constructor& err) {
1235 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1239 pl->clear_changes ();
1240 pl->set_capture_insertion_in_progress (true);
1243 const samplepos_t preroll_off = _session.preroll_record_trim_len ();
1244 samplecnt_t buffer_position = afs->last_capture_start_sample ();
1245 CaptureInfos::const_iterator ci;
1247 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1251 RegionFactory::region_name (region_name, whole_file_region_name, false);
1253 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture bufpos %5 start @ %2 length %3 add new region %4\n",
1254 _name, (*ci)->start, (*ci)->samples, region_name, buffer_position));
1260 plist.add (Properties::start, buffer_position);
1261 plist.add (Properties::length, (*ci)->samples);
1262 plist.add (Properties::name, region_name);
1264 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1265 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1266 if (preroll_off > 0) {
1267 region->trim_front (buffer_position + preroll_off);
1271 catch (failed_constructor& err) {
1272 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1273 continue; /* XXX is this OK? */
1276 pl->add_region (region, (*ci)->start + preroll_off, 1, _disk_writer->non_layered());
1277 pl->set_layer (region, DBL_MAX);
1279 buffer_position += (*ci)->samples;
1283 pl->set_capture_insertion_in_progress (false);
1284 _session.add_command (new StatefulDiffCommand (pl));