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/debug.h"
22 #include "ardour/delivery.h"
23 #include "ardour/diskstream.h"
24 #include "ardour/event_type_map.h"
25 #include "ardour/io_processor.h"
26 #include "ardour/meter.h"
27 #include "ardour/monitor_control.h"
28 #include "ardour/playlist.h"
29 #include "ardour/port.h"
30 #include "ardour/processor.h"
31 #include "ardour/profile.h"
32 #include "ardour/record_enable_control.h"
33 #include "ardour/record_safe_control.h"
34 #include "ardour/route_group_specialized.h"
35 #include "ardour/session.h"
36 #include "ardour/session_playlists.h"
37 #include "ardour/track.h"
38 #include "ardour/types_convert.h"
39 #include "ardour/utils.h"
44 using namespace ARDOUR;
47 Track::Track (Session& sess, string name, PresentationInfo::Flag flag, TrackMode mode, DataType default_type)
48 : Route (sess, name, flag, default_type)
49 , _saved_meter_point (_meter_point)
52 _freeze_record.state = NoFreeze;
58 DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
68 boost::shared_ptr<Route> rp (shared_from_this());
69 boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
71 _record_enable_control.reset (new RecordEnableControl (_session, EventTypeMap::instance().to_symbol (RecEnableAutomation), *this));
72 add_control (_record_enable_control);
74 _record_safe_control.reset (new RecordSafeControl (_session, EventTypeMap::instance().to_symbol (RecSafeAutomation), *this));
75 add_control (_record_safe_control);
77 _monitoring_control.reset (new MonitorControl (_session, EventTypeMap::instance().to_symbol (MonitoringAutomation), *this));
78 add_control (_monitoring_control);
80 _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
82 _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2));
83 _record_safe_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_safe_changed, this, _1, _2));
84 _record_enable_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_enable_changed, this, _1, _2));
90 Track::use_new_diskstream ()
92 boost::shared_ptr<Diskstream> ds = create_diskstream ();
94 ds->do_refill_with_alloc ();
95 ds->set_block_size (_session.get_block_size ());
96 ds->playlist()->set_orig_track_id (id());
108 Track::state (bool full)
110 XMLNode& root (Route::state (full));
112 root.add_child_nocopy (_monitoring_control->get_state ());
113 root.add_child_nocopy (_record_safe_control->get_state ());
114 root.add_child_nocopy (_record_enable_control->get_state ());
116 root.set_property (X_("saved-meter-point"), _saved_meter_point);
117 root.add_child_nocopy (_diskstream->get_state ());
123 Track::set_state (const XMLNode& node, int version)
125 if (Route::set_state (node, version)) {
131 if (version >= 3000) {
132 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
133 boost::shared_ptr<Diskstream> ds = diskstream_factory (*child);
134 ds->do_refill_with_alloc ();
140 _diskstream->playlist()->set_orig_track_id (id());
143 /* set rec-enable control *AFTER* setting up diskstream, because it may
144 want to operate on the diskstream as it sets its own state
147 XMLNodeList nlist = node.children();
148 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
151 if (child->name() == Controllable::xml_node_name) {
153 if (!child->get_property ("name", name)) {
157 if (name == _record_enable_control->name()) {
158 _record_enable_control->set_state (*child, version);
159 } else if (name == _record_safe_control->name()) {
160 _record_safe_control->set_state (*child, version);
161 } else if (name == _monitoring_control->name()) {
162 _monitoring_control->set_state (*child, version);
167 /* convert old 3001 state */
168 std::string monitoring;
169 if (node.get_property (X_("monitoring"), monitoring)) {
170 XMLNode mon_node ("backwardscompat");
171 mon_node.set_property (X_("monitoring"), monitoring);
172 _monitoring_control->set_state (mon_node, version);
175 if (!node.get_property (X_("saved-meter-point"), _saved_meter_point)) {
176 _saved_meter_point = _meter_point;
183 Track::get_template ()
185 return state (false);
188 Track::FreezeRecord::~FreezeRecord ()
190 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
196 Track::freeze_state() const
198 return _freeze_record.state;
204 bool will_record = true;
205 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
214 Track::prep_record_enabled (bool yn)
216 if (yn && _record_safe_control->get_value()) {
220 if (!can_be_record_enabled()) {
224 /* keep track of the meter point as it was before we rec-enabled */
225 if (!_diskstream->record_enabled()) {
226 _saved_meter_point = _meter_point;
232 will_follow = _diskstream->prep_record_enable ();
234 will_follow = _diskstream->prep_record_disable ();
239 if (_meter_point != MeterCustom) {
240 set_meter_point (MeterInput);
243 set_meter_point (_saved_meter_point);
251 Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
253 _diskstream->set_record_enabled (_record_enable_control->get_value());
257 Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
259 _diskstream->set_record_safe (_record_safe_control->get_value());
263 Track::can_be_record_safe ()
265 return !_record_enable_control->get_value() && _diskstream && _session.writable() && (_freeze_record.state != Frozen);
269 Track::can_be_record_enabled ()
271 return !_record_safe_control->get_value() && _diskstream && !_diskstream->record_safe() && _session.writable() && (_freeze_record.state != Frozen);
275 Track::parameter_changed (string const & p)
277 if (p == "track-name-number") {
278 resync_track_name ();
280 else if (p == "track-name-take") {
281 resync_track_name ();
283 else if (p == "take-name") {
284 if (_session.config.get_track_name_take()) {
285 resync_track_name ();
291 Track::resync_track_name ()
297 Track::set_name (const string& str)
305 if (_record_enable_control->get_value()) {
306 /* when re-arm'ed the file (named after the track) is already ready to rolll */
310 string diskstream_name = "";
311 if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
312 // Note: any text is fine, legalize_for_path() fixes this later
313 diskstream_name += _session.config.get_take_name ();
314 diskstream_name += "_";
316 const int64_t tracknumber = track_number();
317 if (tracknumber > 0 && _session.config.get_track_name_number()) {
318 char num[64], fmt[10];
319 snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
320 snprintf(num, sizeof(num), fmt, tracknumber);
321 diskstream_name += num;
322 diskstream_name += "_";
324 diskstream_name += str;
326 if (diskstream_name == _diskstream_name) {
329 _diskstream_name = diskstream_name;
331 _diskstream->set_write_source_name (diskstream_name);
333 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
334 if (_diskstream->playlist()->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
335 /* Only rename the diskstream (and therefore the playlist) if
336 a) the playlist has never had a region added to it and
337 b) there is only one playlist for this track.
339 If (a) is not followed, people can get confused if, say,
340 they have notes about a playlist with a given name and then
341 it changes (see mantis #4759).
343 If (b) is not followed, we rename the current playlist and not
344 the other ones, which is a bit confusing (see mantis #4977).
346 _diskstream->set_name (str);
349 /* save state so that the statefile fully reflects any filename changes */
351 if ((ret = Route::set_name (str)) == 0) {
352 _session.save_state ("");
359 Track::set_latency_compensation (framecnt_t longest_session_latency)
361 Route::set_latency_compensation (longest_session_latency);
362 _diskstream->set_roll_delay (_roll_delay);
366 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
368 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
374 bool can_record = _session.actively_recording ();
376 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
378 if (n_outputs().n_total() == 0 && !ARDOUR::Profile->get_mixbus()) {
379 //Note: Mixbus has its own output mechanism, so we should operate even if no explicit outputs are assigned
383 /* not active ... do the minimum possible by just outputting silence */
387 if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
393 if (session_state_changing) {
394 if (_session.transport_speed() != 0.0f) {
395 /* we're rolling but some state is changing (e.g. our diskstream contents)
396 so we cannot use them. Be silent till this is over. Don't declick.
398 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
400 passthru_silence (start_frame, end_frame, nframes, 0);
403 /* we're really not rolling, so we're either delivery silence or actually
404 monitoring, both of which are safe to do while session_state_changing is true.
408 _diskstream->check_record_status (start_frame, can_record);
412 MonitorState const s = monitoring_state ();
413 /* we are not rolling, so be silent even if we are monitoring disk, as there
414 will be no disk data coming in.
417 case MonitoringSilence:
423 case MonitoringInput:
431 //if we have an internal generator, let it play regardless of monitoring state
432 if (_have_internal_generator) {
436 _amp->apply_gain_automation (false);
438 /* if have_internal_generator, or .. */
442 if (_meter_point == MeterInput) {
443 /* still need input monitoring and metering */
445 bool const track_rec = _diskstream->record_enabled ();
446 bool const auto_input = _session.config.get_auto_input ();
447 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
448 bool const tape_machine_mode = Config->get_tape_machine_mode ();
449 bool no_meter = false;
451 /* this needs a proper K-map
452 * and should be separated into a function similar to monitoring_state()
453 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
455 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
457 if (!auto_input && !track_rec) {
460 else if (tape_machine_mode && !track_rec && auto_input) {
463 else if (!software_monitor && tape_machine_mode && !track_rec) {
466 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
471 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
472 _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
473 _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, speed(), nframes);
475 _input->process_input (_meter, start_frame, end_frame, speed(), nframes);
479 passthru_silence (start_frame, end_frame, nframes, 0);
483 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
485 fill_buffers_with_input (bufs, _input, nframes);
487 if (_meter_point == MeterInput) {
488 _meter->run (bufs, start_frame, end_frame, 1.0 /*speed()*/, nframes, true);
491 passthru (bufs, start_frame, end_frame, nframes, false);
494 flush_processor_buffers_locked (nframes);
500 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
502 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
504 framecnt_t playback_distance = _diskstream->calculate_playback_distance(nframes);
505 if (can_internal_playback_seek(playback_distance)) {
506 internal_playback_seek(playback_distance);
511 if (n_outputs().n_total() == 0 && _processors.empty()) {
521 _amp->apply_gain_automation(false);
524 flush_processor_buffers_locked (nframes);
526 framecnt_t playback_distance;
528 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
530 int const dret = _diskstream->process (bufs, _session.transport_frame(), nframes, playback_distance, false);
531 need_butler = _diskstream->commit (playback_distance);
536 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
540 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
541 diskstream_playlist_changed ();
542 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
543 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
547 Track::diskstream_playlist_changed ()
549 PlaylistChanged (); /* EMIT SIGNAL */
553 Track::diskstream_speed_changed ()
555 SpeedChanged (); /* EMIT SIGNAL */
559 Track::diskstream_alignment_style_changed ()
561 AlignmentStyleChanged (); /* EMIT SIGNAL */
564 boost::shared_ptr<Playlist>
567 return _diskstream->playlist ();
571 Track::request_input_monitoring (bool m)
573 _diskstream->request_input_monitoring (m);
577 Track::ensure_input_monitoring (bool m)
579 _diskstream->ensure_input_monitoring (m);
583 Track::destructive () const
585 return _diskstream->destructive ();
588 list<boost::shared_ptr<Source> > &
589 Track::last_capture_sources ()
591 return _diskstream->last_capture_sources ();
595 Track::set_capture_offset ()
597 _diskstream->set_capture_offset ();
601 Track::steal_write_source_name()
603 return _diskstream->steal_write_source_name ();
607 Track::reset_write_sources (bool r, bool force)
609 _diskstream->reset_write_sources (r, force);
613 Track::playback_buffer_load () const
615 return _diskstream->playback_buffer_load ();
619 Track::capture_buffer_load () const
621 return _diskstream->capture_buffer_load ();
627 return _diskstream->do_refill ();
631 Track::do_flush (RunContext c, bool force)
633 return _diskstream->do_flush (c, force);
637 Track::set_pending_overwrite (bool o)
639 _diskstream->set_pending_overwrite (o);
643 Track::seek (framepos_t p, bool complete_refill)
645 return _diskstream->seek (p, complete_refill);
649 Track::hidden () const
651 return _diskstream->hidden ();
655 Track::can_internal_playback_seek (framecnt_t p)
657 return _diskstream->can_internal_playback_seek (p);
661 Track::internal_playback_seek (framecnt_t p)
663 return _diskstream->internal_playback_seek (p);
667 Track::non_realtime_input_change ()
669 _diskstream->non_realtime_input_change ();
673 Track::non_realtime_locate (framepos_t p)
675 Route::non_realtime_locate (p);
678 /* don't waste i/o cycles and butler calls
679 for hidden (secret) tracks
681 _diskstream->non_realtime_locate (p);
686 Track::non_realtime_set_speed ()
688 _diskstream->non_realtime_set_speed ();
692 Track::overwrite_existing_buffers ()
694 return _diskstream->overwrite_existing_buffers ();
698 Track::get_captured_frames (uint32_t n) const
700 return _diskstream->get_captured_frames (n);
704 Track::set_loop (Location* l)
706 return _diskstream->set_loop (l);
710 Track::transport_looped (framepos_t p)
712 _diskstream->transport_looped (p);
716 Track::realtime_set_speed (double s, bool g)
718 return _diskstream->realtime_set_speed (s, g);
722 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
724 _diskstream->transport_stopped_wallclock (n, t, g);
728 Track::pending_overwrite () const
730 return _diskstream->pending_overwrite ();
734 Track::speed () const
736 return _diskstream->speed ();
740 Track::prepare_to_stop (framepos_t t, framepos_t a)
742 _diskstream->prepare_to_stop (t, a);
746 Track::set_slaved (bool s)
748 _diskstream->set_slaved (s);
754 return _diskstream->n_channels ();
758 Track::get_capture_start_frame (uint32_t n) const
760 return _diskstream->get_capture_start_frame (n);
764 Track::alignment_style () const
766 return _diskstream->alignment_style ();
770 Track::alignment_choice () const
772 return _diskstream->alignment_choice ();
776 Track::current_capture_start () const
778 return _diskstream->current_capture_start ();
782 Track::current_capture_end () const
784 return _diskstream->current_capture_end ();
788 Track::playlist_modified ()
790 _diskstream->playlist_modified ();
794 Track::use_playlist (boost::shared_ptr<Playlist> p)
796 int ret = _diskstream->use_playlist (p);
798 p->set_orig_track_id (id());
804 Track::use_copy_playlist ()
806 int ret = _diskstream->use_copy_playlist ();
809 _diskstream->playlist()->set_orig_track_id (id());
816 Track::use_new_playlist ()
818 int ret = _diskstream->use_new_playlist ();
821 _diskstream->playlist()->set_orig_track_id (id());
828 Track::set_align_style (AlignStyle s, bool force)
830 _diskstream->set_align_style (s, force);
834 Track::set_align_choice (AlignChoice s, bool force)
836 _diskstream->set_align_choice (s, force);
840 Track::using_diskstream_id (PBD::ID id) const
842 return (id == _diskstream->id ());
846 Track::set_block_size (pframes_t n)
848 Route::set_block_size (n);
849 _diskstream->set_block_size (n);
853 Track::adjust_playback_buffering ()
856 _diskstream->adjust_playback_buffering ();
861 Track::adjust_capture_buffering ()
864 _diskstream->adjust_capture_buffering ();
868 #ifdef USE_TRACKS_CODE_FEATURES
870 /* This is the Tracks version of Track::monitoring_state().
872 * Ardour developers: try to flag or fix issues if parts of the libardour API
873 * change in ways that invalidate this
877 Track::monitoring_state () const
879 /* Explicit requests */
881 if (_monitoring & MonitorInput) {
882 return MonitoringInput;
885 if (_monitoring & MonitorDisk) {
886 return MonitoringDisk;
889 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
890 I don't think it's ever going to be too pretty too look at.
893 // GZ: NOT USED IN TRACKS
894 //bool const auto_input = _session.config.get_auto_input ();
895 //bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
896 //bool const tape_machine_mode = Config->get_tape_machine_mode ();
898 bool const roll = _session.transport_rolling ();
899 bool const track_rec = _diskstream->record_enabled ();
900 bool session_rec = _session.actively_recording ();
904 if (!session_rec && roll) {
905 return MonitoringDisk;
907 return MonitoringInput;
913 return MonitoringDisk;
917 return MonitoringSilence;
922 /* This is the Ardour/Mixbus version of Track::monitoring_state().
924 * Tracks developers: do NOT modify this method under any circumstances.
928 Track::monitoring_state () const
930 /* Explicit requests */
931 MonitorChoice m (_monitoring_control->monitoring_choice());
933 if (m & MonitorInput) {
934 return MonitoringInput;
937 if (m & MonitorDisk) {
938 return MonitoringDisk;
941 switch (_session.config.get_session_monitoring ()) {
943 return MonitoringDisk;
946 return MonitoringInput;
952 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
953 I don't think it's ever going to be too pretty too look at.
956 bool const roll = _session.transport_rolling ();
957 bool const track_rec = _diskstream->record_enabled ();
958 bool const auto_input = _session.config.get_auto_input ();
959 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
960 bool const tape_machine_mode = Config->get_tape_machine_mode ();
963 /* I suspect that just use actively_recording() is good enough all the
964 * time, but just to keep the semantics the same as they were before
965 * sept 26th 2012, we differentiate between the cases where punch is
966 * enabled and those where it is not.
968 * rg: I suspect this is not the case: monitoring may differ
971 if (_session.config.get_punch_in() || _session.config.get_punch_out() || _session.preroll_record_punch_enabled ()) {
972 session_rec = _session.actively_recording ();
974 session_rec = _session.get_record_enabled();
979 if (!session_rec && roll && auto_input) {
980 return MonitoringDisk;
982 return software_monitor ? MonitoringInput : MonitoringSilence;
987 if (tape_machine_mode) {
989 return MonitoringDisk;
993 if (!roll && auto_input) {
994 return software_monitor ? MonitoringInput : MonitoringSilence;
996 return MonitoringDisk;
1002 abort(); /* NOTREACHED */
1003 return MonitoringSilence;
1009 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
1011 /* never declick if there is an internal generator - we just want it to
1012 keep generating sound without interruption.
1014 ditto if we are monitoring inputs.
1017 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
1022 declick = _pending_declick;
1026 Amp::declick (bufs, nframes, declick);
1031 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
1033 if (_roll_delay > nframes) {
1035 _roll_delay -= nframes;
1036 silence_unlocked (nframes);
1037 /* transport frame is not legal for caller to use */
1040 } else if (_roll_delay > 0) {
1042 nframes -= _roll_delay;
1043 silence_unlocked (_roll_delay);
1044 transport_frame += _roll_delay;
1046 /* shuffle all the port buffers for things that lead "out" of this Route
1047 to reflect that we just wrote _roll_delay frames of silence.
1050 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1051 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1052 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1054 iop->increment_port_buffer_offset (_roll_delay);
1057 _output->increment_port_buffer_offset (_roll_delay);
1067 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
1069 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1070 (*i)->monitoring_changed ();
1075 Track::metering_state () const
1078 if (_session.transport_rolling ()) {
1079 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1080 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled());
1082 // track no_roll() always metering if
1083 rv = _meter_point == MeterInput;
1085 return rv ? MeteringInput : MeteringRoute;