diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-09-10 22:58:33 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-09-10 22:58:33 -0400 |
commit | 676ff806970925972b165cd7621ba7ea8c82c08a (patch) | |
tree | 8a28169d0f08824c0b3ce1f5cec375a89029d9f2 /libs/ardour | |
parent | 209e4bdcaed8e0f7d66fa5673f9049948e1f1d53 (diff) |
basic functionality for hardware latency measurement
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/audioengine.h | 17 | ||||
-rw-r--r-- | libs/ardour/audioengine.cc | 84 | ||||
-rw-r--r-- | libs/ardour/midi_port.cc | 2 | ||||
-rw-r--r-- | libs/ardour/port_insert.cc | 4 |
4 files changed, 103 insertions, 4 deletions
diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 4db1604345..980f507be5 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -47,6 +47,8 @@ #include <jack/session.h> #endif +class MTDM; + namespace ARDOUR { class InternalPort; @@ -182,6 +184,14 @@ public: /* sets up the process callback thread */ static void thread_init_callback (void *); + /* latency measurement */ + + MTDM* mtdm(); + void start_latency_detection (); + void stop_latency_detection (); + void set_latency_input_port (const std::string&); + void set_latency_output_port (const std::string&); + private: AudioEngine (); @@ -205,7 +215,12 @@ public: framecnt_t _processed_frames; Glib::Threads::Thread* m_meter_thread; ProcessThread* _main_thread; - + MTDM* _mtdm; + bool _measuring_latency; + PortEngine::PortHandle _latency_input_port; + PortEngine::PortHandle _latency_output_port; + framecnt_t _latency_flush_frames; + void meter_thread (); void start_metering_thread (); void stop_metering_thread (); diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 5b19253a26..09478e7ef7 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -50,6 +50,7 @@ #include "ardour/meter.h" #include "ardour/midi_port.h" #include "ardour/midiport_manager.h" +#include "ardour/mtdm.h" #include "ardour/port.h" #include "ardour/process_thread.h" #include "ardour/session.h" @@ -73,6 +74,11 @@ AudioEngine::AudioEngine () , _processed_frames (0) , m_meter_thread (0) , _main_thread (0) + , _mtdm (0) + , _measuring_latency (false) + , _latency_input_port (0) + , _latency_output_port (0) + , _latency_flush_frames (0) { g_atomic_int_set (&m_meter_exit, 0); discover_backends (); @@ -192,6 +198,43 @@ AudioEngine::process_callback (pframes_t nframes) return 0; } + /* If measuring latency, do it now and get out of here */ + + if (_measuring_latency && _mtdm) { + // PortManager::cycle_start (nframes); + // PortManager::silence (nframes); + + if (_latency_input_port && _latency_output_port) { + PortEngine& pe (port_engine()); + + Sample* in = (Sample*) pe.get_buffer (_latency_input_port, nframes); + Sample* out = (Sample*) pe.get_buffer (_latency_output_port, nframes); + + _mtdm->process (nframes, in, out); + } + + // PortManager::cycle_end (nframes); + return 0; + + } else if (_latency_flush_frames) { + + /* wait for the appropriate duration for the MTDM signal to + * drain from the ports before we revert to normal behaviour. + */ + + PortManager::cycle_start (nframes); + PortManager::silence (nframes); + PortManager::cycle_end (nframes); + + if (_latency_flush_frames > nframes) { + _latency_flush_frames -= nframes; + } else { + _latency_flush_frames = 0; + } + + return 0; + } + if (session_remove_pending) { /* perform the actual session removal */ @@ -581,6 +624,9 @@ AudioEngine::stop () _running = false; _processed_frames = 0; + _measuring_latency = false; + _latency_output_port = 0; + _latency_input_port = 0; stop_metering_thread (); Port::PortDrop (); @@ -930,3 +976,41 @@ AudioEngine::setup_required () const return true; } +MTDM* +AudioEngine::mtdm() +{ + return _mtdm; +} + +void +AudioEngine::start_latency_detection () +{ + delete _mtdm; + + _mtdm = new MTDM (sample_rate()); + _measuring_latency = true; + _latency_flush_frames = samples_per_cycle(); +} + +void +AudioEngine::stop_latency_detection () +{ + port_engine().unregister_port (_latency_output_port); + port_engine().unregister_port (_latency_input_port); + _measuring_latency = false; +} + +void +AudioEngine::set_latency_output_port (const string& name) +{ + _latency_output_port = port_engine().register_port ("latency_out", DataType::AUDIO, IsOutput); + port_engine().connect (_latency_output_port, name); +} + +void +AudioEngine::set_latency_input_port (const string& name) +{ + const string portname ("latency_in"); + _latency_input_port = port_engine().register_port (portname, DataType::AUDIO, IsInput); + port_engine().connect (name, make_port_name_non_relative (portname)); +} diff --git a/libs/ardour/midi_port.cc b/libs/ardour/midi_port.cc index eb6759f308..de2263fad6 100644 --- a/libs/ardour/midi_port.cc +++ b/libs/ardour/midi_port.cc @@ -88,7 +88,7 @@ MidiPort::get_midi_buffer (pframes_t nframes) void* buffer = port_engine.get_buffer (_port_handle, nframes); const pframes_t event_count = port_engine.get_midi_event_count (buffer); - + /* suck all relevant MIDI events from the MIDI port buffer into our MidiBuffer */ diff --git a/libs/ardour/port_insert.cc b/libs/ardour/port_insert.cc index d64920b1e2..97fe082c81 100644 --- a/libs/ardour/port_insert.cc +++ b/libs/ardour/port_insert.cc @@ -49,7 +49,7 @@ PortInsert::PortInsert (Session& s, boost::shared_ptr<Pannable> pannable, boost: { _mtdm = 0; _latency_detect = false; - _latency_flush_frames = false; + _latency_flush_frames = 0; _measured_latency = 0; } @@ -64,7 +64,7 @@ PortInsert::start_latency_detection () { delete _mtdm; _mtdm = new MTDM (_session.frame_rate()); - _latency_flush_frames = false; + _latency_flush_frames = 0; _latency_detect = true; _measured_latency = 0; } |