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/audioplaylist.h"
22 #include "ardour/audioregion.h"
23 #include "ardour/audiosource.h"
24 #include "ardour/debug.h"
25 #include "ardour/delivery.h"
26 #include "ardour/diskstream.h"
27 #include "ardour/io_processor.h"
28 #include "ardour/meter.h"
29 #include "ardour/port.h"
30 #include "ardour/processor.h"
31 #include "ardour/route_group_specialized.h"
32 #include "ardour/session.h"
33 #include "ardour/track.h"
34 #include "ardour/utils.h"
39 using namespace ARDOUR;
42 Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, DataType default_type)
43 : Route (sess, name, flag, default_type)
44 , _rec_enable_control (new RecEnableControllable(*this))
47 _freeze_record.state = NoFreeze;
48 _saved_meter_point = _meter_point;
54 DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
64 Track::get_template ()
70 Track::toggle_monitor_input ()
72 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
73 i->ensure_monitor_input(!i->monitoring_input());
78 Track::update_total_latency ()
80 nframes_t old = _output->effective_latency();
81 nframes_t own_latency = _output->user_latency();
83 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
84 if ((*i)->active ()) {
85 own_latency += (*i)->signal_latency ();
91 cerr << _name << ": internal redirect (final) latency = " << own_latency << endl;
94 _output->set_port_latency (own_latency);
96 if (old != own_latency) {
97 _output->set_latency_delay (own_latency);
98 signal_latency_changed (); /* EMIT SIGNAL */
101 return _output->effective_latency();
104 Track::FreezeRecord::~FreezeRecord ()
106 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
112 Track::freeze_state() const
114 return _freeze_record.state;
117 Track::RecEnableControllable::RecEnableControllable (Track& s)
118 : Controllable (X_("recenable")), track (s)
123 Track::RecEnableControllable::set_value (float val)
125 bool bval = ((val >= 0.5f) ? true: false);
126 track.set_record_enable (bval, this);
130 Track::RecEnableControllable::get_value (void) const
132 if (track.record_enabled()) { return 1.0f; }
137 Track::record_enabled () const
139 return _diskstream && _diskstream->record_enabled ();
145 bool will_record = true;
146 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
155 Track::set_record_enable (bool yn, void *src)
157 if (!_session.writable()) {
161 if (_freeze_record.state == Frozen) {
165 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
166 _route_group->apply (&Track::set_record_enable, yn, _route_group);
170 /* keep track of the meter point as it was before we rec-enabled */
171 if (!_diskstream->record_enabled()) {
172 _saved_meter_point = _meter_point;
175 _diskstream->set_record_enabled (yn);
177 if (_diskstream->record_enabled()) {
178 if (_meter_point != MeterCustom) {
179 set_meter_point (MeterInput, this);
182 set_meter_point (_saved_meter_point, this);
185 _rec_enable_control->Changed ();
190 Track::set_name (const string& str)
194 if (record_enabled() && _session.actively_recording()) {
195 /* this messes things up if done while recording */
199 if (_diskstream->set_name (str)) {
203 /* save state so that the statefile fully reflects any filename changes */
205 if ((ret = Route::set_name (str)) == 0) {
206 _session.save_state ("");
213 Track::set_latency_delay (nframes_t longest_session_latency)
215 Route::set_latency_delay (longest_session_latency);
216 _diskstream->set_roll_delay (_roll_delay);
220 Track::zero_diskstream_id_in_xml (XMLNode& node)
222 if (node.property ("diskstream-id")) {
223 node.add_property ("diskstream-id", "0");
228 Track::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
229 bool session_state_changing, bool can_record, bool /*rec_monitors_input*/)
231 if (n_outputs().n_total() == 0) {
240 if (session_state_changing) {
241 if (_session.transport_speed() != 0.0f) {
242 /* we're rolling but some state is changing (e.g. our diskstream contents)
243 so we cannot use them. Be silent till this is over. Don't declick.
245 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
247 passthru_silence (start_frame, end_frame, nframes, 0);
250 /* we're really not rolling, so we're either delivery silence or actually
251 monitoring, both of which are safe to do while session_state_changing is true.
255 diskstream()->check_record_status (start_frame, nframes, can_record);
259 if (_have_internal_generator) {
260 /* since the instrument has no input streams,
261 there is no reason to send any signal
266 if (!Config->get_tape_machine_mode()) {
268 ADATs work in a strange way..
269 they monitor input always when stopped.and auto-input is engaged.
271 if ((Config->get_monitoring_model() == SoftwareMonitoring)
272 && (_session.config.get_auto_input () || _diskstream->record_enabled())) {
273 send_silence = false;
279 Other machines switch to input on stop if the track is record enabled,
280 regardless of the auto input setting (auto input only changes the
281 monitoring state when the transport is rolling)
283 if ((Config->get_monitoring_model() == SoftwareMonitoring)
284 && _diskstream->record_enabled()) {
285 send_silence = false;
292 _amp->apply_gain_automation(false);
296 /* if we're sending silence, but we want the meters to show levels for the signal,
300 if (_have_internal_generator) {
301 passthru_silence (start_frame, end_frame, nframes, 0);
303 if (_meter_point == MeterInput) {
304 _input->process_input (_meter, start_frame, end_frame, nframes);
306 passthru_silence (start_frame, end_frame, nframes, 0);
311 /* we're sending signal, but we may still want to meter the input.
314 passthru (start_frame, end_frame, nframes, false);
317 _main_outs->flush (nframes, end_frame - start_frame - 1);
323 Track::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
324 bool can_record, bool rec_monitors_input)
326 if (n_outputs().n_total() == 0 && _processors.empty()) {
336 _amp->apply_gain_automation(false);
340 return diskstream()->process (_session.transport_frame(), nframes, can_record, rec_monitors_input);
344 Track::input_streams () const
346 ChanCount cc = _input->n_ports ();
348 cerr << "**************" << _name << " IS = " << cc << endl;
350 if (cc.n_total() == 0 && _diskstream) {
351 cerr << "*******" << _name << " use diskstream channel count\n";
352 return cc = _diskstream->n_channels();