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)
58 , _disk_io_point (DiskIOPreFader)
60 , _alignment_choice (Automatic)
62 _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 use_new_playlist (data_type());
90 /* disk writer and reader processors will be added when Route calls
91 * add_processors_oh_children_of_mine ().
94 boost::shared_ptr<Route> rp (boost::dynamic_pointer_cast<Route> (shared_from_this()));
95 boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
97 _record_enable_control.reset (new RecordEnableControl (_session, EventTypeMap::instance().to_symbol (RecEnableAutomation), *this));
98 add_control (_record_enable_control);
100 _record_safe_control.reset (new RecordSafeControl (_session, EventTypeMap::instance().to_symbol (RecSafeAutomation), *this));
101 add_control (_record_safe_control);
103 _monitoring_control.reset (new MonitorControl (_session, EventTypeMap::instance().to_symbol (MonitoringAutomation), *this));
104 add_control (_monitoring_control);
106 _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
108 _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2));
109 _record_safe_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_safe_changed, this, _1, _2));
110 _record_enable_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_enable_changed, this, _1, _2));
112 _input->changed.connect_same_thread (*this, boost::bind (&Track::input_changed, this));
118 Track::add_processors_oh_children_of_mine ()
120 cerr << name() << " ::apocom(), create DW + DR\n";
122 DiskIOProcessor::Flag dflags = DiskIOProcessor::Recordable;
124 if (_mode == Destructive && !Profile->get_trx()) {
125 dflags = DiskIOProcessor::Flag (dflags | DiskIOProcessor::Destructive);
126 } else if (_mode == NonLayered){
127 dflags = DiskIOProcessor::Flag(dflags | DiskIOProcessor::NonLayered);
130 _disk_reader.reset (new DiskReader (_session, name(), dflags));
131 _disk_reader->set_block_size (_session.get_block_size ());
132 _disk_reader->set_route (boost::dynamic_pointer_cast<Route> (shared_from_this()));
136 _disk_writer.reset (new DiskWriter (_session, name(), dflags));
137 _disk_writer->set_block_size (_session.get_block_size ());
138 _disk_writer->set_route (boost::dynamic_pointer_cast<Route> (shared_from_this()));
143 Track::input_changed ()
145 if (_disk_writer && _alignment_choice == Automatic) {
146 set_align_choice_from_io ();
157 Track::state (bool full)
159 XMLNode& root (Route::state (full));
161 if (_playlists[DataType::AUDIO]) {
162 root.set_property (X_("audio-playlist"), _playlists[DataType::AUDIO]->id().to_s());
165 if (_playlists[DataType::MIDI]) {
166 root.set_property (X_("midi-playlist"), _playlists[DataType::MIDI]->id().to_s());
169 root.add_child_nocopy (_monitoring_control->get_state ());
170 root.add_child_nocopy (_record_safe_control->get_state ());
171 root.add_child_nocopy (_record_enable_control->get_state ());
173 root.set_property (X_("saved-meter-point"), _saved_meter_point);
174 root.set_property (X_("disk-io-point"), _disk_io_point);
175 root.set_property (X_("alignment-choice"), _alignment_choice);
181 Track::set_state (const XMLNode& node, int version)
183 if (Route::set_state (node, version)) {
189 if (version >= 3000 && version < 4000) {
190 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
191 /* XXX if we remember anything from stored DiskStream
192 state (older Ardour versions) that is needed by a
193 DiskReader or DiskWriter, we should cook up a new
194 XMLNode here, populate it with that information
195 (child nodes, properties, etc.) and then call
196 ::set_state() on the writer/reader.
198 But at present (June 2017), there's no such state.
203 std::string playlist_id;
205 if (node.get_property (X_("audio-playlist"), playlist_id)) {
206 find_and_use_playlist (DataType::AUDIO, PBD::ID (playlist_id));
209 if (node.get_property (X_("midi-playlist"), playlist_id)) {
210 find_and_use_playlist (DataType::MIDI, PBD::ID (playlist_id));
213 XMLNodeList nlist = node.children();
214 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
217 if (child->name() == Controllable::xml_node_name) {
219 if (!child->get_property ("name", name)) {
223 if (name == _record_enable_control->name()) {
224 _record_enable_control->set_state (*child, version);
225 } else if (name == _record_safe_control->name()) {
226 _record_safe_control->set_state (*child, version);
227 } else if (name == _monitoring_control->name()) {
228 _monitoring_control->set_state (*child, version);
233 if (!node.get_property (X_("saved-meter-point"), _saved_meter_point)) {
234 _saved_meter_point = _meter_point;
237 if (!node.get_property (X_("saved-meter-point"), _disk_io_point)) {
238 _disk_io_point = DiskIOPreFader;
243 if (node.get_property (X_("alignment-choice"), ac)) {
244 set_align_choice (ac, true);
251 Track::get_template ()
253 return state (false);
256 Track::FreezeRecord::~FreezeRecord ()
258 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
264 Track::freeze_state() const
266 return _freeze_record.state;
272 bool will_record = true;
273 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
282 Track::prep_record_enabled (bool yn)
284 if (yn && _record_safe_control->get_value()) {
288 if (!can_be_record_enabled()) {
292 /* keep track of the meter point as it was before we rec-enabled */
293 if (!_disk_writer->record_enabled()) {
294 _saved_meter_point = _meter_point;
300 will_follow = _disk_writer->prep_record_enable ();
302 will_follow = _disk_writer->prep_record_disable ();
307 if (_meter_point != MeterCustom) {
308 set_meter_point (MeterInput);
311 set_meter_point (_saved_meter_point);
319 Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
321 _disk_writer->set_record_enabled (_record_enable_control->get_value());
325 Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
327 _disk_writer->set_record_safe (_record_safe_control->get_value());
331 Track::can_be_record_safe ()
333 return !_record_enable_control->get_value() && _disk_writer && _session.writable() && (_freeze_record.state != Frozen);
337 Track::can_be_record_enabled ()
339 return !_record_safe_control->get_value() && _disk_writer && !_disk_writer->record_safe() && _session.writable() && (_freeze_record.state != Frozen);
343 Track::parameter_changed (string const & p)
345 if (p == "track-name-number") {
346 resync_track_name ();
348 else if (p == "track-name-take") {
349 resync_track_name ();
351 else if (p == "take-name") {
352 if (_session.config.get_track_name_take()) {
353 resync_track_name ();
359 Track::resync_track_name ()
365 Track::set_name (const string& str)
373 if (_record_enable_control->get_value()) {
374 /* when re-arm'ed the file (named after the track) is already ready to rolll */
378 string diskstream_name = "";
379 if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
380 // Note: any text is fine, legalize_for_path() fixes this later
381 diskstream_name += _session.config.get_take_name ();
382 diskstream_name += "_";
384 const int64_t tracknumber = track_number();
385 if (tracknumber > 0 && _session.config.get_track_name_number()) {
386 char num[64], fmt[10];
387 snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
388 snprintf(num, sizeof(num), fmt, tracknumber);
389 diskstream_name += num;
390 diskstream_name += "_";
392 diskstream_name += str;
394 if (diskstream_name == _diskstream_name) {
397 _diskstream_name = diskstream_name;
399 _disk_writer->set_write_source_name (diskstream_name);
401 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
403 if (_playlists[data_type()]->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
404 /* Only rename the diskstream (and therefore the playlist) if
405 a) the playlist has never had a region added to it and
406 b) there is only one playlist for this track.
408 If (a) is not followed, people can get confused if, say,
409 they have notes about a playlist with a given name and then
410 it changes (see mantis #4759).
412 If (b) is not followed, we rename the current playlist and not
413 the other ones, which is a bit confusing (see mantis #4977).
415 _disk_reader->set_name (str);
416 _disk_writer->set_name (str);
419 for (uint32_t n = 0; n < DataType::num_types; ++n) {
421 _playlists[n]->set_name (str);
425 /* save state so that the statefile fully reflects any filename changes */
427 if ((ret = Route::set_name (str)) == 0) {
428 _session.save_state ("");
435 Track::set_latency_compensation (framecnt_t longest_session_latency)
437 Route::set_latency_compensation (longest_session_latency);
438 _disk_reader->set_roll_delay (_roll_delay);
442 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
444 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
450 bool can_record = _session.actively_recording ();
452 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
454 if (n_outputs().n_total() == 0 && !ARDOUR::Profile->get_mixbus()) {
455 //Note: Mixbus has its own output mechanism, so we should operate even if no explicit outputs are assigned
459 /* not active ... do the minimum possible by just outputting silence */
463 if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled())) {
469 if (session_state_changing) {
470 if (_session.transport_speed() != 0.0f) {
471 /* we're rolling but some state is changing (e.g. our
472 disk reader contents) so we cannot use them. Be
473 silent till this is over. Don't declick.
475 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
477 passthru_silence (start_frame, end_frame, nframes, 0);
480 /* we're really not rolling, so we're either delivery silence or actually
481 monitoring, both of which are safe to do while session_state_changing is true.
485 _disk_writer->check_record_status (start_frame, can_record);
489 MonitorState const s = monitoring_state ();
490 /* we are not rolling, so be silent even if we are monitoring disk, as there
491 will be no disk data coming in.
494 case MonitoringSilence:
500 case MonitoringInput:
508 //if we have an internal generator, let it play regardless of monitoring state
509 if (_have_internal_generator) {
513 _amp->apply_gain_automation (false);
515 /* if have_internal_generator, or .. */
519 if (_meter_point == MeterInput) {
520 /* still need input monitoring and metering */
522 bool const track_rec = _disk_writer->record_enabled ();
523 bool const auto_input = _session.config.get_auto_input ();
524 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
525 bool const tape_machine_mode = Config->get_tape_machine_mode ();
526 bool no_meter = false;
528 /* this needs a proper K-map
529 * and should be separated into a function similar to monitoring_state()
530 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
532 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
534 if (!auto_input && !track_rec) {
537 else if (tape_machine_mode && !track_rec && auto_input) {
540 else if (!software_monitor && tape_machine_mode && !track_rec) {
543 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
548 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
549 _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
550 _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, _session.transport_speed(), nframes);
552 _input->process_input (_meter, start_frame, end_frame, _session.transport_speed(), nframes);
556 passthru_silence (start_frame, end_frame, nframes, 0);
560 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
562 fill_buffers_with_input (bufs, _input, nframes);
564 if (_meter_point == MeterInput) {
565 _meter->run (bufs, start_frame, end_frame, _session.transport_speed(), nframes, true);
568 passthru (bufs, start_frame, end_frame, nframes, false);
571 flush_processor_buffers_locked (nframes);
577 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
579 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
581 // XXX DISK reader needs to seek ahead the correct distance ?? OR DOES IT ?
582 //framecnt_t playback_distance = _disk_reader->calculate_playback_distance(nframes);
583 //if (can_internal_playback_seek(playback_distance)) {
584 // internal_playback_seek(playback_distance);
589 if (n_outputs().n_total() == 0 && _processors.empty()) {
599 _amp->apply_gain_automation(false);
602 flush_processor_buffers_locked (nframes);
604 //BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
605 // XXXX DISKWRITER/READER ADVANCE, SET need_butler
609 boost::shared_ptr<Playlist>
612 return _playlists[data_type()];
616 Track::request_input_monitoring (bool m)
618 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
619 AudioEngine::instance()->request_input_monitoring ((*i)->name(), m);
624 Track::ensure_input_monitoring (bool m)
626 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
627 AudioEngine::instance()->ensure_input_monitoring ((*i)->name(), m);
632 Track::destructive () const
634 return _disk_writer->destructive ();
637 list<boost::shared_ptr<Source> > &
638 Track::last_capture_sources ()
640 return _disk_writer->last_capture_sources ();
644 Track::update_latency_information ()
646 Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
647 framecnt_t chain_latency = _input->latency ();
649 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
650 (*p)->set_input_latency (chain_latency);
651 chain_latency += (*p)->signal_latency ();
656 Track::steal_write_source_name()
658 return _disk_writer->steal_write_source_name ();
662 Track::reset_write_sources (bool r, bool force)
664 _disk_writer->reset_write_sources (r, force);
668 Track::playback_buffer_load () const
670 return _disk_reader->buffer_load ();
674 Track::capture_buffer_load () const
676 return _disk_writer->buffer_load ();
682 return _disk_reader->do_refill ();
686 Track::do_flush (RunContext c, bool force)
688 return _disk_writer->do_flush (c, force);
692 Track::set_pending_overwrite (bool o)
694 _disk_reader->set_pending_overwrite (o);
698 Track::seek (framepos_t p, bool complete_refill)
700 if (_disk_reader->seek (p, complete_refill)) {
703 return _disk_writer->seek (p, complete_refill);
707 Track::can_internal_playback_seek (framecnt_t p)
709 return _disk_reader->can_internal_playback_seek (p);
713 Track::internal_playback_seek (framecnt_t p)
715 return _disk_reader->internal_playback_seek (p);
719 Track::non_realtime_locate (framepos_t p)
721 Route::non_realtime_locate (p);
723 if (!is_private_route()) {
724 /* don't waste i/o cycles and butler calls
725 for private tracks (e.g.auditioner)
727 _disk_reader->non_realtime_locate (p);
728 _disk_writer->non_realtime_locate (p);
733 Track::non_realtime_speed_change ()
735 _disk_reader->non_realtime_speed_change ();
739 Track::overwrite_existing_buffers ()
741 return _disk_reader->overwrite_existing_buffers ();
745 Track::get_captured_frames (uint32_t n) const
747 return _disk_writer->get_captured_frames (n);
751 Track::set_loop (Location* l)
753 if (_disk_reader->set_loop (l)) {
756 return _disk_writer->set_loop (l);
760 Track::transport_looped (framepos_t p)
762 return _disk_writer->transport_looped (p);
766 Track::realtime_speed_change ()
768 if (_disk_reader->realtime_speed_change ()) {
771 return _disk_writer->realtime_speed_change ();
775 Track::realtime_handle_transport_stopped ()
777 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
783 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
784 (*i)->realtime_handle_transport_stopped ();
789 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
791 _disk_writer->transport_stopped_wallclock (n, t, g);
795 Track::pending_overwrite () const
797 return _disk_reader->pending_overwrite ();
801 Track::prepare_to_stop (framepos_t t, framepos_t a)
803 _disk_writer->prepare_to_stop (t, a);
807 Track::set_slaved (bool s)
809 _disk_reader->set_slaved (s);
810 _disk_writer->set_slaved (s);
816 return _disk_reader->output_streams();
820 Track::get_capture_start_frame (uint32_t n) const
822 return _disk_writer->get_capture_start_frame (n);
826 Track::alignment_style () const
828 return _disk_writer->alignment_style ();
832 Track::alignment_choice () const
834 return _disk_writer->alignment_choice ();
838 Track::current_capture_start () const
840 return _disk_writer->current_capture_start ();
844 Track::current_capture_end () const
846 return _disk_writer->current_capture_end ();
850 Track::playlist_modified ()
852 _disk_reader->playlist_modified ();
856 Track::find_and_use_playlist (DataType dt, PBD::ID const & id)
858 boost::shared_ptr<Playlist> playlist;
860 if ((playlist = _session.playlists->by_id (id)) == 0) {
865 error << string_compose(_("DiskIOProcessor: \"%1\" isn't an playlist"), id.to_s()) << endmsg;
869 return use_playlist (dt, playlist);
873 Track::use_playlist (DataType dt, boost::shared_ptr<Playlist> p)
877 if ((ret = _disk_reader->use_playlist (dt, p)) == 0) {
878 if ((ret = _disk_writer->use_playlist (dt, p)) == 0) {
879 p->set_orig_track_id (id());
891 Track::use_copy_playlist ()
893 assert (_playlists[data_type()]);
895 if (_playlists[data_type()] == 0) {
896 error << string_compose(_("DiskIOProcessor %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
901 boost::shared_ptr<Playlist> playlist;
903 newname = Playlist::bump_name (_playlists[data_type()]->name(), _session);
905 if ((playlist = PlaylistFactory::create (_playlists[data_type()], newname)) == 0) {
909 playlist->reset_shares();
911 return use_playlist (data_type(), playlist);
915 Track::use_new_playlist (DataType dt)
918 boost::shared_ptr<Playlist> playlist = _playlists[dt];
921 newname = Playlist::bump_name (playlist->name(), _session);
923 newname = Playlist::bump_name (_name, _session);
926 playlist = PlaylistFactory::create (dt, _session, newname, is_private_route());
932 return use_playlist (dt, playlist);
936 Track::set_align_choice (AlignChoice ac, bool force)
940 _alignment_choice = Automatic;
941 set_align_choice_from_io ();
947 _disk_writer->set_align_choice (ac, force);
948 _alignment_choice = ac;
952 Track::set_align_style (AlignStyle s, bool force)
954 _disk_writer->set_align_style (s, force);
958 Track::set_align_choice_from_io ()
960 bool have_physical = false;
964 vector<string> connections;
965 boost::shared_ptr<Port> p;
969 p = _input->nth (n++);
975 if (p->get_connections (connections) != 0) {
976 if (AudioEngine::instance()->port_is_physical (connections[0])) {
977 have_physical = true;
982 connections.clear ();
987 // compensate for latency when bouncing from master or mixbus.
988 // we need to use "ExistingMaterial" to pick up the master bus' latency
989 // see also Route::direct_feeds_according_to_reality
991 ios.push_back (_input);
992 if (_session.master_out() && ios.fed_by (_session.master_out()->output())) {
993 have_physical = true;
995 for (uint32_t n = 0; n < NUM_MIXBUSES && !have_physical; ++n) {
996 if (_session.get_mixbus (n) && ios.fed_by (_session.get_mixbus(n)->output())) {
997 have_physical = true;
1002 if (have_physical) {
1003 _disk_writer->set_align_style (ExistingMaterial);
1005 _disk_writer->set_align_style (CaptureTime);
1010 Track::set_block_size (pframes_t n)
1012 Route::set_block_size (n);
1013 _disk_reader->set_block_size (n);
1014 _disk_writer->set_block_size (n);
1018 Track::adjust_playback_buffering ()
1021 _disk_reader->adjust_buffering ();
1026 Track::adjust_capture_buffering ()
1029 _disk_writer->adjust_buffering ();
1033 #ifdef USE_TRACKS_CODE_FEATURES
1035 /* This is the Tracks version of Track::monitoring_state().
1037 * Ardour developers: try to flag or fix issues if parts of the libardour API
1038 * change in ways that invalidate this
1042 Track::monitoring_state () const
1044 /* Explicit requests */
1046 if (_monitoring != MonitorInput) {
1047 return MonitoringInput;
1050 if (_monitoring & MonitorDisk) {
1051 return MonitoringDisk;
1054 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
1055 I don't think it's ever going to be too pretty too look at.
1058 // GZ: NOT USED IN TRACKS
1059 //bool const auto_input = _session.config.get_auto_input ();
1060 //bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
1061 //bool const tape_machine_mode = Config->get_tape_machine_mode ();
1063 bool const roll = _session.transport_rolling ();
1064 bool const track_rec = _diskstream->record_enabled ();
1065 bool session_rec = _session.actively_recording ();
1069 if (!session_rec && roll) {
1070 return MonitoringDisk;
1072 return MonitoringInput;
1078 return MonitoringDisk;
1082 return MonitoringSilence;
1087 /* This is the Ardour/Mixbus version of Track::monitoring_state().
1089 * Tracks developers: do NOT modify this method under any circumstances.
1093 Track::monitoring_state () const
1095 /* Explicit requests */
1096 MonitorChoice m (_monitoring_control->monitoring_choice());
1098 if (m != MonitorAuto) {
1100 MonitorState ms ((MonitorState) 0);
1102 if (m & MonitorInput) {
1103 ms = MonitoringInput;
1106 if (m & MonitorDisk) {
1107 ms = MonitorState (ms | MonitoringDisk);
1113 switch (_session.config.get_session_monitoring ()) {
1115 return MonitoringDisk;
1118 return MonitoringInput;
1124 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
1125 I don't think it's ever going to be too pretty too look at.
1128 bool const roll = _session.transport_rolling ();
1129 bool const track_rec = _disk_writer->record_enabled ();
1130 bool const auto_input = _session.config.get_auto_input ();
1131 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
1132 bool const tape_machine_mode = Config->get_tape_machine_mode ();
1135 /* I suspect that just use actively_recording() is good enough all the
1136 * time, but just to keep the semantics the same as they were before
1137 * sept 26th 2012, we differentiate between the cases where punch is
1138 * enabled and those where it is not.
1140 * rg: I suspect this is not the case: monitoring may differ
1143 if (_session.config.get_punch_in() || _session.config.get_punch_out() || _session.preroll_record_punch_enabled ()) {
1144 session_rec = _session.actively_recording ();
1146 session_rec = _session.get_record_enabled();
1151 if (!session_rec && roll && auto_input) {
1152 return MonitoringDisk;
1154 return software_monitor ? MonitoringInput : MonitoringSilence;
1159 if (tape_machine_mode) {
1161 return MonitoringDisk;
1165 if (!roll && auto_input) {
1166 return software_monitor ? MonitoringInput : MonitoringSilence;
1168 return MonitoringDisk;
1174 abort(); /* NOTREACHED */
1175 return MonitoringSilence;
1181 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
1183 /* never declick if there is an internal generator - we just want it to
1184 keep generating sound without interruption.
1186 ditto if we are monitoring inputs.
1189 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
1194 declick = _pending_declick;
1198 Amp::declick (bufs, nframes, declick);
1203 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
1205 if (_roll_delay > nframes) {
1207 _roll_delay -= nframes;
1208 silence_unlocked (nframes);
1209 /* transport frame is not legal for caller to use */
1212 } else if (_roll_delay > 0) {
1214 nframes -= _roll_delay;
1215 silence_unlocked (_roll_delay);
1216 transport_frame += _roll_delay;
1218 /* shuffle all the port buffers for things that lead "out" of this Route
1219 to reflect that we just wrote _roll_delay frames of silence.
1222 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1223 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1224 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1226 iop->increment_port_buffer_offset (_roll_delay);
1229 _output->increment_port_buffer_offset (_roll_delay);
1239 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
1241 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1242 (*i)->monitoring_changed ();
1247 Track::metering_state () const
1250 if (_session.transport_rolling ()) {
1251 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1252 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled());
1254 // track no_roll() always metering if
1255 rv = _meter_point == MeterInput;
1257 return rv ? MeteringInput : MeteringRoute;
1261 Track::set_processor_state (XMLNode const & node, XMLProperty const* prop, ProcessorList& new_order, bool& must_configure)
1263 if (Route::set_processor_state (node, prop, new_order, must_configure)) {
1267 if (prop->value() == "diskreader") {
1269 _disk_reader->set_state (node, Stateful::current_state_version);
1270 new_order.push_back (_disk_reader);
1273 } else if (prop->value() == "diskwriter") {
1275 _disk_writer->set_state (node, Stateful::current_state_version);
1276 new_order.push_back (_disk_writer);
1281 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
1286 Track::use_captured_sources (SourceList& srcs, CaptureInfos const & capture_info)
1292 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1293 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1296 use_captured_audio_sources (srcs, capture_info);
1300 use_captured_midi_sources (srcs, capture_info);
1305 Track::use_captured_midi_sources (SourceList& srcs, CaptureInfos const & capture_info)
1307 if (srcs.empty() || data_type() != DataType::MIDI) {
1311 boost::shared_ptr<SMFSource> mfs = boost::dynamic_pointer_cast<SMFSource> (srcs.front());
1312 boost::shared_ptr<Playlist> pl = _playlists[DataType::MIDI];
1313 boost::shared_ptr<MidiRegion> midi_region;
1314 CaptureInfos::const_iterator ci;
1320 framecnt_t total_capture = 0;
1322 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1323 total_capture += (*ci)->frames;
1326 /* we will want to be able to keep (over)writing the source
1327 but we don't want it to be removable. this also differs
1328 from the audio situation, where the source at this point
1329 must be considered immutable. luckily, we can rely on
1330 MidiSource::mark_streaming_write_completed() to have
1331 already done the necessary work for that.
1334 string whole_file_region_name;
1335 whole_file_region_name = region_name_from_path (mfs->name(), true);
1337 /* Register a new region with the Session that
1338 describes the entire source. Do this first
1339 so that any sub-regions will obviously be
1340 children of this one (later!)
1346 plist.add (Properties::name, whole_file_region_name);
1347 plist.add (Properties::whole_file, true);
1348 plist.add (Properties::automatic, true);
1349 plist.add (Properties::start, 0);
1350 plist.add (Properties::length, total_capture);
1351 plist.add (Properties::layer, 0);
1353 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1355 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1356 midi_region->special_set_position (capture_info.front()->start);
1359 catch (failed_constructor& err) {
1360 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
1364 pl->clear_changes ();
1367 /* Session frame time of the initial capture in this pass, which is where the source starts */
1368 framepos_t initial_capture = 0;
1369 if (!capture_info.empty()) {
1370 initial_capture = capture_info.front()->start;
1373 BeatsFramesConverter converter (_session.tempo_map(), capture_info.front()->start);
1374 const framepos_t preroll_off = _session.preroll_record_trim_len ();
1376 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1380 RegionFactory::region_name (region_name, mfs->name(), false);
1382 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1383 _name, (*ci)->start, (*ci)->frames, region_name));
1386 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add a region\n";
1391 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1392 plist.add (Properties::start, (*ci)->start - initial_capture);
1393 plist.add (Properties::length, (*ci)->frames);
1394 plist.add (Properties::length_beats, converter.from((*ci)->frames).to_double());
1395 plist.add (Properties::name, region_name);
1397 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1398 midi_region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1399 if (preroll_off > 0) {
1400 midi_region->trim_front ((*ci)->start - initial_capture + preroll_off);
1404 catch (failed_constructor& err) {
1405 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1406 continue; /* XXX is this OK? */
1409 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1411 pl->add_region (midi_region, (*ci)->start + preroll_off);
1415 _session.add_command (new StatefulDiffCommand (pl));
1419 Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & capture_info)
1421 if (srcs.empty() || data_type() != DataType::AUDIO) {
1425 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (srcs.front());
1426 boost::shared_ptr<Playlist> pl = _playlists[DataType::AUDIO];
1427 boost::shared_ptr<AudioRegion> region;
1433 /* destructive tracks have a single, never changing region */
1435 if (destructive()) {
1437 /* send a signal that any UI can pick up to do the right thing. there is
1438 a small problem here in that a UI may need the peak data to be ready
1439 for the data that was recorded and this isn't interlocked with that
1440 process. this problem is deferred to the UI.
1443 pl->LayeringChanged(); // XXX this may not get the UI to do the right thing
1447 string whole_file_region_name;
1448 whole_file_region_name = region_name_from_path (afs->name(), true);
1450 /* Register a new region with the Session that
1451 describes the entire source. Do this first
1452 so that any sub-regions will obviously be
1453 children of this one (later!)
1459 plist.add (Properties::start, afs->last_capture_start_frame());
1460 plist.add (Properties::length, afs->length(0));
1461 plist.add (Properties::name, whole_file_region_name);
1462 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1463 rx->set_automatic (true);
1464 rx->set_whole_file (true);
1466 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1467 region->special_set_position (afs->natural_position());
1471 catch (failed_constructor& err) {
1472 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1476 pl->clear_changes ();
1477 pl->set_capture_insertion_in_progress (true);
1480 const framepos_t preroll_off = _session.preroll_record_trim_len ();
1481 framecnt_t buffer_position = afs->last_capture_start_frame ();
1482 CaptureInfos::const_iterator ci;
1484 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1488 RegionFactory::region_name (region_name, whole_file_region_name, false);
1490 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture bufpos %5 start @ %2 length %3 add new region %4\n",
1491 _name, (*ci)->start, (*ci)->frames, region_name, buffer_position));
1497 plist.add (Properties::start, buffer_position);
1498 plist.add (Properties::length, (*ci)->frames);
1499 plist.add (Properties::name, region_name);
1501 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1502 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1503 if (preroll_off > 0) {
1504 region->trim_front (buffer_position + preroll_off);
1508 catch (failed_constructor& err) {
1509 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1510 continue; /* XXX is this OK? */
1513 pl->add_region (region, (*ci)->start + preroll_off, 1, _disk_writer->non_layered());
1514 pl->set_layer (region, DBL_MAX);
1516 buffer_position += (*ci)->frames;
1520 pl->set_capture_insertion_in_progress (false);
1521 _session.add_command (new StatefulDiffCommand (pl));
1525 __attribute__((annotate("realtime")))
1528 Track::setup_invisible_processors_oh_children_of_mine (ProcessorList& processors)
1530 ProcessorList::iterator insert_pos;
1532 switch (_disk_io_point) {
1533 case DiskIOPreFader:
1534 insert_pos = find (processors.begin(), processors.end(), _trim);
1535 if (insert_pos != processors.end()) {
1536 insert_pos = processors.insert (insert_pos, _disk_writer);
1537 processors.insert (insert_pos, _disk_reader);
1540 case DiskIOPostFader:
1541 insert_pos = find (processors.begin(), processors.end(), _main_outs);
1542 if (insert_pos != processors.end()) {
1543 insert_pos = processors.insert (insert_pos, _disk_writer);
1544 processors.insert (insert_pos, _disk_reader);
1552 Track::set_disk_io_position (DiskIOPoint diop)
1554 bool display = false;
1564 _disk_writer->set_display_to_user (display);
1565 _disk_reader->set_display_to_user (display);
1567 const bool changed = (diop != _disk_io_point);
1569 _disk_io_point = diop;
1572 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1573 configure_processors (0);
1576 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */