summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/audioengine.h17
-rw-r--r--libs/ardour/audioengine.cc84
-rw-r--r--libs/ardour/midi_port.cc2
-rw-r--r--libs/ardour/port_insert.cc4
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;
}