summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/route.h10
-rw-r--r--libs/ardour/ardour/track.h2
-rw-r--r--libs/ardour/route.cc54
-rw-r--r--libs/ardour/track.cc124
4 files changed, 20 insertions, 170 deletions
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index 83de9c6753..1437fd79ed 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -597,10 +597,6 @@ protected:
virtual int no_roll_unlocked (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool session_state_changing);
- void fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes);
-
- void passthru (BufferSet&, samplepos_t start_sample, samplepos_t end_sample, pframes_t nframes, int declick, bool gain_automation_ok, bool run_disk_reader);
-
virtual void write_out_of_band_data (BufferSet& /* bufs */, samplepos_t /* start_sample */, samplepos_t /* end_sample */, samplecnt_t /* nframes */) {}
void process_output_buffers (BufferSet& bufs,
@@ -680,9 +676,6 @@ protected:
int configure_processors (ProcessorStreams*);
- void passthru_silence (samplepos_t start_sample, samplepos_t end_sample,
- pframes_t nframes, int declick);
-
void silence (samplecnt_t);
void silence_unlocked (samplecnt_t);
@@ -747,6 +740,9 @@ private:
pframes_t latency_preroll (pframes_t nframes, samplepos_t& start_sample, samplepos_t& end_sample);
+ void run_route (samplepos_t start_sample, samplepos_t end_sample, pframes_t nframes, int declick, bool gain_automation_ok, bool run_disk_reader);
+ void fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes);
+
void reset_instrument_info ();
void solo_control_changed (bool self, PBD::Controllable::GroupControlDisposition);
void maybe_note_meter_position ();
diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h
index c468f26035..74b04b82a7 100644
--- a/libs/ardour/ardour/track.h
+++ b/libs/ardour/ardour/track.h
@@ -65,8 +65,6 @@ class LIBARDOUR_API Track : public Route, public Recordable
bool set_processor_state (XMLNode const & node, XMLProperty const* prop, ProcessorList& new_order, bool& must_configure);
- virtual int no_roll_unlocked (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool state_changing);
-
bool needs_butler() const { return _needs_butler; }
bool can_record();
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index 18d5e945e5..73b3ee7662 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -678,14 +678,18 @@ void
Route::monitor_run (samplepos_t start_sample, samplepos_t end_sample, pframes_t nframes, int declick)
{
assert (is_monitor());
- BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
- fill_buffers_with_input (bufs, _input, nframes);
- passthru (bufs, start_sample, end_sample, nframes, declick, true, false);
+ run_route (start_sample, end_sample, nframes, declick, true, false);
}
void
-Route::passthru (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sample, pframes_t nframes, int declick, bool gain_automation_ok, bool run_disk_reader)
+Route::run_route (samplepos_t start_sample, samplepos_t end_sample, pframes_t nframes, int declick, bool gain_automation_ok, bool run_disk_reader)
{
+ BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
+
+ fill_buffers_with_input (bufs, _input, nframes);
+
+ /* filter captured data before meter sees it */
+ filter_input (bufs);
if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
@@ -704,16 +708,8 @@ Route::passthru (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
/* run processor chain */
process_output_buffers (bufs, start_sample, end_sample, nframes, declick, gain_automation_ok, run_disk_reader);
-}
-void
-Route::passthru_silence (samplepos_t start_sample, samplepos_t end_sample, pframes_t nframes, int declick)
-{
- BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
-
- bufs.set_count (_input->n_ports());
- write_out_of_band_data (bufs, start_sample, end_sample, nframes);
- process_output_buffers (bufs, start_sample, end_sample, nframes, declick, false, false);
+ flush_processor_buffers_locked (nframes);
}
void
@@ -3645,8 +3641,11 @@ Route::no_roll (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sam
int
Route::no_roll_unlocked (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool session_state_changing)
{
+ /* Must be called with the processor lock held */
+
if (!_active) {
silence_unlocked (nframes);
+ _meter->reset();
return 0;
}
@@ -3658,6 +3657,7 @@ Route::no_roll_unlocked (pframes_t nframes, samplepos_t start_sample, samplepos_
XXX note the absurdity of ::no_roll() being called when we ARE rolling!
*/
silence_unlocked (nframes);
+ _meter->reset();
return 0;
}
/* we're really not rolling, so we're either delivery silence or actually
@@ -3665,16 +3665,7 @@ Route::no_roll_unlocked (pframes_t nframes, samplepos_t start_sample, samplepos_
*/
}
- BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
-
- fill_buffers_with_input (bufs, _input, nframes);
-
- /* filter captured data before meter sees it */
- filter_input (bufs);
-
- passthru (bufs, start_sample, end_sample, nframes, 0, true, false);
-
- flush_processor_buffers_locked (nframes);
+ run_route (start_sample, end_sample, nframes, 0, false, false);
return 0;
}
@@ -3729,30 +3720,19 @@ Route::roll (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample
if (!_active) {
silence_unlocked (nframes);
- if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || (!_disk_writer || _disk_writer->record_enabled()))) {
- _meter->reset();
- }
+ _meter->reset();
return 0;
}
+
if ((nframes = latency_preroll (nframes, start_sample, end_sample)) == 0) {
return 0;
}
- BufferSet& bufs = _session.get_route_buffers (n_process_buffers ());
-
- fill_buffers_with_input (bufs, _input, nframes);
-
- /* filter captured data before meter sees it */
- filter_input (bufs);
-
- passthru (bufs, start_sample, end_sample, nframes, declick, (!_disk_writer || !_disk_writer->record_enabled()) && _session.transport_rolling(), true);
+ run_route (start_sample, end_sample, nframes, declick, (!_disk_writer || !_disk_writer->record_enabled()) && _session.transport_rolling(), true);
if ((_disk_reader && _disk_reader->need_butler()) || (_disk_writer && _disk_writer->need_butler())) {
need_butler = true;
}
-
- flush_processor_buffers_locked (nframes);
-
return 0;
}
diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc
index 1e53daff3c..45e4bce9b0 100644
--- a/libs/ardour/track.cc
+++ b/libs/ardour/track.cc
@@ -429,130 +429,6 @@ Track::set_name (const string& str)
return ret;
}
-int
-Track::no_roll_unlocked (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool session_state_changing)
-{
- /* no outputs? nothing to do ... what happens if we have sends etc. ? */
-
- if (n_outputs().n_total() == 0 && !ARDOUR::Profile->get_mixbus()) {
- //Note: Mixbus has its own output mechanism, so we should operate even if no explicit outputs are assigned
- return 0;
- }
-
- /* not active ... do the minimum possible by just outputting silence */
-
- if (!_active) {
- silence (nframes);
- if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled())) {
- _meter->reset();
- }
- return 0;
- }
-
- if (session_state_changing) {
- if (_session.transport_speed() != 0.0f) {
- /* we're rolling but some state is changing (e.g. our
- disk reader contents) so we cannot use them. Be
- silent till this is over. Don't declick.
-
- XXX note the absurdity of ::no_roll() being called when we ARE rolling!
- */
- passthru_silence (start_sample, end_sample, nframes, 0);
- return 0;
- }
- /* we're really not rolling, so we're either delivery silence or actually
- monitoring, both of which are safe to do while session_state_changing is true.
- */
- }
-
- // XXX this needs to go away.. disk-reader or Route::process_output_buffers needs to handle this XXX //
-
- bool be_silent;
- MonitorState const s = monitoring_state ();
- /* we are not rolling, so be silent even if we are monitoring disk, as there
- will be no disk data coming in.
- */
- switch (s) {
- case MonitoringSilence:
- be_silent = true;
- break;
- case MonitoringDisk:
- be_silent = true;
- break;
- case MonitoringInput:
- be_silent = false;
- break;
- default:
- be_silent = false;
- break;
- }
-
- //if we have an internal generator, let it play regardless of monitoring state
- if (_have_internal_generator) {
- be_silent = false;
- }
-
- /* if have_internal_generator, or .. */
-
- if (be_silent) {
-
-#if 0
- // XXX this is also the only user of IO::process_input ()
-
- if (_meter_point == MeterInput) {
- /* still need input monitoring and metering */
-
- bool const track_rec = _disk_writer->record_enabled ();
- bool const auto_input = _session.config.get_auto_input ();
- bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
- bool const tape_machine_mode = Config->get_tape_machine_mode ();
- bool no_meter = false;
-
- /* this needs a proper K-map
- * and should be separated into a function similar to monitoring_state()
- * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
- *
- * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
- */
- if (!auto_input && !track_rec) {
- no_meter=true;
- }
- else if (tape_machine_mode && !track_rec && auto_input) {
- no_meter=true;
- }
- else if (!software_monitor && tape_machine_mode && !track_rec) {
- no_meter=true;
- }
- else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
- no_meter=true;
- }
-
- if (no_meter) {
- BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
- _meter->run (bufs, start_sample, end_sample, 1.0, nframes, true);
- _input->process_input (boost::shared_ptr<Processor>(), start_sample, end_sample, _session.transport_speed(), nframes);
- } else {
- _input->process_input (_meter, start_sample, end_sample, _session.transport_speed(), nframes);
- }
- }
-#endif
-
- passthru_silence (start_sample, end_sample, nframes, 0);
-
- } else {
-
- BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
-
- fill_buffers_with_input (bufs, _input, nframes);
-
- passthru (bufs, start_sample, end_sample, nframes, false, true, false);
- }
-
- flush_processor_buffers_locked (nframes);
-
- return 0;
-}
-
boost::shared_ptr<Playlist>
Track::playlist ()
{