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 use_new_playlist (data_type());
106 boost::shared_ptr<Route> rp (boost::dynamic_pointer_cast<Route> (shared_from_this()));
107 boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
109 _record_enable_control.reset (new RecordEnableControl (_session, EventTypeMap::instance().to_symbol (RecEnableAutomation), *this));
110 add_control (_record_enable_control);
112 _record_safe_control.reset (new RecordSafeControl (_session, EventTypeMap::instance().to_symbol (RecSafeAutomation), *this));
113 add_control (_record_safe_control);
115 _monitoring_control.reset (new MonitorControl (_session, EventTypeMap::instance().to_symbol (MonitoringAutomation), *this));
116 add_control (_monitoring_control);
118 _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
120 _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2));
121 _record_safe_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_safe_changed, this, _1, _2));
122 _record_enable_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_enable_changed, this, _1, _2));
124 _input->changed.connect_same_thread (*this, boost::bind (&Track::input_changed, this));
130 Track::input_changed ()
132 if (_disk_writer && _alignment_choice == Automatic) {
133 set_align_choice_from_io ();
144 Track::state (bool full)
146 XMLNode& root (Route::state (full));
148 if (_playlists[DataType::AUDIO]) {
149 root.set_property (X_("audio-playlist"), _playlists[DataType::AUDIO]->id().to_s());
152 if (_playlists[DataType::MIDI]) {
153 root.set_property (X_("midi-playlist"), _playlists[DataType::MIDI]->id().to_s());
156 root.add_child_nocopy (_monitoring_control->get_state ());
157 root.add_child_nocopy (_record_safe_control->get_state ());
158 root.add_child_nocopy (_record_enable_control->get_state ());
160 root.set_property (X_("saved-meter-point"), _saved_meter_point);
161 root.set_property (X_("alignment-choice"), _alignment_choice);
167 Track::set_state (const XMLNode& node, int version)
169 if (Route::set_state (node, version)) {
175 if (version >= 3000 && version < 4000) {
176 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
177 /* XXX if we remember anything from stored DiskStream
178 state (older Ardour versions) that is needed by a
179 DiskReader or DiskWriter, we should cook up a new
180 XMLNode here, populate it with that information
181 (child nodes, properties, etc.) and then call
182 ::set_state() on the writer/reader.
184 But at present (June 2017), there's no such state.
189 std::string playlist_id;
191 if (node.get_property (X_("audio-playlist"), playlist_id)) {
192 find_and_use_playlist (DataType::AUDIO, PBD::ID (playlist_id));
195 if (node.get_property (X_("midi-playlist"), playlist_id)) {
196 find_and_use_playlist (DataType::MIDI, PBD::ID (playlist_id));
199 XMLNodeList nlist = node.children();
200 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
203 if (child->name() == Controllable::xml_node_name) {
205 if (!child->get_property ("name", name)) {
209 if (name == _record_enable_control->name()) {
210 _record_enable_control->set_state (*child, version);
211 } else if (name == _record_safe_control->name()) {
212 _record_safe_control->set_state (*child, version);
213 } else if (name == _monitoring_control->name()) {
214 _monitoring_control->set_state (*child, version);
219 if (!node.get_property (X_("saved-meter-point"), _saved_meter_point)) {
220 _saved_meter_point = _meter_point;
226 if (node.get_property (X_("alignment-choice"), ac)) {
227 set_align_choice (ac, true);
234 Track::get_template ()
236 return state (false);
239 Track::FreezeRecord::~FreezeRecord ()
241 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
247 Track::freeze_state() const
249 return _freeze_record.state;
255 bool will_record = true;
256 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
265 Track::prep_record_enabled (bool yn)
267 if (yn && _record_safe_control->get_value()) {
271 if (!can_be_record_enabled()) {
275 /* keep track of the meter point as it was before we rec-enabled */
276 if (!_disk_writer->record_enabled()) {
277 _saved_meter_point = _meter_point;
283 will_follow = _disk_writer->prep_record_enable ();
285 will_follow = _disk_writer->prep_record_disable ();
290 if (_meter_point != MeterCustom) {
291 set_meter_point (MeterInput);
294 set_meter_point (_saved_meter_point);
302 Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
304 _disk_writer->set_record_enabled (_record_enable_control->get_value());
308 Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
310 _disk_writer->set_record_safe (_record_safe_control->get_value());
314 Track::can_be_record_safe ()
316 return !_record_enable_control->get_value() && _disk_writer && _session.writable() && (_freeze_record.state != Frozen);
320 Track::can_be_record_enabled ()
322 return !_record_safe_control->get_value() && _disk_writer && !_disk_writer->record_safe() && _session.writable() && (_freeze_record.state != Frozen);
326 Track::parameter_changed (string const & p)
328 if (p == "track-name-number") {
329 resync_track_name ();
331 else if (p == "track-name-take") {
332 resync_track_name ();
334 else if (p == "take-name") {
335 if (_session.config.get_track_name_take()) {
336 resync_track_name ();
342 Track::resync_track_name ()
348 Track::set_name (const string& str)
356 if (_record_enable_control->get_value()) {
357 /* when re-arm'ed the file (named after the track) is already ready to rolll */
361 string diskstream_name = "";
362 if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
363 // Note: any text is fine, legalize_for_path() fixes this later
364 diskstream_name += _session.config.get_take_name ();
365 diskstream_name += "_";
367 const int64_t tracknumber = track_number();
368 if (tracknumber > 0 && _session.config.get_track_name_number()) {
369 char num[64], fmt[10];
370 snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
371 snprintf(num, sizeof(num), fmt, tracknumber);
372 diskstream_name += num;
373 diskstream_name += "_";
375 diskstream_name += str;
377 if (diskstream_name == _diskstream_name) {
380 _diskstream_name = diskstream_name;
382 _disk_writer->set_write_source_name (diskstream_name);
384 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
386 if (_playlists[data_type()]->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
387 /* Only rename the diskstream (and therefore the playlist) if
388 a) the playlist has never had a region added to it and
389 b) there is only one playlist for this track.
391 If (a) is not followed, people can get confused if, say,
392 they have notes about a playlist with a given name and then
393 it changes (see mantis #4759).
395 If (b) is not followed, we rename the current playlist and not
396 the other ones, which is a bit confusing (see mantis #4977).
398 _disk_reader->set_name (str);
399 _disk_writer->set_name (str);
402 for (uint32_t n = 0; n < DataType::num_types; ++n) {
404 _playlists[n]->set_name (str);
408 /* save state so that the statefile fully reflects any filename changes */
410 if ((ret = Route::set_name (str)) == 0) {
411 _session.save_state ("");
418 Track::no_roll (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool session_state_changing)
420 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
426 bool can_record = _session.actively_recording ();
428 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
430 if (n_outputs().n_total() == 0 && !ARDOUR::Profile->get_mixbus()) {
431 //Note: Mixbus has its own output mechanism, so we should operate even if no explicit outputs are assigned
435 /* not active ... do the minimum possible by just outputting silence */
439 if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled())) {
445 if (session_state_changing) {
446 if (_session.transport_speed() != 0.0f) {
447 /* we're rolling but some state is changing (e.g. our
448 disk reader contents) so we cannot use them. Be
449 silent till this is over. Don't declick.
451 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
453 passthru_silence (start_sample, end_sample, nframes, 0);
456 /* we're really not rolling, so we're either delivery silence or actually
457 monitoring, both of which are safe to do while session_state_changing is true.
461 _disk_writer->check_record_status (start_sample, can_record);
465 MonitorState const s = monitoring_state ();
466 /* we are not rolling, so be silent even if we are monitoring disk, as there
467 will be no disk data coming in.
470 case MonitoringSilence:
476 case MonitoringInput:
484 //if we have an internal generator, let it play regardless of monitoring state
485 if (_have_internal_generator) {
489 /* if have_internal_generator, or .. */
493 if (_meter_point == MeterInput) {
494 /* still need input monitoring and metering */
496 bool const track_rec = _disk_writer->record_enabled ();
497 bool const auto_input = _session.config.get_auto_input ();
498 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
499 bool const tape_machine_mode = Config->get_tape_machine_mode ();
500 bool no_meter = false;
502 /* this needs a proper K-map
503 * and should be separated into a function similar to monitoring_state()
504 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
506 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
508 if (!auto_input && !track_rec) {
511 else if (tape_machine_mode && !track_rec && auto_input) {
514 else if (!software_monitor && tape_machine_mode && !track_rec) {
517 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
522 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
523 _meter->run (bufs, start_sample, end_sample, 1.0, nframes, true);
524 _input->process_input (boost::shared_ptr<Processor>(), start_sample, end_sample, _session.transport_speed(), nframes);
526 _input->process_input (_meter, start_sample, end_sample, _session.transport_speed(), nframes);
530 passthru_silence (start_sample, end_sample, nframes, 0);
534 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
536 fill_buffers_with_input (bufs, _input, nframes);
538 if (_meter_point == MeterInput) {
539 _meter->run (bufs, start_sample, end_sample, _session.transport_speed(), nframes, true);
542 passthru (bufs, start_sample, end_sample, nframes, false, true);
545 flush_processor_buffers_locked (nframes);
550 boost::shared_ptr<Playlist>
553 return _playlists[data_type()];
557 Track::request_input_monitoring (bool m)
559 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
560 AudioEngine::instance()->request_input_monitoring ((*i)->name(), m);
565 Track::ensure_input_monitoring (bool m)
567 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
568 AudioEngine::instance()->ensure_input_monitoring ((*i)->name(), m);
573 Track::destructive () const
575 return _disk_writer->destructive ();
578 list<boost::shared_ptr<Source> > &
579 Track::last_capture_sources ()
581 return _disk_writer->last_capture_sources ();
585 Track::update_latency_information ()
587 Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
588 samplecnt_t chain_latency = _input->latency ();
590 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
591 (*p)->set_input_latency (chain_latency);
592 chain_latency += (*p)->signal_latency ();
597 Track::steal_write_source_name()
599 return _disk_writer->steal_write_source_name ();
603 Track::reset_write_sources (bool r, bool force)
605 _disk_writer->reset_write_sources (r, force);
609 Track::playback_buffer_load () const
611 return _disk_reader->buffer_load ();
615 Track::capture_buffer_load () const
617 return _disk_writer->buffer_load ();
623 return _disk_reader->do_refill ();
627 Track::do_flush (RunContext c, bool force)
629 return _disk_writer->do_flush (c, force);
633 Track::set_pending_overwrite (bool o)
635 _disk_reader->set_pending_overwrite (o);
639 Track::seek (samplepos_t p, bool complete_refill)
641 if (_disk_reader->seek (p, complete_refill)) {
644 return _disk_writer->seek (p, complete_refill);
648 Track::can_internal_playback_seek (samplecnt_t p)
650 return _disk_reader->can_internal_playback_seek (p);
654 Track::internal_playback_seek (samplecnt_t p)
656 return _disk_reader->internal_playback_seek (p);
660 Track::non_realtime_locate (samplepos_t p)
662 Route::non_realtime_locate (p);
664 if (!is_private_route()) {
665 /* don't waste i/o cycles and butler calls
666 for private tracks (e.g.auditioner)
668 _disk_reader->non_realtime_locate (p);
669 _disk_writer->non_realtime_locate (p);
674 Track::non_realtime_speed_change ()
676 _disk_reader->non_realtime_speed_change ();
680 Track::overwrite_existing_buffers ()
682 return _disk_reader->overwrite_existing_buffers ();
686 Track::get_captured_samples (uint32_t n) const
688 return _disk_writer->get_captured_samples (n);
692 Track::set_loop (Location* l)
694 if (_disk_reader->set_loop (l)) {
697 return _disk_writer->set_loop (l);
701 Track::transport_looped (samplepos_t p)
703 return _disk_writer->transport_looped (p);
707 Track::realtime_speed_change ()
709 if (_disk_reader->realtime_speed_change ()) {
712 return _disk_writer->realtime_speed_change ();
716 Track::realtime_handle_transport_stopped ()
718 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
724 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
725 (*i)->realtime_handle_transport_stopped ();
730 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
732 _disk_writer->transport_stopped_wallclock (n, t, g);
736 Track::pending_overwrite () const
738 return _disk_reader->pending_overwrite ();
742 Track::prepare_to_stop (samplepos_t t, samplepos_t a)
744 _disk_writer->prepare_to_stop (t, a);
748 Track::set_slaved (bool s)
750 _disk_reader->set_slaved (s);
751 _disk_writer->set_slaved (s);
757 return _disk_reader->output_streams();
761 Track::get_capture_start_sample (uint32_t n) const
763 return _disk_writer->get_capture_start_sample (n);
767 Track::alignment_style () const
769 return _disk_writer->alignment_style ();
773 Track::alignment_choice () const
775 return _disk_writer->alignment_choice ();
779 Track::current_capture_start () const
781 return _disk_writer->current_capture_start ();
785 Track::current_capture_end () const
787 return _disk_writer->current_capture_end ();
791 Track::playlist_modified ()
793 _disk_reader->playlist_modified ();
797 Track::find_and_use_playlist (DataType dt, PBD::ID const & id)
799 boost::shared_ptr<Playlist> playlist;
801 if ((playlist = _session.playlists->by_id (id)) == 0) {
806 error << string_compose(_("DiskIOProcessor: \"%1\" isn't an playlist"), id.to_s()) << endmsg;
810 return use_playlist (dt, playlist);
814 Track::use_playlist (DataType dt, boost::shared_ptr<Playlist> p)
818 if ((ret = _disk_reader->use_playlist (dt, p)) == 0) {
819 if ((ret = _disk_writer->use_playlist (dt, p)) == 0) {
820 p->set_orig_track_id (id());
832 Track::use_copy_playlist ()
834 assert (_playlists[data_type()]);
836 if (_playlists[data_type()] == 0) {
837 error << string_compose(_("DiskIOProcessor %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
842 boost::shared_ptr<Playlist> playlist;
844 newname = Playlist::bump_name (_playlists[data_type()]->name(), _session);
846 if ((playlist = PlaylistFactory::create (_playlists[data_type()], newname)) == 0) {
850 playlist->reset_shares();
852 return use_playlist (data_type(), playlist);
856 Track::use_new_playlist (DataType dt)
859 boost::shared_ptr<Playlist> playlist = _playlists[dt];
862 newname = Playlist::bump_name (playlist->name(), _session);
864 newname = Playlist::bump_name (_name, _session);
867 playlist = PlaylistFactory::create (dt, _session, newname, is_private_route());
873 return use_playlist (dt, playlist);
877 Track::set_align_choice (AlignChoice ac, bool force)
881 _alignment_choice = Automatic;
882 set_align_choice_from_io ();
888 _disk_writer->set_align_choice (ac, force);
889 _alignment_choice = ac;
893 Track::set_align_style (AlignStyle s, bool force)
895 _disk_writer->set_align_style (s, force);
899 Track::set_align_choice_from_io ()
901 bool have_physical = false;
905 vector<string> connections;
906 boost::shared_ptr<Port> p;
910 p = _input->nth (n++);
916 if (p->get_connections (connections) != 0) {
917 if (AudioEngine::instance()->port_is_physical (connections[0])) {
918 have_physical = true;
923 connections.clear ();
928 // compensate for latency when bouncing from master or mixbus.
929 // we need to use "ExistingMaterial" to pick up the master bus' latency
930 // see also Route::direct_feeds_according_to_reality
932 ios.push_back (_input);
933 if (_session.master_out() && ios.fed_by (_session.master_out()->output())) {
934 have_physical = true;
936 for (uint32_t n = 0; n < NUM_MIXBUSES && !have_physical; ++n) {
937 if (_session.get_mixbus (n) && ios.fed_by (_session.get_mixbus(n)->output())) {
938 have_physical = true;
944 _disk_writer->set_align_style (ExistingMaterial);
946 _disk_writer->set_align_style (CaptureTime);
951 Track::set_block_size (pframes_t n)
953 Route::set_block_size (n);
954 _disk_reader->set_block_size (n);
955 _disk_writer->set_block_size (n);
959 Track::adjust_playback_buffering ()
962 _disk_reader->adjust_buffering ();
967 Track::adjust_capture_buffering ()
970 _disk_writer->adjust_buffering ();
976 Track::maybe_declick (BufferSet& bufs, samplecnt_t nframes, int declick)
978 /* never declick if there is an internal generator - we just want it to
979 keep generating sound without interruption.
981 ditto if we are monitoring inputs.
984 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
989 declick = _pending_declick;
993 Amp::declick (bufs, nframes, declick);
998 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
1000 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1001 (*i)->monitoring_changed ();
1006 Track::metering_state () const
1009 if (_session.transport_rolling ()) {
1010 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1011 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled());
1013 // track no_roll() always metering if
1014 rv = _meter_point == MeterInput;
1016 return rv ? MeteringInput : MeteringRoute;
1020 Track::set_processor_state (XMLNode const & node, XMLProperty const* prop, ProcessorList& new_order, bool& must_configure)
1022 if (Route::set_processor_state (node, prop, new_order, must_configure)) {
1026 cerr << name() << " looking for state for track procs, DR = " << _disk_reader << endl;
1028 if (prop->value() == "diskreader") {
1030 _disk_reader->set_state (node, Stateful::current_state_version);
1031 new_order.push_back (_disk_reader);
1034 } else if (prop->value() == "diskwriter") {
1036 _disk_writer->set_state (node, Stateful::current_state_version);
1037 new_order.push_back (_disk_writer);
1042 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
1047 Track::use_captured_sources (SourceList& srcs, CaptureInfos const & capture_info)
1053 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1054 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1057 use_captured_audio_sources (srcs, capture_info);
1061 use_captured_midi_sources (srcs, capture_info);
1066 Track::use_captured_midi_sources (SourceList& srcs, CaptureInfos const & capture_info)
1068 if (srcs.empty() || data_type() != DataType::MIDI) {
1072 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1073 boost::shared_ptr<Playlist> pl = _playlists[DataType::MIDI];
1074 boost::shared_ptr<MidiRegion> midi_region;
1075 CaptureInfos::const_iterator ci;
1081 samplecnt_t total_capture = 0;
1083 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1084 total_capture += (*ci)->samples;
1087 /* we will want to be able to keep (over)writing the source
1088 but we don't want it to be removable. this also differs
1089 from the audio situation, where the source at this point
1090 must be considered immutable. luckily, we can rely on
1091 MidiSource::mark_streaming_write_completed() to have
1092 already done the necessary work for that.
1095 string whole_file_region_name;
1096 whole_file_region_name = region_name_from_path (mfs->name(), true);
1098 /* Register a new region with the Session that
1099 describes the entire source. Do this first
1100 so that any sub-regions will obviously be
1101 children of this one (later!)
1107 plist.add (Properties::name, whole_file_region_name);
1108 plist.add (Properties::whole_file, true);
1109 plist.add (Properties::automatic, true);
1110 plist.add (Properties::start, 0);
1111 plist.add (Properties::length, total_capture);
1112 plist.add (Properties::layer, 0);
1114 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1116 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1117 midi_region->special_set_position (capture_info.front()->start);
1120 catch (failed_constructor& err) {
1121 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
1125 pl->clear_changes ();
1128 /* Session sample time of the initial capture in this pass, which is where the source starts */
1129 samplepos_t initial_capture = 0;
1130 if (!capture_info.empty()) {
1131 initial_capture = capture_info.front()->start;
1134 BeatsSamplesConverter converter (_session.tempo_map(), capture_info.front()->start);
1135 const samplepos_t preroll_off = _session.preroll_record_trim_len ();
1137 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1141 RegionFactory::region_name (region_name, mfs->name(), false);
1143 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1144 _name, (*ci)->start, (*ci)->samples, region_name));
1147 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->samples << " add a region\n";
1152 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1153 plist.add (Properties::start, (*ci)->start - initial_capture);
1154 plist.add (Properties::length, (*ci)->samples);
1155 plist.add (Properties::length_beats, converter.from((*ci)->samples).to_double());
1156 plist.add (Properties::name, region_name);
1158 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1159 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1160 if (preroll_off > 0) {
1161 midi_region->trim_front ((*ci)->start - initial_capture + preroll_off);
1165 catch (failed_constructor& err) {
1166 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1167 continue; /* XXX is this OK? */
1170 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1172 pl->add_region (midi_region, (*ci)->start + preroll_off, _disk_writer->non_layered());
1176 _session.add_command (new StatefulDiffCommand (pl));
1180 Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & capture_info)
1182 if (srcs.empty() || data_type() != DataType::AUDIO) {
1186 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1187 boost::shared_ptr<Playlist> pl = _playlists[DataType::AUDIO];
1188 boost::shared_ptr<AudioRegion> region;
1194 /* destructive tracks have a single, never changing region */
1196 if (destructive()) {
1198 /* send a signal that any UI can pick up to do the right thing. there is
1199 a small problem here in that a UI may need the peak data to be ready
1200 for the data that was recorded and this isn't interlocked with that
1201 process. this problem is deferred to the UI.
1204 pl->LayeringChanged(); // XXX this may not get the UI to do the right thing
1208 string whole_file_region_name;
1209 whole_file_region_name = region_name_from_path (afs->name(), true);
1211 /* Register a new region with the Session that
1212 describes the entire source. Do this first
1213 so that any sub-regions will obviously be
1214 children of this one (later!)
1220 plist.add (Properties::start, afs->last_capture_start_sample());
1221 plist.add (Properties::length, afs->length(0));
1222 plist.add (Properties::name, whole_file_region_name);
1223 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1224 rx->set_automatic (true);
1225 rx->set_whole_file (true);
1227 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1228 region->special_set_position (afs->natural_position());
1232 catch (failed_constructor& err) {
1233 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1237 pl->clear_changes ();
1238 pl->set_capture_insertion_in_progress (true);
1241 const samplepos_t preroll_off = _session.preroll_record_trim_len ();
1242 samplecnt_t buffer_position = afs->last_capture_start_sample ();
1243 CaptureInfos::const_iterator ci;
1245 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1249 RegionFactory::region_name (region_name, whole_file_region_name, false);
1251 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture bufpos %5 start @ %2 length %3 add new region %4\n",
1252 _name, (*ci)->start, (*ci)->samples, region_name, buffer_position));
1258 plist.add (Properties::start, buffer_position);
1259 plist.add (Properties::length, (*ci)->samples);
1260 plist.add (Properties::name, region_name);
1262 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1263 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1264 if (preroll_off > 0) {
1265 region->trim_front (buffer_position + preroll_off);
1269 catch (failed_constructor& err) {
1270 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1271 continue; /* XXX is this OK? */
1274 pl->add_region (region, (*ci)->start + preroll_off, 1, _disk_writer->non_layered());
1275 pl->set_layer (region, DBL_MAX);
1277 buffer_position += (*ci)->samples;
1281 pl->set_capture_insertion_in_progress (false);
1282 _session.add_command (new StatefulDiffCommand (pl));