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());
830 _session.set_dirty ();
831 PlaylistChanged (); /* EMIT SIGNAL */
837 Track::use_copy_playlist ()
839 assert (_playlists[data_type()]);
841 if (_playlists[data_type()] == 0) {
842 error << string_compose(_("DiskIOProcessor %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
847 boost::shared_ptr<Playlist> playlist;
849 newname = Playlist::bump_name (_playlists[data_type()]->name(), _session);
851 if ((playlist = PlaylistFactory::create (_playlists[data_type()], newname)) == 0) {
855 playlist->reset_shares();
857 return use_playlist (data_type(), playlist);
861 Track::use_new_playlist (DataType dt)
864 boost::shared_ptr<Playlist> playlist = _playlists[dt];
867 newname = Playlist::bump_name (playlist->name(), _session);
869 newname = Playlist::bump_name (_name, _session);
872 playlist = PlaylistFactory::create (dt, _session, newname, is_private_route());
878 return use_playlist (dt, playlist);
882 Track::set_align_choice (AlignChoice ac, bool force)
884 _alignment_choice = ac;
887 set_align_choice_from_io ();
890 _disk_writer->set_align_style (CaptureTime, force);
892 case UseExistingMaterial:
893 _disk_writer->set_align_style (ExistingMaterial, force);
899 Track::set_align_style (AlignStyle s, bool force)
901 _disk_writer->set_align_style (s, force);
905 Track::set_align_choice_from_io ()
907 bool have_physical = false;
911 vector<string> connections;
912 boost::shared_ptr<Port> p;
916 p = _input->nth (n++);
922 if (p->get_connections (connections) != 0) {
923 if (AudioEngine::instance()->port_is_physical (connections[0])) {
924 have_physical = true;
929 connections.clear ();
934 // compensate for latency when bouncing from master or mixbus.
935 // we need to use "ExistingMaterial" to pick up the master bus' latency
936 // see also Route::direct_feeds_according_to_reality
938 ios.push_back (_input);
939 if (_session.master_out() && ios.fed_by (_session.master_out()->output())) {
940 have_physical = true;
942 for (uint32_t n = 0; n < NUM_MIXBUSES && !have_physical; ++n) {
943 if (_session.get_mixbus (n) && ios.fed_by (_session.get_mixbus(n)->output())) {
944 have_physical = true;
950 _disk_writer->set_align_style (ExistingMaterial);
952 _disk_writer->set_align_style (CaptureTime);
957 Track::set_block_size (pframes_t n)
959 Route::set_block_size (n);
960 _disk_reader->set_block_size (n);
961 _disk_writer->set_block_size (n);
965 Track::adjust_playback_buffering ()
968 _disk_reader->adjust_buffering ();
973 Track::adjust_capture_buffering ()
976 _disk_writer->adjust_buffering ();
982 Track::maybe_declick (BufferSet& bufs, samplecnt_t nframes, int declick)
984 /* never declick if there is an internal generator - we just want it to
985 keep generating sound without interruption.
987 ditto if we are monitoring inputs.
990 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
995 declick = _pending_declick;
999 Amp::declick (bufs, nframes, declick);
1004 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
1006 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1007 (*i)->monitoring_changed ();
1012 Track::metering_state () const
1015 if (_session.transport_rolling ()) {
1016 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1017 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled());
1019 // track no_roll() always metering if
1020 rv = _meter_point == MeterInput;
1022 return rv ? MeteringInput : MeteringRoute;
1026 Track::set_processor_state (XMLNode const & node, XMLProperty const* prop, ProcessorList& new_order, bool& must_configure)
1028 if (Route::set_processor_state (node, prop, new_order, must_configure)) {
1032 cerr << name() << " looking for state for track procs, DR = " << _disk_reader << endl;
1034 if (prop->value() == "diskreader") {
1036 _disk_reader->set_state (node, Stateful::current_state_version);
1037 new_order.push_back (_disk_reader);
1040 } else if (prop->value() == "diskwriter") {
1042 _disk_writer->set_state (node, Stateful::current_state_version);
1043 new_order.push_back (_disk_writer);
1048 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
1053 Track::use_captured_sources (SourceList& srcs, CaptureInfos const & capture_info)
1059 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1060 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1063 use_captured_audio_sources (srcs, capture_info);
1067 use_captured_midi_sources (srcs, capture_info);
1072 Track::use_captured_midi_sources (SourceList& srcs, CaptureInfos const & capture_info)
1074 if (srcs.empty() || data_type() != DataType::MIDI) {
1078 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1079 boost::shared_ptr<Playlist> pl = _playlists[DataType::MIDI];
1080 boost::shared_ptr<MidiRegion> midi_region;
1081 CaptureInfos::const_iterator ci;
1087 samplecnt_t total_capture = 0;
1089 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1090 total_capture += (*ci)->samples;
1093 /* we will want to be able to keep (over)writing the source
1094 but we don't want it to be removable. this also differs
1095 from the audio situation, where the source at this point
1096 must be considered immutable. luckily, we can rely on
1097 MidiSource::mark_streaming_write_completed() to have
1098 already done the necessary work for that.
1101 string whole_file_region_name;
1102 whole_file_region_name = region_name_from_path (mfs->name(), true);
1104 /* Register a new region with the Session that
1105 describes the entire source. Do this first
1106 so that any sub-regions will obviously be
1107 children of this one (later!)
1113 plist.add (Properties::name, whole_file_region_name);
1114 plist.add (Properties::whole_file, true);
1115 plist.add (Properties::automatic, true);
1116 plist.add (Properties::start, 0);
1117 plist.add (Properties::length, total_capture);
1118 plist.add (Properties::layer, 0);
1120 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1122 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1123 midi_region->special_set_position (capture_info.front()->start);
1126 catch (failed_constructor& err) {
1127 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
1131 pl->clear_changes ();
1134 /* Session sample time of the initial capture in this pass, which is where the source starts */
1135 samplepos_t initial_capture = 0;
1136 if (!capture_info.empty()) {
1137 initial_capture = capture_info.front()->start;
1140 BeatsSamplesConverter converter (_session.tempo_map(), capture_info.front()->start);
1141 const samplepos_t preroll_off = _session.preroll_record_trim_len ();
1143 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1147 RegionFactory::region_name (region_name, mfs->name(), false);
1149 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1150 _name, (*ci)->start, (*ci)->samples, region_name));
1153 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->samples << " add a region\n";
1158 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1159 plist.add (Properties::start, (*ci)->start - initial_capture);
1160 plist.add (Properties::length, (*ci)->samples);
1161 plist.add (Properties::length_beats, converter.from((*ci)->samples).to_double());
1162 plist.add (Properties::name, region_name);
1164 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1165 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1166 if (preroll_off > 0) {
1167 midi_region->trim_front ((*ci)->start - initial_capture + preroll_off);
1171 catch (failed_constructor& err) {
1172 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1173 continue; /* XXX is this OK? */
1176 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1178 pl->add_region (midi_region, (*ci)->start + preroll_off, _disk_writer->non_layered());
1182 _session.add_command (new StatefulDiffCommand (pl));
1186 Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & capture_info)
1188 if (srcs.empty() || data_type() != DataType::AUDIO) {
1192 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1193 boost::shared_ptr<Playlist> pl = _playlists[DataType::AUDIO];
1194 boost::shared_ptr<AudioRegion> region;
1200 /* destructive tracks have a single, never changing region */
1202 if (destructive()) {
1204 /* send a signal that any UI can pick up to do the right thing. there is
1205 a small problem here in that a UI may need the peak data to be ready
1206 for the data that was recorded and this isn't interlocked with that
1207 process. this problem is deferred to the UI.
1210 pl->LayeringChanged(); // XXX this may not get the UI to do the right thing
1214 string whole_file_region_name;
1215 whole_file_region_name = region_name_from_path (afs->name(), true);
1217 /* Register a new region with the Session that
1218 describes the entire source. Do this first
1219 so that any sub-regions will obviously be
1220 children of this one (later!)
1226 plist.add (Properties::start, afs->last_capture_start_sample());
1227 plist.add (Properties::length, afs->length(0));
1228 plist.add (Properties::name, whole_file_region_name);
1229 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1230 rx->set_automatic (true);
1231 rx->set_whole_file (true);
1233 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1234 region->special_set_position (afs->natural_position());
1238 catch (failed_constructor& err) {
1239 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1243 pl->clear_changes ();
1244 pl->set_capture_insertion_in_progress (true);
1247 const samplepos_t preroll_off = _session.preroll_record_trim_len ();
1248 samplecnt_t buffer_position = afs->last_capture_start_sample ();
1249 CaptureInfos::const_iterator ci;
1251 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1255 RegionFactory::region_name (region_name, whole_file_region_name, false);
1257 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture bufpos %5 start @ %2 length %3 add new region %4\n",
1258 _name, (*ci)->start, (*ci)->samples, region_name, buffer_position));
1264 plist.add (Properties::start, buffer_position);
1265 plist.add (Properties::length, (*ci)->samples);
1266 plist.add (Properties::name, region_name);
1268 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1269 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1270 if (preroll_off > 0) {
1271 region->trim_front (buffer_position + preroll_off);
1275 catch (failed_constructor& err) {
1276 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1277 continue; /* XXX is this OK? */
1280 pl->add_region (region, (*ci)->start + preroll_off, 1, _disk_writer->non_layered());
1281 pl->set_layer (region, DBL_MAX);
1283 buffer_position += (*ci)->samples;
1287 pl->set_capture_insertion_in_progress (false);
1288 _session.add_command (new StatefulDiffCommand (pl));