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::set_latency_compensation (samplecnt_t longest_session_latency)
420 Route::set_latency_compensation (longest_session_latency);
421 _disk_reader->set_roll_delay (_roll_delay);
425 Track::no_roll (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool session_state_changing)
427 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
433 bool can_record = _session.actively_recording ();
435 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
437 if (n_outputs().n_total() == 0 && !ARDOUR::Profile->get_mixbus()) {
438 //Note: Mixbus has its own output mechanism, so we should operate even if no explicit outputs are assigned
442 /* not active ... do the minimum possible by just outputting silence */
446 if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled())) {
452 if (session_state_changing) {
453 if (_session.transport_speed() != 0.0f) {
454 /* we're rolling but some state is changing (e.g. our
455 disk reader contents) so we cannot use them. Be
456 silent till this is over. Don't declick.
458 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
460 passthru_silence (start_sample, end_sample, nframes, 0);
463 /* we're really not rolling, so we're either delivery silence or actually
464 monitoring, both of which are safe to do while session_state_changing is true.
468 _disk_writer->check_record_status (start_sample, can_record);
472 MonitorState const s = monitoring_state ();
473 /* we are not rolling, so be silent even if we are monitoring disk, as there
474 will be no disk data coming in.
477 case MonitoringSilence:
483 case MonitoringInput:
491 //if we have an internal generator, let it play regardless of monitoring state
492 if (_have_internal_generator) {
496 _amp->apply_gain_automation (false);
498 /* if have_internal_generator, or .. */
502 if (_meter_point == MeterInput) {
503 /* still need input monitoring and metering */
505 bool const track_rec = _disk_writer->record_enabled ();
506 bool const auto_input = _session.config.get_auto_input ();
507 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
508 bool const tape_machine_mode = Config->get_tape_machine_mode ();
509 bool no_meter = false;
511 /* this needs a proper K-map
512 * and should be separated into a function similar to monitoring_state()
513 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
515 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
517 if (!auto_input && !track_rec) {
520 else if (tape_machine_mode && !track_rec && auto_input) {
523 else if (!software_monitor && tape_machine_mode && !track_rec) {
526 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
531 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
532 _meter->run (bufs, start_sample, end_sample, 1.0, nframes, true);
533 _input->process_input (boost::shared_ptr<Processor>(), start_sample, end_sample, _session.transport_speed(), nframes);
535 _input->process_input (_meter, start_sample, end_sample, _session.transport_speed(), nframes);
539 passthru_silence (start_sample, end_sample, nframes, 0);
543 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
545 fill_buffers_with_input (bufs, _input, nframes);
547 if (_meter_point == MeterInput) {
548 _meter->run (bufs, start_sample, end_sample, _session.transport_speed(), nframes, true);
551 passthru (bufs, start_sample, end_sample, nframes, false);
554 flush_processor_buffers_locked (nframes);
559 boost::shared_ptr<Playlist>
562 return _playlists[data_type()];
566 Track::request_input_monitoring (bool m)
568 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
569 AudioEngine::instance()->request_input_monitoring ((*i)->name(), m);
574 Track::ensure_input_monitoring (bool m)
576 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
577 AudioEngine::instance()->ensure_input_monitoring ((*i)->name(), m);
582 Track::destructive () const
584 return _disk_writer->destructive ();
587 list<boost::shared_ptr<Source> > &
588 Track::last_capture_sources ()
590 return _disk_writer->last_capture_sources ();
594 Track::update_latency_information ()
596 Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
597 samplecnt_t chain_latency = _input->latency ();
599 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
600 (*p)->set_input_latency (chain_latency);
601 chain_latency += (*p)->signal_latency ();
606 Track::steal_write_source_name()
608 return _disk_writer->steal_write_source_name ();
612 Track::reset_write_sources (bool r, bool force)
614 _disk_writer->reset_write_sources (r, force);
618 Track::playback_buffer_load () const
620 return _disk_reader->buffer_load ();
624 Track::capture_buffer_load () const
626 return _disk_writer->buffer_load ();
632 return _disk_reader->do_refill ();
636 Track::do_flush (RunContext c, bool force)
638 return _disk_writer->do_flush (c, force);
642 Track::set_pending_overwrite (bool o)
644 _disk_reader->set_pending_overwrite (o);
648 Track::seek (samplepos_t p, bool complete_refill)
650 if (_disk_reader->seek (p, complete_refill)) {
653 return _disk_writer->seek (p, complete_refill);
657 Track::can_internal_playback_seek (samplecnt_t p)
659 return _disk_reader->can_internal_playback_seek (p);
663 Track::internal_playback_seek (samplecnt_t p)
665 return _disk_reader->internal_playback_seek (p);
669 Track::non_realtime_locate (samplepos_t p)
671 Route::non_realtime_locate (p);
673 if (!is_private_route()) {
674 /* don't waste i/o cycles and butler calls
675 for private tracks (e.g.auditioner)
677 _disk_reader->non_realtime_locate (p);
678 _disk_writer->non_realtime_locate (p);
683 Track::non_realtime_speed_change ()
685 _disk_reader->non_realtime_speed_change ();
689 Track::overwrite_existing_buffers ()
691 return _disk_reader->overwrite_existing_buffers ();
695 Track::get_captured_samples (uint32_t n) const
697 return _disk_writer->get_captured_samples (n);
701 Track::set_loop (Location* l)
703 if (_disk_reader->set_loop (l)) {
706 return _disk_writer->set_loop (l);
710 Track::transport_looped (samplepos_t p)
712 return _disk_writer->transport_looped (p);
716 Track::realtime_speed_change ()
718 if (_disk_reader->realtime_speed_change ()) {
721 return _disk_writer->realtime_speed_change ();
725 Track::realtime_handle_transport_stopped ()
727 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
733 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
734 (*i)->realtime_handle_transport_stopped ();
739 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
741 _disk_writer->transport_stopped_wallclock (n, t, g);
745 Track::pending_overwrite () const
747 return _disk_reader->pending_overwrite ();
751 Track::prepare_to_stop (samplepos_t t, samplepos_t a)
753 _disk_writer->prepare_to_stop (t, a);
757 Track::set_slaved (bool s)
759 _disk_reader->set_slaved (s);
760 _disk_writer->set_slaved (s);
766 return _disk_reader->output_streams();
770 Track::get_capture_start_sample (uint32_t n) const
772 return _disk_writer->get_capture_start_sample (n);
776 Track::alignment_style () const
778 return _disk_writer->alignment_style ();
782 Track::alignment_choice () const
784 return _disk_writer->alignment_choice ();
788 Track::current_capture_start () const
790 return _disk_writer->current_capture_start ();
794 Track::current_capture_end () const
796 return _disk_writer->current_capture_end ();
800 Track::playlist_modified ()
802 _disk_reader->playlist_modified ();
806 Track::find_and_use_playlist (DataType dt, PBD::ID const & id)
808 boost::shared_ptr<Playlist> playlist;
810 if ((playlist = _session.playlists->by_id (id)) == 0) {
815 error << string_compose(_("DiskIOProcessor: \"%1\" isn't an playlist"), id.to_s()) << endmsg;
819 return use_playlist (dt, playlist);
823 Track::use_playlist (DataType dt, boost::shared_ptr<Playlist> p)
827 if ((ret = _disk_reader->use_playlist (dt, p)) == 0) {
828 if ((ret = _disk_writer->use_playlist (dt, p)) == 0) {
829 p->set_orig_track_id (id());
841 Track::use_copy_playlist ()
843 assert (_playlists[data_type()]);
845 if (_playlists[data_type()] == 0) {
846 error << string_compose(_("DiskIOProcessor %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
851 boost::shared_ptr<Playlist> playlist;
853 newname = Playlist::bump_name (_playlists[data_type()]->name(), _session);
855 if ((playlist = PlaylistFactory::create (_playlists[data_type()], newname)) == 0) {
859 playlist->reset_shares();
861 return use_playlist (data_type(), playlist);
865 Track::use_new_playlist (DataType dt)
868 boost::shared_ptr<Playlist> playlist = _playlists[dt];
871 newname = Playlist::bump_name (playlist->name(), _session);
873 newname = Playlist::bump_name (_name, _session);
876 playlist = PlaylistFactory::create (dt, _session, newname, is_private_route());
882 return use_playlist (dt, playlist);
886 Track::set_align_choice (AlignChoice ac, bool force)
890 _alignment_choice = Automatic;
891 set_align_choice_from_io ();
897 _disk_writer->set_align_choice (ac, force);
898 _alignment_choice = ac;
902 Track::set_align_style (AlignStyle s, bool force)
904 _disk_writer->set_align_style (s, force);
908 Track::set_align_choice_from_io ()
910 bool have_physical = false;
914 vector<string> connections;
915 boost::shared_ptr<Port> p;
919 p = _input->nth (n++);
925 if (p->get_connections (connections) != 0) {
926 if (AudioEngine::instance()->port_is_physical (connections[0])) {
927 have_physical = true;
932 connections.clear ();
937 // compensate for latency when bouncing from master or mixbus.
938 // we need to use "ExistingMaterial" to pick up the master bus' latency
939 // see also Route::direct_feeds_according_to_reality
941 ios.push_back (_input);
942 if (_session.master_out() && ios.fed_by (_session.master_out()->output())) {
943 have_physical = true;
945 for (uint32_t n = 0; n < NUM_MIXBUSES && !have_physical; ++n) {
946 if (_session.get_mixbus (n) && ios.fed_by (_session.get_mixbus(n)->output())) {
947 have_physical = true;
953 _disk_writer->set_align_style (ExistingMaterial);
955 _disk_writer->set_align_style (CaptureTime);
960 Track::set_block_size (pframes_t n)
962 Route::set_block_size (n);
963 _disk_reader->set_block_size (n);
964 _disk_writer->set_block_size (n);
968 Track::adjust_playback_buffering ()
971 _disk_reader->adjust_buffering ();
976 Track::adjust_capture_buffering ()
979 _disk_writer->adjust_buffering ();
983 #ifdef USE_TRACKS_CODE_FEATURES
985 /* This is the Tracks version of Track::monitoring_state().
987 * Ardour developers: try to flag or fix issues if parts of the libardour API
988 * change in ways that invalidate this
992 Track::monitoring_state () const
994 /* Explicit requests */
996 if (_monitoring != MonitorInput) {
997 return MonitoringInput;
1000 if (_monitoring & MonitorDisk) {
1001 return MonitoringDisk;
1004 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
1005 I don't think it's ever going to be too pretty too look at.
1008 // GZ: NOT USED IN TRACKS
1009 //bool const auto_input = _session.config.get_auto_input ();
1010 //bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
1011 //bool const tape_machine_mode = Config->get_tape_machine_mode ();
1013 bool const roll = _session.transport_rolling ();
1014 bool const track_rec = _diskstream->record_enabled ();
1015 bool session_rec = _session.actively_recording ();
1019 if (!session_rec && roll) {
1020 return MonitoringDisk;
1022 return MonitoringInput;
1028 return MonitoringDisk;
1032 return MonitoringSilence;
1037 /* This is the Ardour/Mixbus version of Track::monitoring_state().
1039 * Tracks developers: do NOT modify this method under any circumstances.
1043 Track::monitoring_state () const
1045 /* Explicit requests */
1046 MonitorChoice m (_monitoring_control->monitoring_choice());
1048 if (m != MonitorAuto) {
1050 MonitorState ms ((MonitorState) 0);
1052 if (m & MonitorInput) {
1053 ms = MonitoringInput;
1056 if (m & MonitorDisk) {
1057 ms = MonitorState (ms | MonitoringDisk);
1063 switch (_session.config.get_session_monitoring ()) {
1065 return MonitoringDisk;
1068 return MonitoringInput;
1074 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
1075 I don't think it's ever going to be too pretty too look at.
1078 bool const roll = _session.transport_rolling ();
1079 bool const track_rec = _disk_writer->record_enabled ();
1080 bool const auto_input = _session.config.get_auto_input ();
1081 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
1082 bool const tape_machine_mode = Config->get_tape_machine_mode ();
1085 /* I suspect that just use actively_recording() is good enough all the
1086 * time, but just to keep the semantics the same as they were before
1087 * sept 26th 2012, we differentiate between the cases where punch is
1088 * enabled and those where it is not.
1090 * rg: I suspect this is not the case: monitoring may differ
1093 if (_session.config.get_punch_in() || _session.config.get_punch_out() || _session.preroll_record_punch_enabled ()) {
1094 session_rec = _session.actively_recording ();
1096 session_rec = _session.get_record_enabled();
1101 if (!session_rec && roll && auto_input) {
1102 return MonitoringDisk;
1104 return software_monitor ? MonitoringInput : MonitoringSilence;
1109 if (tape_machine_mode) {
1111 return MonitoringDisk;
1115 if (!roll && auto_input) {
1116 return software_monitor ? MonitoringInput : MonitoringSilence;
1118 return MonitoringDisk;
1124 abort(); /* NOTREACHED */
1125 return MonitoringSilence;
1131 Track::maybe_declick (BufferSet& bufs, samplecnt_t nframes, int declick)
1133 /* never declick if there is an internal generator - we just want it to
1134 keep generating sound without interruption.
1136 ditto if we are monitoring inputs.
1139 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
1144 declick = _pending_declick;
1148 Amp::declick (bufs, nframes, declick);
1153 Track::check_initial_delay (samplecnt_t nframes, samplepos_t& transport_sample)
1155 if (_roll_delay > nframes) {
1157 _roll_delay -= nframes;
1158 silence_unlocked (nframes);
1159 /* transport sample is not legal for caller to use */
1162 } else if (_roll_delay > 0) {
1164 nframes -= _roll_delay;
1165 silence_unlocked (_roll_delay);
1166 transport_sample += _roll_delay;
1168 /* shuffle all the port buffers for things that lead "out" of this Route
1169 to reflect that we just wrote _roll_delay samples of silence.
1172 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1173 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1174 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1176 iop->increment_port_buffer_offset (_roll_delay);
1179 _output->increment_port_buffer_offset (_roll_delay);
1189 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
1191 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1192 (*i)->monitoring_changed ();
1197 Track::metering_state () const
1200 if (_session.transport_rolling ()) {
1201 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1202 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled());
1204 // track no_roll() always metering if
1205 rv = _meter_point == MeterInput;
1207 return rv ? MeteringInput : MeteringRoute;
1211 Track::set_processor_state (XMLNode const & node, XMLProperty const* prop, ProcessorList& new_order, bool& must_configure)
1213 if (Route::set_processor_state (node, prop, new_order, must_configure)) {
1217 cerr << name() << " looking for state for track procs, DR = " << _disk_reader << endl;
1219 if (prop->value() == "diskreader") {
1221 _disk_reader->set_state (node, Stateful::current_state_version);
1222 new_order.push_back (_disk_reader);
1225 } else if (prop->value() == "diskwriter") {
1227 _disk_writer->set_state (node, Stateful::current_state_version);
1228 new_order.push_back (_disk_writer);
1233 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
1238 Track::use_captured_sources (SourceList& srcs, CaptureInfos const & capture_info)
1244 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1245 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1248 use_captured_audio_sources (srcs, capture_info);
1252 use_captured_midi_sources (srcs, capture_info);
1257 Track::use_captured_midi_sources (SourceList& srcs, CaptureInfos const & capture_info)
1259 if (srcs.empty() || data_type() != DataType::MIDI) {
1263 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1264 boost::shared_ptr<Playlist> pl = _playlists[DataType::MIDI];
1265 boost::shared_ptr<MidiRegion> midi_region;
1266 CaptureInfos::const_iterator ci;
1272 samplecnt_t total_capture = 0;
1274 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1275 total_capture += (*ci)->samples;
1278 /* we will want to be able to keep (over)writing the source
1279 but we don't want it to be removable. this also differs
1280 from the audio situation, where the source at this point
1281 must be considered immutable. luckily, we can rely on
1282 MidiSource::mark_streaming_write_completed() to have
1283 already done the necessary work for that.
1286 string whole_file_region_name;
1287 whole_file_region_name = region_name_from_path (mfs->name(), true);
1289 /* Register a new region with the Session that
1290 describes the entire source. Do this first
1291 so that any sub-regions will obviously be
1292 children of this one (later!)
1298 plist.add (Properties::name, whole_file_region_name);
1299 plist.add (Properties::whole_file, true);
1300 plist.add (Properties::automatic, true);
1301 plist.add (Properties::start, 0);
1302 plist.add (Properties::length, total_capture);
1303 plist.add (Properties::layer, 0);
1305 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1307 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1308 midi_region->special_set_position (capture_info.front()->start);
1311 catch (failed_constructor& err) {
1312 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
1316 pl->clear_changes ();
1319 /* Session sample time of the initial capture in this pass, which is where the source starts */
1320 samplepos_t initial_capture = 0;
1321 if (!capture_info.empty()) {
1322 initial_capture = capture_info.front()->start;
1325 BeatsSamplesConverter converter (_session.tempo_map(), capture_info.front()->start);
1326 const samplepos_t preroll_off = _session.preroll_record_trim_len ();
1328 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1332 RegionFactory::region_name (region_name, mfs->name(), false);
1334 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1335 _name, (*ci)->start, (*ci)->samples, region_name));
1338 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->samples << " add a region\n";
1343 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1344 plist.add (Properties::start, (*ci)->start - initial_capture);
1345 plist.add (Properties::length, (*ci)->samples);
1346 plist.add (Properties::length_beats, converter.from((*ci)->samples).to_double());
1347 plist.add (Properties::name, region_name);
1349 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1350 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1351 if (preroll_off > 0) {
1352 midi_region->trim_front ((*ci)->start - initial_capture + preroll_off);
1356 catch (failed_constructor& err) {
1357 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1358 continue; /* XXX is this OK? */
1361 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1363 pl->add_region (midi_region, (*ci)->start + preroll_off, _disk_writer->non_layered());
1367 _session.add_command (new StatefulDiffCommand (pl));
1371 Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & capture_info)
1373 if (srcs.empty() || data_type() != DataType::AUDIO) {
1377 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1378 boost::shared_ptr<Playlist> pl = _playlists[DataType::AUDIO];
1379 boost::shared_ptr<AudioRegion> region;
1385 /* destructive tracks have a single, never changing region */
1387 if (destructive()) {
1389 /* send a signal that any UI can pick up to do the right thing. there is
1390 a small problem here in that a UI may need the peak data to be ready
1391 for the data that was recorded and this isn't interlocked with that
1392 process. this problem is deferred to the UI.
1395 pl->LayeringChanged(); // XXX this may not get the UI to do the right thing
1399 string whole_file_region_name;
1400 whole_file_region_name = region_name_from_path (afs->name(), true);
1402 /* Register a new region with the Session that
1403 describes the entire source. Do this first
1404 so that any sub-regions will obviously be
1405 children of this one (later!)
1411 plist.add (Properties::start, afs->last_capture_start_sample());
1412 plist.add (Properties::length, afs->length(0));
1413 plist.add (Properties::name, whole_file_region_name);
1414 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1415 rx->set_automatic (true);
1416 rx->set_whole_file (true);
1418 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1419 region->special_set_position (afs->natural_position());
1423 catch (failed_constructor& err) {
1424 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1428 pl->clear_changes ();
1429 pl->set_capture_insertion_in_progress (true);
1432 const samplepos_t preroll_off = _session.preroll_record_trim_len ();
1433 samplecnt_t buffer_position = afs->last_capture_start_sample ();
1434 CaptureInfos::const_iterator ci;
1436 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1440 RegionFactory::region_name (region_name, whole_file_region_name, false);
1442 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture bufpos %5 start @ %2 length %3 add new region %4\n",
1443 _name, (*ci)->start, (*ci)->samples, region_name, buffer_position));
1449 plist.add (Properties::start, buffer_position);
1450 plist.add (Properties::length, (*ci)->samples);
1451 plist.add (Properties::name, region_name);
1453 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1454 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1455 if (preroll_off > 0) {
1456 region->trim_front (buffer_position + preroll_off);
1460 catch (failed_constructor& err) {
1461 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1462 continue; /* XXX is this OK? */
1465 pl->add_region (region, (*ci)->start + preroll_off, 1, _disk_writer->non_layered());
1466 pl->set_layer (region, DBL_MAX);
1468 buffer_position += (*ci)->samples;
1472 pl->set_capture_insertion_in_progress (false);
1473 _session.add_command (new StatefulDiffCommand (pl));