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;
67 DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
70 _disk_reader->set_route (boost::shared_ptr<Route>());
71 _disk_reader.reset ();
75 _disk_writer->set_route (boost::shared_ptr<Route>());
76 _disk_writer.reset ();
87 DiskIOProcessor::Flag dflags = DiskIOProcessor::Recordable;
89 if (_mode == Destructive && !Profile->get_trx()) {
90 dflags = DiskIOProcessor::Flag (dflags | DiskIOProcessor::Destructive);
91 } else if (_mode == NonLayered){
92 dflags = DiskIOProcessor::Flag(dflags | DiskIOProcessor::NonLayered);
95 _disk_reader.reset (new DiskReader (_session, name(), dflags));
96 _disk_reader->set_block_size (_session.get_block_size ());
97 _disk_reader->set_route (boost::dynamic_pointer_cast<Route> (shared_from_this()));
99 _disk_writer.reset (new DiskWriter (_session, name(), dflags));
100 _disk_writer->set_block_size (_session.get_block_size ());
101 _disk_writer->set_route (boost::dynamic_pointer_cast<Route> (shared_from_this()));
105 /* ordering here is important, and needs to be generally maintained */
107 add_processor (_disk_writer, PreFader);
108 add_processor (_disk_reader, PreFader);
110 boost::shared_ptr<Route> rp (boost::dynamic_pointer_cast<Route> (shared_from_this()));
111 boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
113 _record_enable_control.reset (new RecordEnableControl (_session, EventTypeMap::instance().to_symbol (RecEnableAutomation), *this));
114 add_control (_record_enable_control);
116 _record_safe_control.reset (new RecordSafeControl (_session, EventTypeMap::instance().to_symbol (RecSafeAutomation), *this));
117 add_control (_record_safe_control);
119 _monitoring_control.reset (new MonitorControl (_session, EventTypeMap::instance().to_symbol (MonitoringAutomation), *this));
120 add_control (_monitoring_control);
122 _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
124 _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2));
125 _record_safe_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_safe_changed, this, _1, _2));
126 _record_enable_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_enable_changed, this, _1, _2));
128 _input->changed.connect_same_thread (*this, boost::bind (&Track::input_changed, this));
134 Track::input_changed ()
136 if (_disk_writer && _alignment_choice == Automatic) {
137 set_align_choice_from_io ();
148 Track::state (bool full)
150 XMLNode& root (Route::state (full));
152 if (_playlists[DataType::AUDIO]) {
153 root.set_property (X_("audio-playlist"), _playlists[DataType::AUDIO]->id().to_s());
156 if (_playlists[DataType::MIDI]) {
157 root.set_property (X_("midi-playlist"), _playlists[DataType::MIDI]->id().to_s());
160 root.add_child_nocopy (_monitoring_control->get_state ());
161 root.add_child_nocopy (_record_safe_control->get_state ());
162 root.add_child_nocopy (_record_enable_control->get_state ());
164 root.set_property (X_("saved-meter-point"), _saved_meter_point);
165 root.set_property (X_("alignment-choice"), _alignment_choice);
171 Track::set_state (const XMLNode& node, int version)
173 if (Route::set_state (node, version)) {
179 if (version >= 3000 && version < 4000) {
180 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
181 /* XXX if we remember anything from stored DiskStream
182 state (older Ardour versions) that is needed by a
183 DiskReader or DiskWriter, we should cook up a new
184 XMLNode here, populate it with that information
185 (child nodes, properties, etc.) and then call
186 ::set_state() on the writer/reader.
188 But at present (June 2017), there's no such state.
193 std::string playlist_id;
195 if (node.get_property (X_("audio-playlist"), playlist_id)) {
196 find_and_use_playlist (DataType::AUDIO, PBD::ID (playlist_id));
199 if (node.get_property (X_("midi-playlist"), playlist_id)) {
200 find_and_use_playlist (DataType::MIDI, PBD::ID (playlist_id));
203 XMLNodeList nlist = node.children();
204 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
207 if (child->name() == Controllable::xml_node_name) {
209 if (!child->get_property ("name", name)) {
213 if (name == _record_enable_control->name()) {
214 _record_enable_control->set_state (*child, version);
215 } else if (name == _record_safe_control->name()) {
216 _record_safe_control->set_state (*child, version);
217 } else if (name == _monitoring_control->name()) {
218 _monitoring_control->set_state (*child, version);
223 if (!node.get_property (X_("saved-meter-point"), _saved_meter_point)) {
224 _saved_meter_point = _meter_point;
229 if (node.get_property (X_("alignment-choice"), ac)) {
230 set_align_choice (ac, true);
237 Track::get_template ()
239 return state (false);
242 Track::FreezeRecord::~FreezeRecord ()
244 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
250 Track::freeze_state() const
252 return _freeze_record.state;
258 bool will_record = true;
259 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
268 Track::prep_record_enabled (bool yn)
270 if (yn && _record_safe_control->get_value()) {
274 if (!can_be_record_enabled()) {
278 /* keep track of the meter point as it was before we rec-enabled */
279 if (!_disk_writer->record_enabled()) {
280 _saved_meter_point = _meter_point;
286 will_follow = _disk_writer->prep_record_enable ();
288 will_follow = _disk_writer->prep_record_disable ();
293 if (_meter_point != MeterCustom) {
294 set_meter_point (MeterInput);
297 set_meter_point (_saved_meter_point);
305 Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
307 _disk_writer->set_record_enabled (_record_enable_control->get_value());
311 Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
313 _disk_writer->set_record_safe (_record_safe_control->get_value());
317 Track::can_be_record_safe ()
319 return !_record_enable_control->get_value() && _disk_writer && _session.writable() && (_freeze_record.state != Frozen);
323 Track::can_be_record_enabled ()
325 return !_record_safe_control->get_value() && _disk_writer && !_disk_writer->record_safe() && _session.writable() && (_freeze_record.state != Frozen);
329 Track::parameter_changed (string const & p)
331 if (p == "track-name-number") {
332 resync_track_name ();
334 else if (p == "track-name-take") {
335 resync_track_name ();
337 else if (p == "take-name") {
338 if (_session.config.get_track_name_take()) {
339 resync_track_name ();
345 Track::resync_track_name ()
351 Track::set_name (const string& str)
359 if (_record_enable_control->get_value()) {
360 /* when re-arm'ed the file (named after the track) is already ready to rolll */
364 string diskstream_name = "";
365 if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
366 // Note: any text is fine, legalize_for_path() fixes this later
367 diskstream_name += _session.config.get_take_name ();
368 diskstream_name += "_";
370 const int64_t tracknumber = track_number();
371 if (tracknumber > 0 && _session.config.get_track_name_number()) {
372 char num[64], fmt[10];
373 snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
374 snprintf(num, sizeof(num), fmt, tracknumber);
375 diskstream_name += num;
376 diskstream_name += "_";
378 diskstream_name += str;
380 if (diskstream_name == _diskstream_name) {
383 _diskstream_name = diskstream_name;
385 _disk_writer->set_write_source_name (diskstream_name);
387 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
389 if (_playlists[data_type()]->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
390 /* Only rename the diskstream (and therefore the playlist) if
391 a) the playlist has never had a region added to it and
392 b) there is only one playlist for this track.
394 If (a) is not followed, people can get confused if, say,
395 they have notes about a playlist with a given name and then
396 it changes (see mantis #4759).
398 If (b) is not followed, we rename the current playlist and not
399 the other ones, which is a bit confusing (see mantis #4977).
401 _disk_reader->set_name (str);
402 _disk_writer->set_name (str);
405 for (uint32_t n = 0; n < DataType::num_types; ++n) {
407 _playlists[n]->set_name (str);
411 /* save state so that the statefile fully reflects any filename changes */
413 if ((ret = Route::set_name (str)) == 0) {
414 _session.save_state ("");
421 Track::set_latency_compensation (framecnt_t longest_session_latency)
423 Route::set_latency_compensation (longest_session_latency);
424 _disk_reader->set_roll_delay (_roll_delay);
428 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
430 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
436 bool can_record = _session.actively_recording ();
438 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
440 if (n_outputs().n_total() == 0 && !ARDOUR::Profile->get_mixbus()) {
441 //Note: Mixbus has its own output mechanism, so we should operate even if no explicit outputs are assigned
445 /* not active ... do the minimum possible by just outputting silence */
449 if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled())) {
455 if (session_state_changing) {
456 if (_session.transport_speed() != 0.0f) {
457 /* we're rolling but some state is changing (e.g. our
458 disk reader contents) so we cannot use them. Be
459 silent till this is over. Don't declick.
461 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
463 passthru_silence (start_frame, end_frame, nframes, 0);
466 /* we're really not rolling, so we're either delivery silence or actually
467 monitoring, both of which are safe to do while session_state_changing is true.
471 _disk_writer->check_record_status (start_frame, can_record);
475 MonitorState const s = monitoring_state ();
476 /* we are not rolling, so be silent even if we are monitoring disk, as there
477 will be no disk data coming in.
480 case MonitoringSilence:
486 case MonitoringInput:
494 //if we have an internal generator, let it play regardless of monitoring state
495 if (_have_internal_generator) {
499 _amp->apply_gain_automation (false);
501 /* if have_internal_generator, or .. */
505 if (_meter_point == MeterInput) {
506 /* still need input monitoring and metering */
508 bool const track_rec = _disk_writer->record_enabled ();
509 bool const auto_input = _session.config.get_auto_input ();
510 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
511 bool const tape_machine_mode = Config->get_tape_machine_mode ();
512 bool no_meter = false;
514 /* this needs a proper K-map
515 * and should be separated into a function similar to monitoring_state()
516 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
518 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
520 if (!auto_input && !track_rec) {
523 else if (tape_machine_mode && !track_rec && auto_input) {
526 else if (!software_monitor && tape_machine_mode && !track_rec) {
529 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
534 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
535 _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
536 _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, _session.transport_speed(), nframes);
538 _input->process_input (_meter, start_frame, end_frame, _session.transport_speed(), nframes);
542 passthru_silence (start_frame, end_frame, nframes, 0);
546 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
548 fill_buffers_with_input (bufs, _input, nframes);
550 if (_meter_point == MeterInput) {
551 _meter->run (bufs, start_frame, end_frame, _session.transport_speed(), nframes, true);
554 passthru (bufs, start_frame, end_frame, nframes, false);
557 flush_processor_buffers_locked (nframes);
563 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
565 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
567 // XXX DISK reader needs to seek ahead the correct distance ?? OR DOES IT ?
568 //framecnt_t playback_distance = _disk_reader->calculate_playback_distance(nframes);
569 //if (can_internal_playback_seek(playback_distance)) {
570 // internal_playback_seek(playback_distance);
575 if (n_outputs().n_total() == 0 && _processors.empty()) {
585 _amp->apply_gain_automation(false);
588 flush_processor_buffers_locked (nframes);
590 //BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
591 // XXXX DISKWRITER/READER ADVANCE, SET need_butler
595 boost::shared_ptr<Playlist>
598 return _playlists[data_type()];
602 Track::request_input_monitoring (bool m)
604 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
605 AudioEngine::instance()->request_input_monitoring ((*i)->name(), m);
610 Track::ensure_input_monitoring (bool m)
612 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
613 AudioEngine::instance()->ensure_input_monitoring ((*i)->name(), m);
618 Track::destructive () const
620 return _disk_writer->destructive ();
623 list<boost::shared_ptr<Source> > &
624 Track::last_capture_sources ()
626 return _disk_writer->last_capture_sources ();
630 Track::update_latency_information ()
632 Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
633 framecnt_t chain_latency = _input->latency ();
635 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
636 (*p)->set_input_latency (chain_latency);
637 chain_latency += (*p)->signal_latency ();
642 Track::steal_write_source_name()
644 return _disk_writer->steal_write_source_name ();
648 Track::reset_write_sources (bool r, bool force)
650 _disk_writer->reset_write_sources (r, force);
654 Track::playback_buffer_load () const
656 return _disk_reader->buffer_load ();
660 Track::capture_buffer_load () const
662 return _disk_writer->buffer_load ();
668 return _disk_reader->do_refill ();
672 Track::do_flush (RunContext c, bool force)
674 return _disk_writer->do_flush (c, force);
678 Track::set_pending_overwrite (bool o)
680 _disk_reader->set_pending_overwrite (o);
684 Track::seek (framepos_t p, bool complete_refill)
686 if (_disk_reader->seek (p, complete_refill)) {
689 return _disk_writer->seek (p, complete_refill);
693 Track::hidden () const
695 return _disk_writer->hidden () || _disk_reader->hidden();
699 Track::can_internal_playback_seek (framecnt_t p)
701 return _disk_reader->can_internal_playback_seek (p);
705 Track::internal_playback_seek (framecnt_t p)
707 return _disk_reader->internal_playback_seek (p);
711 Track::non_realtime_locate (framepos_t p)
713 Route::non_realtime_locate (p);
716 /* don't waste i/o cycles and butler calls
717 for hidden (secret) tracks
719 _disk_reader->non_realtime_locate (p);
720 _disk_writer->non_realtime_locate (p);
725 Track::non_realtime_speed_change ()
727 _disk_reader->non_realtime_speed_change ();
731 Track::overwrite_existing_buffers ()
733 return _disk_reader->overwrite_existing_buffers ();
737 Track::get_captured_frames (uint32_t n) const
739 return _disk_writer->get_captured_frames (n);
743 Track::set_loop (Location* l)
745 if (_disk_reader->set_loop (l)) {
748 return _disk_writer->set_loop (l);
752 Track::transport_looped (framepos_t p)
754 return _disk_writer->transport_looped (p);
758 Track::realtime_speed_change ()
760 if (_disk_reader->realtime_speed_change ()) {
763 return _disk_writer->realtime_speed_change ();
767 Track::realtime_handle_transport_stopped ()
769 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
775 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
776 (*i)->realtime_handle_transport_stopped ();
781 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
783 _disk_writer->transport_stopped_wallclock (n, t, g);
787 Track::pending_overwrite () const
789 return _disk_reader->pending_overwrite ();
793 Track::prepare_to_stop (framepos_t t, framepos_t a)
795 _disk_writer->prepare_to_stop (t, a);
799 Track::set_slaved (bool s)
801 _disk_reader->set_slaved (s);
802 _disk_writer->set_slaved (s);
808 return _disk_reader->output_streams();
812 Track::get_capture_start_frame (uint32_t n) const
814 return _disk_writer->get_capture_start_frame (n);
818 Track::alignment_style () const
820 return _disk_writer->alignment_style ();
824 Track::alignment_choice () const
826 return _disk_writer->alignment_choice ();
830 Track::current_capture_start () const
832 return _disk_writer->current_capture_start ();
836 Track::current_capture_end () const
838 return _disk_writer->current_capture_end ();
842 Track::playlist_modified ()
844 _disk_reader->playlist_modified ();
848 Track::find_and_use_playlist (DataType dt, PBD::ID const & id)
850 boost::shared_ptr<Playlist> playlist;
852 if ((playlist = _session.playlists->by_id (id)) == 0) {
857 error << string_compose(_("DiskIOProcessor: \"%1\" isn't an playlist"), id.to_s()) << endmsg;
861 return use_playlist (dt, playlist);
865 Track::use_playlist (DataType dt, boost::shared_ptr<Playlist> p)
869 if ((ret = _disk_reader->use_playlist (dt, p)) == 0) {
870 if ((ret = _disk_writer->use_playlist (dt, p)) == 0) {
871 p->set_orig_track_id (id());
883 Track::use_copy_playlist ()
885 assert (_playlists[data_type()]);
887 if (_playlists[data_type()] == 0) {
888 error << string_compose(_("DiskIOProcessor %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
893 boost::shared_ptr<Playlist> playlist;
895 newname = Playlist::bump_name (_playlists[data_type()]->name(), _session);
897 if ((playlist = PlaylistFactory::create (_playlists[data_type()], newname)) == 0) {
901 playlist->reset_shares();
903 return use_playlist (data_type(), playlist);
907 Track::use_new_playlist ()
910 boost::shared_ptr<Playlist> playlist = _playlists[data_type()];
913 newname = Playlist::bump_name (playlist->name(), _session);
915 newname = Playlist::bump_name (_name, _session);
918 playlist = PlaylistFactory::create (data_type(), _session, newname, hidden());
924 return use_playlist (data_type(), playlist);
928 Track::set_align_choice (AlignChoice ac, bool force)
932 _alignment_choice = Automatic;
933 set_align_choice_from_io ();
939 _disk_writer->set_align_choice (ac, force);
940 _alignment_choice = ac;
944 Track::set_align_style (AlignStyle s, bool force)
946 _disk_writer->set_align_style (s, force);
950 Track::set_align_choice_from_io ()
952 bool have_physical = false;
956 vector<string> connections;
957 boost::shared_ptr<Port> p;
961 p = _input->nth (n++);
967 if (p->get_connections (connections) != 0) {
968 if (AudioEngine::instance()->port_is_physical (connections[0])) {
969 have_physical = true;
974 connections.clear ();
979 // compensate for latency when bouncing from master or mixbus.
980 // we need to use "ExistingMaterial" to pick up the master bus' latency
981 // see also Route::direct_feeds_according_to_reality
983 ios.push_back (_input);
984 if (_session.master_out() && ios.fed_by (_session.master_out()->output())) {
985 have_physical = true;
987 for (uint32_t n = 0; n < NUM_MIXBUSES && !have_physical; ++n) {
988 if (_session.get_mixbus (n) && ios.fed_by (_session.get_mixbus(n)->output())) {
989 have_physical = true;
995 _disk_writer->set_align_style (ExistingMaterial);
997 _disk_writer->set_align_style (CaptureTime);
1002 Track::set_block_size (pframes_t n)
1004 Route::set_block_size (n);
1005 _disk_reader->set_block_size (n);
1006 _disk_writer->set_block_size (n);
1010 Track::adjust_playback_buffering ()
1013 _disk_reader->adjust_buffering ();
1018 Track::adjust_capture_buffering ()
1021 _disk_writer->adjust_buffering ();
1025 #ifdef USE_TRACKS_CODE_FEATURES
1027 /* This is the Tracks version of Track::monitoring_state().
1029 * Ardour developers: try to flag or fix issues if parts of the libardour API
1030 * change in ways that invalidate this
1034 Track::monitoring_state () const
1036 /* Explicit requests */
1038 if (_monitoring != MonitorInput) {
1039 return MonitoringInput;
1042 if (_monitoring & MonitorDisk) {
1043 return MonitoringDisk;
1046 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
1047 I don't think it's ever going to be too pretty too look at.
1050 // GZ: NOT USED IN TRACKS
1051 //bool const auto_input = _session.config.get_auto_input ();
1052 //bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
1053 //bool const tape_machine_mode = Config->get_tape_machine_mode ();
1055 bool const roll = _session.transport_rolling ();
1056 bool const track_rec = _diskstream->record_enabled ();
1057 bool session_rec = _session.actively_recording ();
1061 if (!session_rec && roll) {
1062 return MonitoringDisk;
1064 return MonitoringInput;
1070 return MonitoringDisk;
1074 return MonitoringSilence;
1079 /* This is the Ardour/Mixbus version of Track::monitoring_state().
1081 * Tracks developers: do NOT modify this method under any circumstances.
1085 Track::monitoring_state () const
1087 /* Explicit requests */
1088 MonitorChoice m (_monitoring_control->monitoring_choice());
1090 if (m != MonitorAuto) {
1092 MonitorState ms ((MonitorState) 0);
1094 if (m & MonitorInput) {
1095 ms = MonitoringInput;
1098 if (m & MonitorDisk) {
1099 ms = MonitorState (ms | MonitoringDisk);
1105 switch (_session.config.get_session_monitoring ()) {
1107 return MonitoringDisk;
1110 return MonitoringInput;
1116 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
1117 I don't think it's ever going to be too pretty too look at.
1120 bool const roll = _session.transport_rolling ();
1121 bool const track_rec = _disk_writer->record_enabled ();
1122 bool const auto_input = _session.config.get_auto_input ();
1123 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
1124 bool const tape_machine_mode = Config->get_tape_machine_mode ();
1127 /* I suspect that just use actively_recording() is good enough all the
1128 * time, but just to keep the semantics the same as they were before
1129 * sept 26th 2012, we differentiate between the cases where punch is
1130 * enabled and those where it is not.
1132 * rg: I suspect this is not the case: monitoring may differ
1135 if (_session.config.get_punch_in() || _session.config.get_punch_out() || _session.preroll_record_punch_enabled ()) {
1136 session_rec = _session.actively_recording ();
1138 session_rec = _session.get_record_enabled();
1143 if (!session_rec && roll && auto_input) {
1144 return MonitoringDisk;
1146 return software_monitor ? MonitoringInput : MonitoringSilence;
1151 if (tape_machine_mode) {
1153 return MonitoringDisk;
1157 if (!roll && auto_input) {
1158 return software_monitor ? MonitoringInput : MonitoringSilence;
1160 return MonitoringDisk;
1166 abort(); /* NOTREACHED */
1167 return MonitoringSilence;
1173 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
1175 /* never declick if there is an internal generator - we just want it to
1176 keep generating sound without interruption.
1178 ditto if we are monitoring inputs.
1181 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
1186 declick = _pending_declick;
1190 Amp::declick (bufs, nframes, declick);
1195 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
1197 if (_roll_delay > nframes) {
1199 _roll_delay -= nframes;
1200 silence_unlocked (nframes);
1201 /* transport frame is not legal for caller to use */
1204 } else if (_roll_delay > 0) {
1206 nframes -= _roll_delay;
1207 silence_unlocked (_roll_delay);
1208 transport_frame += _roll_delay;
1210 /* shuffle all the port buffers for things that lead "out" of this Route
1211 to reflect that we just wrote _roll_delay frames of silence.
1214 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1215 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1216 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1218 iop->increment_port_buffer_offset (_roll_delay);
1221 _output->increment_port_buffer_offset (_roll_delay);
1231 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
1233 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1234 (*i)->monitoring_changed ();
1239 Track::metering_state () const
1242 if (_session.transport_rolling ()) {
1243 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1244 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled());
1246 // track no_roll() always metering if
1247 rv = _meter_point == MeterInput;
1249 return rv ? MeteringInput : MeteringRoute;
1253 Track::set_processor_state (XMLNode const & node, XMLProperty const* prop, ProcessorList& new_order, bool& must_configure)
1255 if (Route::set_processor_state (node, prop, new_order, must_configure)) {
1259 if (prop->value() == "diskreader") {
1261 _disk_reader->set_state (node, Stateful::current_state_version);
1262 new_order.push_back (_disk_reader);
1265 } else if (prop->value() == "diskwriter") {
1267 _disk_writer->set_state (node, Stateful::current_state_version);
1268 new_order.push_back (_disk_writer);
1273 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
1278 Track::use_captured_sources (SourceList& srcs, CaptureInfos const & capture_info)
1284 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1285 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1288 use_captured_audio_sources (srcs, capture_info);
1292 use_captured_midi_sources (srcs, capture_info);
1297 Track::use_captured_midi_sources (SourceList& srcs, CaptureInfos const & capture_info)
1299 if (srcs.empty() || data_type() != DataType::MIDI) {
1303 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1304 boost::shared_ptr<Playlist> pl = _playlists[DataType::MIDI];
1305 boost::shared_ptr<MidiRegion> midi_region;
1306 CaptureInfos::const_iterator ci;
1312 framecnt_t total_capture = 0;
1314 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1315 total_capture += (*ci)->frames;
1318 /* we will want to be able to keep (over)writing the source
1319 but we don't want it to be removable. this also differs
1320 from the audio situation, where the source at this point
1321 must be considered immutable. luckily, we can rely on
1322 MidiSource::mark_streaming_write_completed() to have
1323 already done the necessary work for that.
1326 string whole_file_region_name;
1327 whole_file_region_name = region_name_from_path (mfs->name(), true);
1329 /* Register a new region with the Session that
1330 describes the entire source. Do this first
1331 so that any sub-regions will obviously be
1332 children of this one (later!)
1338 plist.add (Properties::name, whole_file_region_name);
1339 plist.add (Properties::whole_file, true);
1340 plist.add (Properties::automatic, true);
1341 plist.add (Properties::start, 0);
1342 plist.add (Properties::length, total_capture);
1343 plist.add (Properties::layer, 0);
1345 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1347 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1348 midi_region->special_set_position (capture_info.front()->start);
1351 catch (failed_constructor& err) {
1352 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
1356 pl->clear_changes ();
1359 /* Session frame time of the initial capture in this pass, which is where the source starts */
1360 framepos_t initial_capture = 0;
1361 if (!capture_info.empty()) {
1362 initial_capture = capture_info.front()->start;
1365 BeatsFramesConverter converter (_session.tempo_map(), capture_info.front()->start);
1366 const framepos_t preroll_off = _session.preroll_record_trim_len ();
1368 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1372 RegionFactory::region_name (region_name, mfs->name(), false);
1374 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1375 _name, (*ci)->start, (*ci)->frames, region_name));
1378 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add a region\n";
1383 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1384 plist.add (Properties::start, (*ci)->start - initial_capture);
1385 plist.add (Properties::length, (*ci)->frames);
1386 plist.add (Properties::length_beats, converter.from((*ci)->frames).to_double());
1387 plist.add (Properties::name, region_name);
1389 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1390 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1391 if (preroll_off > 0) {
1392 midi_region->trim_front ((*ci)->start - initial_capture + preroll_off);
1396 catch (failed_constructor& err) {
1397 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1398 continue; /* XXX is this OK? */
1401 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1403 pl->add_region (midi_region, (*ci)->start + preroll_off);
1407 _session.add_command (new StatefulDiffCommand (pl));
1411 Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & capture_info)
1413 if (srcs.empty() || data_type() != DataType::AUDIO) {
1417 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1418 boost::shared_ptr<Playlist> pl = _playlists[DataType::AUDIO];
1419 boost::shared_ptr<AudioRegion> region;
1425 /* destructive tracks have a single, never changing region */
1427 if (destructive()) {
1429 /* send a signal that any UI can pick up to do the right thing. there is
1430 a small problem here in that a UI may need the peak data to be ready
1431 for the data that was recorded and this isn't interlocked with that
1432 process. this problem is deferred to the UI.
1435 pl->LayeringChanged(); // XXX this may not get the UI to do the right thing
1439 string whole_file_region_name;
1440 whole_file_region_name = region_name_from_path (afs->name(), true);
1442 /* Register a new region with the Session that
1443 describes the entire source. Do this first
1444 so that any sub-regions will obviously be
1445 children of this one (later!)
1451 plist.add (Properties::start, afs->last_capture_start_frame());
1452 plist.add (Properties::length, afs->length(0));
1453 plist.add (Properties::name, whole_file_region_name);
1454 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1455 rx->set_automatic (true);
1456 rx->set_whole_file (true);
1458 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1459 region->special_set_position (afs->natural_position());
1463 catch (failed_constructor& err) {
1464 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1468 pl->clear_changes ();
1469 pl->set_capture_insertion_in_progress (true);
1472 const framepos_t preroll_off = _session.preroll_record_trim_len ();
1473 framecnt_t buffer_position = afs->last_capture_start_frame ();
1474 CaptureInfos::const_iterator ci;
1476 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1480 RegionFactory::region_name (region_name, whole_file_region_name, false);
1482 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture bufpos %5 start @ %2 length %3 add new region %4\n",
1483 _name, (*ci)->start, (*ci)->frames, region_name, buffer_position));
1489 plist.add (Properties::start, buffer_position);
1490 plist.add (Properties::length, (*ci)->frames);
1491 plist.add (Properties::name, region_name);
1493 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1494 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1495 if (preroll_off > 0) {
1496 region->trim_front (buffer_position + preroll_off);
1500 catch (failed_constructor& err) {
1501 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1502 continue; /* XXX is this OK? */
1505 pl->add_region (region, (*ci)->start + preroll_off, 1, _disk_writer->non_layered());
1506 pl->set_layer (region, DBL_MAX);
1508 buffer_position += (*ci)->frames;
1512 pl->set_capture_insertion_in_progress (false);
1513 _session.add_command (new StatefulDiffCommand (pl));