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 _disk_writer.reset (new DiskWriter (_session, name(), dflags));
101 _disk_writer->set_block_size (_session.get_block_size ());
102 _disk_writer->set_route (boost::dynamic_pointer_cast<Route> (shared_from_this()));
104 set_align_choice_from_io ();
106 use_new_playlist (data_type());
108 boost::shared_ptr<Route> rp (boost::dynamic_pointer_cast<Route> (shared_from_this()));
109 boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
111 _record_enable_control.reset (new RecordEnableControl (_session, EventTypeMap::instance().to_symbol (RecEnableAutomation), *this));
112 add_control (_record_enable_control);
114 _record_safe_control.reset (new RecordSafeControl (_session, EventTypeMap::instance().to_symbol (RecSafeAutomation), *this));
115 add_control (_record_safe_control);
117 _monitoring_control.reset (new MonitorControl (_session, EventTypeMap::instance().to_symbol (MonitoringAutomation), *this));
118 add_control (_monitoring_control);
120 _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
122 _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2));
123 _record_safe_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_safe_changed, this, _1, _2));
124 _record_enable_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_enable_changed, this, _1, _2));
126 _input->changed.connect_same_thread (*this, boost::bind (&Track::input_changed, this));
132 Track::input_changed ()
134 if (_disk_writer && _alignment_choice == Automatic) {
135 set_align_choice_from_io ();
146 Track::state (bool full)
148 XMLNode& root (Route::state (full));
150 if (_playlists[DataType::AUDIO]) {
151 root.set_property (X_("audio-playlist"), _playlists[DataType::AUDIO]->id().to_s());
154 if (_playlists[DataType::MIDI]) {
155 root.set_property (X_("midi-playlist"), _playlists[DataType::MIDI]->id().to_s());
158 root.add_child_nocopy (_monitoring_control->get_state ());
159 root.add_child_nocopy (_record_safe_control->get_state ());
160 root.add_child_nocopy (_record_enable_control->get_state ());
162 root.set_property (X_("saved-meter-point"), _saved_meter_point);
163 root.set_property (X_("alignment-choice"), _alignment_choice);
169 Track::set_state (const XMLNode& node, int version)
171 if (Route::set_state (node, version)) {
177 if (version >= 3000 && version < 4000) {
178 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
179 /* XXX if we remember anything from stored DiskStream
180 state (older Ardour versions) that is needed by a
181 DiskReader or DiskWriter, we should cook up a new
182 XMLNode here, populate it with that information
183 (child nodes, properties, etc.) and then call
184 ::set_state() on the writer/reader.
186 But at present (June 2017), there's no such state.
191 std::string playlist_id;
193 if (node.get_property (X_("audio-playlist"), playlist_id)) {
194 find_and_use_playlist (DataType::AUDIO, PBD::ID (playlist_id));
197 if (node.get_property (X_("midi-playlist"), playlist_id)) {
198 find_and_use_playlist (DataType::MIDI, PBD::ID (playlist_id));
201 XMLNodeList nlist = node.children();
202 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
205 if (child->name() == Controllable::xml_node_name) {
207 if (!child->get_property ("name", name)) {
211 if (name == _record_enable_control->name()) {
212 _record_enable_control->set_state (*child, version);
213 } else if (name == _record_safe_control->name()) {
214 _record_safe_control->set_state (*child, version);
215 } else if (name == _monitoring_control->name()) {
216 _monitoring_control->set_state (*child, version);
221 if (!node.get_property (X_("saved-meter-point"), _saved_meter_point)) {
222 _saved_meter_point = _meter_point;
228 if (node.get_property (X_("alignment-choice"), ac)) {
229 set_align_choice (ac, true);
236 Track::get_template ()
238 return state (false);
241 Track::FreezeRecord::~FreezeRecord ()
243 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
249 Track::freeze_state() const
251 return _freeze_record.state;
257 bool will_record = true;
258 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
267 Track::prep_record_enabled (bool yn)
269 if (yn && _record_safe_control->get_value()) {
273 if (!can_be_record_enabled()) {
277 /* keep track of the meter point as it was before we rec-enabled */
278 if (!_disk_writer->record_enabled()) {
279 _saved_meter_point = _meter_point;
285 will_follow = _disk_writer->prep_record_enable ();
287 will_follow = _disk_writer->prep_record_disable ();
292 if (_meter_point != MeterCustom) {
293 set_meter_point (MeterInput);
296 set_meter_point (_saved_meter_point);
304 Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
306 _disk_writer->set_record_enabled (_record_enable_control->get_value());
310 Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
312 _disk_writer->set_record_safe (_record_safe_control->get_value());
316 Track::can_be_record_safe ()
318 return !_record_enable_control->get_value() && _disk_writer && _session.writable() && (_freeze_record.state != Frozen);
322 Track::can_be_record_enabled ()
324 return !_record_safe_control->get_value() && _disk_writer && !_disk_writer->record_safe() && _session.writable() && (_freeze_record.state != Frozen);
328 Track::parameter_changed (string const & p)
330 if (p == "track-name-number") {
331 resync_track_name ();
333 else if (p == "track-name-take") {
334 resync_track_name ();
336 else if (p == "take-name") {
337 if (_session.config.get_track_name_take()) {
338 resync_track_name ();
344 Track::resync_track_name ()
350 Track::set_name (const string& str)
358 if (_record_enable_control->get_value()) {
359 /* when re-arm'ed the file (named after the track) is already ready to rolll */
363 string diskstream_name = "";
364 if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
365 // Note: any text is fine, legalize_for_path() fixes this later
366 diskstream_name += _session.config.get_take_name ();
367 diskstream_name += "_";
369 const int64_t tracknumber = track_number();
370 if (tracknumber > 0 && _session.config.get_track_name_number()) {
371 char num[64], fmt[10];
372 snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
373 snprintf(num, sizeof(num), fmt, tracknumber);
374 diskstream_name += num;
375 diskstream_name += "_";
377 diskstream_name += str;
379 if (diskstream_name == _diskstream_name) {
382 _diskstream_name = diskstream_name;
384 _disk_writer->set_write_source_name (diskstream_name);
386 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
388 if (_playlists[data_type()]->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
389 /* Only rename the diskstream (and therefore the playlist) if
390 a) the playlist has never had a region added to it and
391 b) there is only one playlist for this track.
393 If (a) is not followed, people can get confused if, say,
394 they have notes about a playlist with a given name and then
395 it changes (see mantis #4759).
397 If (b) is not followed, we rename the current playlist and not
398 the other ones, which is a bit confusing (see mantis #4977).
400 _disk_reader->set_name (str);
401 _disk_writer->set_name (str);
404 for (uint32_t n = 0; n < DataType::num_types; ++n) {
406 _playlists[n]->set_name (str);
410 /* save state so that the statefile fully reflects any filename changes */
412 if ((ret = Route::set_name (str)) == 0) {
413 _session.save_state ("");
420 Track::no_roll (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool session_state_changing)
422 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
428 bool can_record = _session.actively_recording ();
430 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
432 if (n_outputs().n_total() == 0 && !ARDOUR::Profile->get_mixbus()) {
433 //Note: Mixbus has its own output mechanism, so we should operate even if no explicit outputs are assigned
437 /* not active ... do the minimum possible by just outputting silence */
441 if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled())) {
447 if (session_state_changing) {
448 if (_session.transport_speed() != 0.0f) {
449 /* we're rolling but some state is changing (e.g. our
450 disk reader contents) so we cannot use them. Be
451 silent till this is over. Don't declick.
453 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
455 passthru_silence (start_sample, end_sample, nframes, 0);
458 /* we're really not rolling, so we're either delivery silence or actually
459 monitoring, both of which are safe to do while session_state_changing is true.
463 _disk_writer->check_record_status (start_sample, can_record);
467 MonitorState const s = monitoring_state ();
468 /* we are not rolling, so be silent even if we are monitoring disk, as there
469 will be no disk data coming in.
472 case MonitoringSilence:
478 case MonitoringInput:
486 //if we have an internal generator, let it play regardless of monitoring state
487 if (_have_internal_generator) {
491 /* if have_internal_generator, or .. */
495 if (_meter_point == MeterInput) {
496 /* still need input monitoring and metering */
498 bool const track_rec = _disk_writer->record_enabled ();
499 bool const auto_input = _session.config.get_auto_input ();
500 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
501 bool const tape_machine_mode = Config->get_tape_machine_mode ();
502 bool no_meter = false;
504 /* this needs a proper K-map
505 * and should be separated into a function similar to monitoring_state()
506 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
508 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
510 if (!auto_input && !track_rec) {
513 else if (tape_machine_mode && !track_rec && auto_input) {
516 else if (!software_monitor && tape_machine_mode && !track_rec) {
519 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
524 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
525 _meter->run (bufs, start_sample, end_sample, 1.0, nframes, true);
526 _input->process_input (boost::shared_ptr<Processor>(), start_sample, end_sample, _session.transport_speed(), nframes);
528 _input->process_input (_meter, start_sample, end_sample, _session.transport_speed(), nframes);
532 passthru_silence (start_sample, end_sample, nframes, 0);
536 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
538 fill_buffers_with_input (bufs, _input, nframes);
540 if (_meter_point == MeterInput) {
541 _meter->run (bufs, start_sample, end_sample, _session.transport_speed(), nframes, true);
544 passthru (bufs, start_sample, end_sample, nframes, false, true);
547 flush_processor_buffers_locked (nframes);
552 boost::shared_ptr<Playlist>
555 return _playlists[data_type()];
559 Track::request_input_monitoring (bool m)
561 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
562 AudioEngine::instance()->request_input_monitoring ((*i)->name(), m);
567 Track::ensure_input_monitoring (bool m)
569 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
570 AudioEngine::instance()->ensure_input_monitoring ((*i)->name(), m);
575 Track::destructive () const
577 return _disk_writer->destructive ();
580 list<boost::shared_ptr<Source> > &
581 Track::last_capture_sources ()
583 return _disk_writer->last_capture_sources ();
587 Track::update_latency_information ()
589 Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
590 samplecnt_t chain_latency = _input->latency ();
592 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
593 (*p)->set_input_latency (chain_latency);
594 chain_latency += (*p)->signal_latency ();
599 Track::steal_write_source_name()
601 return _disk_writer->steal_write_source_name ();
605 Track::reset_write_sources (bool r, bool force)
607 _disk_writer->reset_write_sources (r, force);
611 Track::playback_buffer_load () const
613 return _disk_reader->buffer_load ();
617 Track::capture_buffer_load () const
619 return _disk_writer->buffer_load ();
625 return _disk_reader->do_refill ();
629 Track::do_flush (RunContext c, bool force)
631 return _disk_writer->do_flush (c, force);
635 Track::set_pending_overwrite (bool o)
637 _disk_reader->set_pending_overwrite (o);
641 Track::seek (samplepos_t p, bool complete_refill)
643 if (_disk_reader->seek (p, complete_refill)) {
646 return _disk_writer->seek (p, complete_refill);
650 Track::can_internal_playback_seek (samplecnt_t p)
652 return _disk_reader->can_internal_playback_seek (p);
656 Track::internal_playback_seek (samplecnt_t p)
658 return _disk_reader->internal_playback_seek (p);
662 Track::non_realtime_locate (samplepos_t p)
664 Route::non_realtime_locate (p);
666 if (!is_private_route()) {
667 /* don't waste i/o cycles and butler calls
668 for private tracks (e.g.auditioner)
670 _disk_reader->non_realtime_locate (p);
671 _disk_writer->non_realtime_locate (p);
676 Track::non_realtime_speed_change ()
678 _disk_reader->non_realtime_speed_change ();
682 Track::overwrite_existing_buffers ()
684 return _disk_reader->overwrite_existing_buffers ();
688 Track::get_captured_samples (uint32_t n) const
690 return _disk_writer->get_captured_samples (n);
694 Track::set_loop (Location* l)
696 if (_disk_reader->set_loop (l)) {
699 return _disk_writer->set_loop (l);
703 Track::transport_looped (samplepos_t p)
705 return _disk_writer->transport_looped (p);
709 Track::realtime_speed_change ()
711 if (_disk_reader->realtime_speed_change ()) {
714 return _disk_writer->realtime_speed_change ();
718 Track::realtime_handle_transport_stopped ()
720 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
726 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
727 (*i)->realtime_handle_transport_stopped ();
732 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
734 _disk_writer->transport_stopped_wallclock (n, t, g);
738 Track::pending_overwrite () const
740 return _disk_reader->pending_overwrite ();
744 Track::prepare_to_stop (samplepos_t t, samplepos_t a)
746 _disk_writer->prepare_to_stop (t, a);
750 Track::set_slaved (bool s)
752 _disk_reader->set_slaved (s);
753 _disk_writer->set_slaved (s);
759 return _disk_reader->output_streams();
763 Track::get_capture_start_sample (uint32_t n) const
765 return _disk_writer->get_capture_start_sample (n);
769 Track::alignment_style () const
771 return _disk_writer->alignment_style ();
775 Track::alignment_choice () const
777 return _alignment_choice;
781 Track::current_capture_start () const
783 return _disk_writer->current_capture_start ();
787 Track::current_capture_end () const
789 return _disk_writer->current_capture_end ();
793 Track::playlist_modified ()
795 _disk_reader->playlist_modified ();
799 Track::find_and_use_playlist (DataType dt, PBD::ID const & id)
801 boost::shared_ptr<Playlist> playlist;
803 if ((playlist = _session.playlists->by_id (id)) == 0) {
808 error << string_compose(_("DiskIOProcessor: \"%1\" isn't an playlist"), id.to_s()) << endmsg;
812 return use_playlist (dt, playlist);
816 Track::use_playlist (DataType dt, boost::shared_ptr<Playlist> p)
820 if ((ret = _disk_reader->use_playlist (dt, p)) == 0) {
821 if ((ret = _disk_writer->use_playlist (dt, p)) == 0) {
822 p->set_orig_track_id (id());
834 Track::use_copy_playlist ()
836 assert (_playlists[data_type()]);
838 if (_playlists[data_type()] == 0) {
839 error << string_compose(_("DiskIOProcessor %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
844 boost::shared_ptr<Playlist> playlist;
846 newname = Playlist::bump_name (_playlists[data_type()]->name(), _session);
848 if ((playlist = PlaylistFactory::create (_playlists[data_type()], newname)) == 0) {
852 playlist->reset_shares();
854 return use_playlist (data_type(), playlist);
858 Track::use_new_playlist (DataType dt)
861 boost::shared_ptr<Playlist> playlist = _playlists[dt];
864 newname = Playlist::bump_name (playlist->name(), _session);
866 newname = Playlist::bump_name (_name, _session);
869 playlist = PlaylistFactory::create (dt, _session, newname, is_private_route());
875 return use_playlist (dt, playlist);
879 Track::set_align_choice (AlignChoice ac, bool force)
881 _alignment_choice = ac;
884 set_align_choice_from_io ();
887 _disk_writer->set_align_style (CaptureTime, force);
889 case UseExistingMaterial:
890 _disk_writer->set_align_style (ExistingMaterial, force);
896 Track::set_align_style (AlignStyle s, bool force)
898 _disk_writer->set_align_style (s, force);
902 Track::set_align_choice_from_io ()
904 bool have_physical = false;
908 vector<string> connections;
909 boost::shared_ptr<Port> p;
913 p = _input->nth (n++);
919 if (p->get_connections (connections) != 0) {
920 if (AudioEngine::instance()->port_is_physical (connections[0])) {
921 have_physical = true;
926 connections.clear ();
931 // compensate for latency when bouncing from master or mixbus.
932 // we need to use "ExistingMaterial" to pick up the master bus' latency
933 // see also Route::direct_feeds_according_to_reality
935 ios.push_back (_input);
936 if (_session.master_out() && ios.fed_by (_session.master_out()->output())) {
937 have_physical = true;
939 for (uint32_t n = 0; n < NUM_MIXBUSES && !have_physical; ++n) {
940 if (_session.get_mixbus (n) && ios.fed_by (_session.get_mixbus(n)->output())) {
941 have_physical = true;
947 _disk_writer->set_align_style (ExistingMaterial);
949 _disk_writer->set_align_style (CaptureTime);
954 Track::set_block_size (pframes_t n)
956 Route::set_block_size (n);
957 _disk_reader->set_block_size (n);
958 _disk_writer->set_block_size (n);
962 Track::adjust_playback_buffering ()
965 _disk_reader->adjust_buffering ();
970 Track::adjust_capture_buffering ()
973 _disk_writer->adjust_buffering ();
979 Track::maybe_declick (BufferSet& bufs, samplecnt_t nframes, int declick)
981 /* never declick if there is an internal generator - we just want it to
982 keep generating sound without interruption.
984 ditto if we are monitoring inputs.
987 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
992 declick = _pending_declick;
996 Amp::declick (bufs, nframes, declick);
1001 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
1003 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1004 (*i)->monitoring_changed ();
1009 Track::metering_state () const
1012 if (_session.transport_rolling ()) {
1013 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1014 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled());
1016 // track no_roll() always metering if
1017 rv = _meter_point == MeterInput;
1019 return rv ? MeteringInput : MeteringRoute;
1023 Track::set_processor_state (XMLNode const & node, XMLProperty const* prop, ProcessorList& new_order, bool& must_configure)
1025 if (Route::set_processor_state (node, prop, new_order, must_configure)) {
1029 cerr << name() << " looking for state for track procs, DR = " << _disk_reader << endl;
1031 if (prop->value() == "diskreader") {
1033 _disk_reader->set_state (node, Stateful::current_state_version);
1034 new_order.push_back (_disk_reader);
1037 } else if (prop->value() == "diskwriter") {
1039 _disk_writer->set_state (node, Stateful::current_state_version);
1040 new_order.push_back (_disk_writer);
1045 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
1050 Track::use_captured_sources (SourceList& srcs, CaptureInfos const & capture_info)
1056 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1057 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1060 use_captured_audio_sources (srcs, capture_info);
1064 use_captured_midi_sources (srcs, capture_info);
1069 Track::use_captured_midi_sources (SourceList& srcs, CaptureInfos const & capture_info)
1071 if (srcs.empty() || data_type() != DataType::MIDI) {
1075 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1076 boost::shared_ptr<Playlist> pl = _playlists[DataType::MIDI];
1077 boost::shared_ptr<MidiRegion> midi_region;
1078 CaptureInfos::const_iterator ci;
1084 samplecnt_t total_capture = 0;
1086 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1087 total_capture += (*ci)->samples;
1090 /* we will want to be able to keep (over)writing the source
1091 but we don't want it to be removable. this also differs
1092 from the audio situation, where the source at this point
1093 must be considered immutable. luckily, we can rely on
1094 MidiSource::mark_streaming_write_completed() to have
1095 already done the necessary work for that.
1098 string whole_file_region_name;
1099 whole_file_region_name = region_name_from_path (mfs->name(), true);
1101 /* Register a new region with the Session that
1102 describes the entire source. Do this first
1103 so that any sub-regions will obviously be
1104 children of this one (later!)
1110 plist.add (Properties::name, whole_file_region_name);
1111 plist.add (Properties::whole_file, true);
1112 plist.add (Properties::automatic, true);
1113 plist.add (Properties::start, 0);
1114 plist.add (Properties::length, total_capture);
1115 plist.add (Properties::layer, 0);
1117 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1119 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1120 midi_region->special_set_position (capture_info.front()->start);
1123 catch (failed_constructor& err) {
1124 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
1128 pl->clear_changes ();
1131 /* Session sample time of the initial capture in this pass, which is where the source starts */
1132 samplepos_t initial_capture = 0;
1133 if (!capture_info.empty()) {
1134 initial_capture = capture_info.front()->start;
1137 BeatsSamplesConverter converter (_session.tempo_map(), capture_info.front()->start);
1138 const samplepos_t preroll_off = _session.preroll_record_trim_len ();
1140 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1144 RegionFactory::region_name (region_name, mfs->name(), false);
1146 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1147 _name, (*ci)->start, (*ci)->samples, region_name));
1150 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->samples << " add a region\n";
1155 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1156 plist.add (Properties::start, (*ci)->start - initial_capture);
1157 plist.add (Properties::length, (*ci)->samples);
1158 plist.add (Properties::length_beats, converter.from((*ci)->samples).to_double());
1159 plist.add (Properties::name, region_name);
1161 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1162 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1163 if (preroll_off > 0) {
1164 midi_region->trim_front ((*ci)->start - initial_capture + preroll_off);
1168 catch (failed_constructor& err) {
1169 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1170 continue; /* XXX is this OK? */
1173 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1175 pl->add_region (midi_region, (*ci)->start + preroll_off, _disk_writer->non_layered());
1179 _session.add_command (new StatefulDiffCommand (pl));
1183 Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & capture_info)
1185 if (srcs.empty() || data_type() != DataType::AUDIO) {
1189 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1190 boost::shared_ptr<Playlist> pl = _playlists[DataType::AUDIO];
1191 boost::shared_ptr<AudioRegion> region;
1197 /* destructive tracks have a single, never changing region */
1199 if (destructive()) {
1201 /* send a signal that any UI can pick up to do the right thing. there is
1202 a small problem here in that a UI may need the peak data to be ready
1203 for the data that was recorded and this isn't interlocked with that
1204 process. this problem is deferred to the UI.
1207 pl->LayeringChanged(); // XXX this may not get the UI to do the right thing
1211 string whole_file_region_name;
1212 whole_file_region_name = region_name_from_path (afs->name(), true);
1214 /* Register a new region with the Session that
1215 describes the entire source. Do this first
1216 so that any sub-regions will obviously be
1217 children of this one (later!)
1223 plist.add (Properties::start, afs->last_capture_start_sample());
1224 plist.add (Properties::length, afs->length(0));
1225 plist.add (Properties::name, whole_file_region_name);
1226 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1227 rx->set_automatic (true);
1228 rx->set_whole_file (true);
1230 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1231 region->special_set_position (afs->natural_position());
1235 catch (failed_constructor& err) {
1236 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1240 pl->clear_changes ();
1241 pl->set_capture_insertion_in_progress (true);
1244 const samplepos_t preroll_off = _session.preroll_record_trim_len ();
1245 samplecnt_t buffer_position = afs->last_capture_start_sample ();
1246 CaptureInfos::const_iterator ci;
1248 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1252 RegionFactory::region_name (region_name, whole_file_region_name, false);
1254 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture bufpos %5 start @ %2 length %3 add new region %4\n",
1255 _name, (*ci)->start, (*ci)->samples, region_name, buffer_position));
1261 plist.add (Properties::start, buffer_position);
1262 plist.add (Properties::length, (*ci)->samples);
1263 plist.add (Properties::name, region_name);
1265 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1266 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1267 if (preroll_off > 0) {
1268 region->trim_front (buffer_position + preroll_off);
1272 catch (failed_constructor& err) {
1273 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1274 continue; /* XXX is this OK? */
1277 pl->add_region (region, (*ci)->start + preroll_off, 1, _disk_writer->non_layered());
1278 pl->set_layer (region, DBL_MAX);
1280 buffer_position += (*ci)->samples;
1284 pl->set_capture_insertion_in_progress (false);
1285 _session.add_command (new StatefulDiffCommand (pl));