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/io_processor.h"
25 #include "ardour/meter.h"
26 #include "ardour/playlist.h"
27 #include "ardour/port.h"
28 #include "ardour/processor.h"
29 #include "ardour/route_group_specialized.h"
30 #include "ardour/session.h"
31 #include "ardour/session_playlists.h"
32 #include "ardour/track.h"
33 #include "ardour/utils.h"
38 using namespace ARDOUR;
41 Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, DataType default_type)
42 : Route (sess, name, flag, default_type)
43 , _saved_meter_point (_meter_point)
45 , _monitoring (MonitorAuto)
47 _freeze_record.state = NoFreeze;
53 DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
63 boost::shared_ptr<Route> rp (shared_from_this());
64 boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
65 _rec_enable_control = boost::shared_ptr<RecEnableControl> (new RecEnableControl(rt));
66 _rec_enable_control->set_flags (Controllable::Toggle);
68 /* don't add rec_enable_control to controls because we don't want it to
69 * appear as an automatable parameter
71 track_number_changed.connect_same_thread (*this, boost::bind (&Track::resync_track_name, this));
72 _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
78 Track::use_new_diskstream ()
80 boost::shared_ptr<Diskstream> ds = create_diskstream ();
82 ds->do_refill_with_alloc ();
83 ds->set_block_size (_session.get_block_size ());
84 ds->playlist()->set_orig_track_id (id());
96 Track::state (bool full)
98 XMLNode& root (Route::state (full));
99 root.add_property (X_("monitoring"), enum_2_string (_monitoring));
100 root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point));
101 root.add_child_nocopy (_rec_enable_control->get_state());
102 root.add_child_nocopy (_diskstream->get_state ());
108 Track::set_state (const XMLNode& node, int version)
110 if (Route::set_state (node, version)) {
116 if (version >= 3000) {
117 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
118 boost::shared_ptr<Diskstream> ds = diskstream_factory (*child);
119 ds->do_refill_with_alloc ();
125 _diskstream->playlist()->set_orig_track_id (id());
128 /* set rec-enable control *AFTER* setting up diskstream, because it may
129 want to operate on the diskstream as it sets its own state
132 XMLNodeList nlist = node.children();
133 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
137 if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) {
138 if (prop->value() == X_("recenable")) {
139 _rec_enable_control->set_state (*child, version);
144 const XMLProperty* prop;
146 if ((prop = node.property (X_("monitoring"))) != 0) {
147 _monitoring = MonitorChoice (string_2_enum (prop->value(), _monitoring));
149 _monitoring = MonitorAuto;
152 if ((prop = node.property (X_("saved-meter-point"))) != 0) {
153 _saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point));
155 _saved_meter_point = _meter_point;
162 Track::get_template ()
164 return state (false);
167 Track::FreezeRecord::~FreezeRecord ()
169 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
175 Track::freeze_state() const
177 return _freeze_record.state;
180 Track::RecEnableControl::RecEnableControl (boost::shared_ptr<Track> t)
181 : AutomationControl (t->session(),
183 ParameterDescriptor(Evoral::Parameter(RecEnableAutomation)),
184 boost::shared_ptr<AutomationList>(),
188 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(RecEnableAutomation)));
193 Track::RecEnableControl::set_value (double val)
195 boost::shared_ptr<Track> t = track.lock ();
200 t->set_record_enabled (val >= 0.5 ? true : false, this);
204 Track::RecEnableControl::get_value () const
206 boost::shared_ptr<Track> t = track.lock ();
211 return (t->record_enabled() ? 1.0 : 0.0);
215 Track::record_enabled () const
217 return _diskstream && _diskstream->record_enabled ();
223 bool will_record = true;
224 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
233 Track::prep_record_enabled (bool yn, void *src)
235 if (!_session.writable()) {
239 if (_freeze_record.state == Frozen) {
243 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
244 _route_group->apply (&Track::prep_record_enabled, yn, _route_group);
248 /* keep track of the meter point as it was before we rec-enabled */
249 if (!_diskstream->record_enabled()) {
250 _saved_meter_point = _meter_point;
256 will_follow = _diskstream->prep_record_enable ();
258 will_follow = _diskstream->prep_record_disable ();
263 if (_meter_point != MeterCustom) {
264 set_meter_point (MeterInput);
267 set_meter_point (_saved_meter_point);
273 Track::set_record_enabled (bool yn, void *src)
275 if (!_session.writable()) {
279 if (_freeze_record.state == Frozen) {
283 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
284 _route_group->apply (&Track::set_record_enabled, yn, _route_group);
288 _diskstream->set_record_enabled (yn);
290 _rec_enable_control->Changed ();
294 Track::parameter_changed (string const & p)
296 if (p == "track-name-number") {
297 resync_track_name ();
299 else if (p == "track-name-take") {
300 resync_track_name ();
302 else if (p == "take-name") {
303 if (_session.config.get_track_name_take()) {
304 resync_track_name ();
310 Track::resync_track_name ()
316 Track::set_name (const string& str)
320 if (record_enabled() && _session.actively_recording()) {
321 /* this messes things up if done while recording */
325 string diskstream_name = "";
326 if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
327 // Note: any text is fine, legalize_for_path() fixes this later
328 diskstream_name += _session.config.get_take_name ();
329 diskstream_name += "_";
331 const int64_t tracknumber = track_number();
332 if (tracknumber > 0 && _session.config.get_track_name_number()) {
333 char num[64], fmt[10];
334 snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
335 snprintf(num, sizeof(num), fmt, tracknumber);
336 diskstream_name += num;
337 diskstream_name += "_";
339 diskstream_name += str;
341 if (diskstream_name == _diskstream_name) {
344 _diskstream_name = diskstream_name;
346 _diskstream->set_write_source_name (diskstream_name);
348 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
349 if (_diskstream->playlist()->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
350 /* Only rename the diskstream (and therefore the playlist) if
351 a) the playlist has never had a region added to it and
352 b) there is only one playlist for this track.
354 If (a) is not followed, people can get confused if, say,
355 they have notes about a playlist with a given name and then
356 it changes (see mantis #4759).
358 If (b) is not followed, we rename the current playlist and not
359 the other ones, which is a bit confusing (see mantis #4977).
361 _diskstream->set_name (str);
364 /* save state so that the statefile fully reflects any filename changes */
366 if ((ret = Route::set_name (str)) == 0) {
367 _session.save_state ("");
374 Track::set_latency_compensation (framecnt_t longest_session_latency)
376 Route::set_latency_compensation (longest_session_latency);
377 _diskstream->set_roll_delay (_roll_delay);
381 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
383 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
389 bool can_record = _session.actively_recording ();
391 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
393 if (n_outputs().n_total() == 0) {
397 /* not active ... do the minimum possible by just outputting silence */
401 if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
407 if (session_state_changing) {
408 if (_session.transport_speed() != 0.0f) {
409 /* we're rolling but some state is changing (e.g. our diskstream contents)
410 so we cannot use them. Be silent till this is over. Don't declick.
412 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
414 passthru_silence (start_frame, end_frame, nframes, 0);
417 /* we're really not rolling, so we're either delivery silence or actually
418 monitoring, both of which are safe to do while session_state_changing is true.
422 _diskstream->check_record_status (start_frame, can_record);
426 MonitorState const s = monitoring_state ();
427 /* we are not rolling, so be silent even if we are monitoring disk, as there
428 will be no disk data coming in.
431 case MonitoringSilence:
437 case MonitoringInput:
445 //if we have an internal generator, let it play regardless of monitoring state
446 if (_have_internal_generator) {
450 _amp->apply_gain_automation (false);
452 /* if have_internal_generator, or .. */
456 if (_meter_point == MeterInput) {
457 /* still need input monitoring and metering */
459 bool const track_rec = _diskstream->record_enabled ();
460 bool const auto_input = _session.config.get_auto_input ();
461 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
462 bool const tape_machine_mode = Config->get_tape_machine_mode ();
463 bool no_meter = false;
465 /* this needs a proper K-map
466 * and should be separated into a function similar to monitoring_state()
467 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
469 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
471 if (!auto_input && !track_rec) {
474 else if (tape_machine_mode && !track_rec && auto_input) {
477 else if (!software_monitor && tape_machine_mode && !track_rec) {
480 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
485 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
486 _meter->run (bufs, 0, 0, nframes, true);
487 _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, nframes);
489 _input->process_input (_meter, start_frame, end_frame, nframes);
493 passthru_silence (start_frame, end_frame, nframes, 0);
497 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
499 fill_buffers_with_input (bufs, _input, nframes);
501 if (_meter_point == MeterInput) {
502 _meter->run (bufs, start_frame, end_frame, nframes, true);
505 passthru (bufs, start_frame, end_frame, nframes, false);
508 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
509 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
511 d->flush_buffers (nframes);
519 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
521 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
523 framecnt_t playback_distance = _diskstream->calculate_playback_distance(nframes);
524 if (can_internal_playback_seek(playback_distance)) {
525 internal_playback_seek(playback_distance);
530 if (n_outputs().n_total() == 0 && _processors.empty()) {
540 _amp->apply_gain_automation(false);
544 framecnt_t playback_distance;
546 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
548 int const dret = _diskstream->process (bufs, _session.transport_frame(), nframes, playback_distance, false);
549 need_butler = _diskstream->commit (playback_distance);
554 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
558 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
559 diskstream_playlist_changed ();
560 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
561 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
562 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
566 Track::diskstream_playlist_changed ()
568 PlaylistChanged (); /* EMIT SIGNAL */
572 Track::diskstream_record_enable_changed ()
574 RecordEnableChanged (); /* EMIT SIGNAL */
578 Track::diskstream_speed_changed ()
580 SpeedChanged (); /* EMIT SIGNAL */
584 Track::diskstream_alignment_style_changed ()
586 AlignmentStyleChanged (); /* EMIT SIGNAL */
589 boost::shared_ptr<Playlist>
592 return _diskstream->playlist ();
596 Track::request_input_monitoring (bool m)
598 _diskstream->request_input_monitoring (m);
602 Track::ensure_input_monitoring (bool m)
604 _diskstream->ensure_input_monitoring (m);
608 Track::destructive () const
610 return _diskstream->destructive ();
613 list<boost::shared_ptr<Source> > &
614 Track::last_capture_sources ()
616 return _diskstream->last_capture_sources ();
620 Track::set_capture_offset ()
622 _diskstream->set_capture_offset ();
626 Track::steal_write_source_name()
628 return _diskstream->steal_write_source_name ();
632 Track::reset_write_sources (bool r, bool force)
634 _diskstream->reset_write_sources (r, force);
638 Track::playback_buffer_load () const
640 return _diskstream->playback_buffer_load ();
644 Track::capture_buffer_load () const
646 return _diskstream->capture_buffer_load ();
652 return _diskstream->do_refill ();
656 Track::do_flush (RunContext c, bool force)
658 return _diskstream->do_flush (c, force);
662 Track::set_pending_overwrite (bool o)
664 _diskstream->set_pending_overwrite (o);
668 Track::seek (framepos_t p, bool complete_refill)
670 return _diskstream->seek (p, complete_refill);
674 Track::hidden () const
676 return _diskstream->hidden ();
680 Track::can_internal_playback_seek (framecnt_t p)
682 return _diskstream->can_internal_playback_seek (p);
686 Track::internal_playback_seek (framecnt_t p)
688 return _diskstream->internal_playback_seek (p);
692 Track::non_realtime_input_change ()
694 _diskstream->non_realtime_input_change ();
698 Track::non_realtime_locate (framepos_t p)
700 Route::non_realtime_locate (p);
703 /* don't waste i/o cycles and butler calls
704 for hidden (secret) tracks
706 _diskstream->non_realtime_locate (p);
711 Track::non_realtime_set_speed ()
713 _diskstream->non_realtime_set_speed ();
717 Track::overwrite_existing_buffers ()
719 return _diskstream->overwrite_existing_buffers ();
723 Track::get_captured_frames (uint32_t n) const
725 return _diskstream->get_captured_frames (n);
729 Track::set_loop (Location* l)
731 return _diskstream->set_loop (l);
735 Track::transport_looped (framepos_t p)
737 _diskstream->transport_looped (p);
741 Track::realtime_set_speed (double s, bool g)
743 return _diskstream->realtime_set_speed (s, g);
747 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
749 _diskstream->transport_stopped_wallclock (n, t, g);
753 Track::pending_overwrite () const
755 return _diskstream->pending_overwrite ();
759 Track::speed () const
761 return _diskstream->speed ();
765 Track::prepare_to_stop (framepos_t t, framepos_t a)
767 _diskstream->prepare_to_stop (t, a);
771 Track::set_slaved (bool s)
773 _diskstream->set_slaved (s);
779 return _diskstream->n_channels ();
783 Track::get_capture_start_frame (uint32_t n) const
785 return _diskstream->get_capture_start_frame (n);
789 Track::alignment_style () const
791 return _diskstream->alignment_style ();
795 Track::alignment_choice () const
797 return _diskstream->alignment_choice ();
801 Track::current_capture_start () const
803 return _diskstream->current_capture_start ();
807 Track::current_capture_end () const
809 return _diskstream->current_capture_end ();
813 Track::playlist_modified ()
815 _diskstream->playlist_modified ();
819 Track::use_playlist (boost::shared_ptr<Playlist> p)
821 int ret = _diskstream->use_playlist (p);
823 p->set_orig_track_id (id());
829 Track::use_copy_playlist ()
831 int ret = _diskstream->use_copy_playlist ();
834 _diskstream->playlist()->set_orig_track_id (id());
841 Track::use_new_playlist ()
843 int ret = _diskstream->use_new_playlist ();
846 _diskstream->playlist()->set_orig_track_id (id());
853 Track::set_align_style (AlignStyle s, bool force)
855 _diskstream->set_align_style (s, force);
859 Track::set_align_choice (AlignChoice s, bool force)
861 _diskstream->set_align_choice (s, force);
865 Track::using_diskstream_id (PBD::ID id) const
867 return (id == _diskstream->id ());
871 Track::set_block_size (pframes_t n)
873 Route::set_block_size (n);
874 _diskstream->set_block_size (n);
878 Track::adjust_playback_buffering ()
881 _diskstream->adjust_playback_buffering ();
886 Track::adjust_capture_buffering ()
889 _diskstream->adjust_capture_buffering ();
894 Track::monitoring_state () const
896 /* Explicit requests */
898 if (_monitoring & MonitorInput) {
899 return MonitoringInput;
902 if (_monitoring & MonitorDisk) {
903 return MonitoringDisk;
906 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
907 I don't think it's ever going to be too pretty too look at.
910 bool const roll = _session.transport_rolling ();
911 bool const track_rec = _diskstream->record_enabled ();
912 bool const auto_input = _session.config.get_auto_input ();
913 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
914 bool const tape_machine_mode = Config->get_tape_machine_mode ();
917 /* I suspect that just use actively_recording() is good enough all the
918 * time, but just to keep the semantics the same as they were before
919 * sept 26th 2012, we differentiate between the cases where punch is
920 * enabled and those where it is not.
923 if (_session.config.get_punch_in() || _session.config.get_punch_out()) {
924 session_rec = _session.actively_recording ();
926 session_rec = _session.get_record_enabled();
931 if (!session_rec && roll && auto_input) {
932 return MonitoringDisk;
934 return software_monitor ? MonitoringInput : MonitoringSilence;
939 if (tape_machine_mode) {
941 return MonitoringDisk;
945 if (!roll && auto_input) {
946 return software_monitor ? MonitoringInput : MonitoringSilence;
948 return MonitoringDisk;
954 abort(); /* NOTREACHED */
955 return MonitoringSilence;
959 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
961 /* never declick if there is an internal generator - we just want it to
962 keep generating sound without interruption.
964 ditto if we are monitoring inputs.
967 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
972 declick = _pending_declick;
976 Amp::declick (bufs, nframes, declick);
981 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
983 if (_roll_delay > nframes) {
985 _roll_delay -= nframes;
986 silence_unlocked (nframes);
987 /* transport frame is not legal for caller to use */
990 } else if (_roll_delay > 0) {
992 nframes -= _roll_delay;
993 silence_unlocked (_roll_delay);
994 transport_frame += _roll_delay;
996 /* shuffle all the port buffers for things that lead "out" of this Route
997 to reflect that we just wrote _roll_delay frames of silence.
1000 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1001 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1002 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1004 iop->increment_port_buffer_offset (_roll_delay);
1007 _output->increment_port_buffer_offset (_roll_delay);
1017 Track::set_monitoring (MonitorChoice mc)
1019 if (mc != _monitoring) {
1022 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1023 (*i)->monitoring_changed ();
1026 MonitoringChanged (); /* EMIT SIGNAL */
1031 Track::metering_state () const
1034 if (_session.transport_rolling ()) {
1035 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1036 rv = _meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled());
1038 // track no_roll() always metering if
1039 rv = _meter_point == MeterInput;
1041 return rv ? MeteringInput : MeteringRoute;