diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h index 142fff1022..d6b57eac41 100644 --- a/libs/ardour/ardour/audio_backend.h +++ b/libs/ardour/ardour/audio_backend.h @@ -432,6 +432,12 @@ public: */ virtual bool can_change_buffer_size_when_running () const = 0; + /** return true if the backend is configured using a single + * full-duplex device and measuring systemic latency can + * produce meaningful results. + */ + virtual bool can_measure_systemic_latency () const = 0; + /** return true if the backend can measure and update * systemic latencies without restart. */ diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc index 907d015fac..e02338ee04 100644 --- a/libs/backends/alsa/alsa_audiobackend.cc +++ b/libs/backends/alsa/alsa_audiobackend.cc @@ -375,6 +375,12 @@ AlsaAudioBackend::set_device_name (const std::string& d) return rv; } +bool +AlsaAudioBackend::can_measure_systemic_latency () const +{ + return _input_audio_device == _output_audio_device && _input_audio_device != get_standard_device_name (DeviceNone); +} + int AlsaAudioBackend::set_sample_rate (float sr) { diff --git a/libs/backends/alsa/alsa_audiobackend.h b/libs/backends/alsa/alsa_audiobackend.h index 0569c6ad2d..aa8486c1bd 100644 --- a/libs/backends/alsa/alsa_audiobackend.h +++ b/libs/backends/alsa/alsa_audiobackend.h @@ -147,6 +147,7 @@ class AlsaAudioBackend : public AudioBackend, public PortEngineSharedImpl bool can_change_sample_rate_when_running () const; bool can_change_buffer_size_when_running () const; + bool can_measure_systemic_latency () const; bool can_change_systemic_latency_when_running () const { return true; } bool can_request_update_devices () { return true; } diff --git a/libs/backends/coreaudio/coreaudio_backend.h b/libs/backends/coreaudio/coreaudio_backend.h index 950e3fb917..9421e20aae 100644 --- a/libs/backends/coreaudio/coreaudio_backend.h +++ b/libs/backends/coreaudio/coreaudio_backend.h @@ -179,6 +179,7 @@ class CoreAudioBackend : public AudioBackend, public PortEngineSharedImpl { bool can_change_sample_rate_when_running () const; bool can_change_buffer_size_when_running () const; + bool can_measure_systemic_latency () const { return true; } int set_device_name (const std::string&); int set_input_device_name (const std::string&); diff --git a/libs/backends/dummy/dummy_audiobackend.h b/libs/backends/dummy/dummy_audiobackend.h index df7b739b31..f1517998f0 100644 --- a/libs/backends/dummy/dummy_audiobackend.h +++ b/libs/backends/dummy/dummy_audiobackend.h @@ -212,6 +212,7 @@ class DummyAudioBackend : public AudioBackend, public PortEngineSharedImpl { bool can_change_sample_rate_when_running () const; bool can_change_buffer_size_when_running () const; + bool can_measure_systemic_latency () const { return true; } int set_device_name (const std::string&); int set_sample_rate (float); diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index 7dfd35572d..6427af5d29 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -190,6 +190,9 @@ class JACKAudioBackend : public AudioBackend { bool can_set_period_size () const { return true; } + bool can_measure_systemic_latency () const { + return false; + } int midi_event_get (pframes_t& timestamp, size_t& size, uint8_t const** buf, void* port_buffer, uint32_t event_index); int midi_event_put (void* port_buffer, pframes_t timestamp, const uint8_t* buffer, size_t size); diff --git a/libs/backends/portaudio/portaudio_backend.h b/libs/backends/portaudio/portaudio_backend.h index 09d2909b84..63d1d1f0fb 100644 --- a/libs/backends/portaudio/portaudio_backend.h +++ b/libs/backends/portaudio/portaudio_backend.h @@ -158,6 +158,7 @@ class PortAudioBackend : public AudioBackend, public PortEngineSharedImpl { uint32_t systemic_midi_input_latency (std::string const) const; uint32_t systemic_midi_output_latency (std::string const) const; + bool can_measure_systemic_latency () const { return true; } bool can_set_systemic_midi_latencies () const { return true; } /* External control app */ diff --git a/libs/backends/pulseaudio/pulseaudio_backend.h b/libs/backends/pulseaudio/pulseaudio_backend.h index 969f8c97a9..c8b7686496 100644 --- a/libs/backends/pulseaudio/pulseaudio_backend.h +++ b/libs/backends/pulseaudio/pulseaudio_backend.h @@ -116,6 +116,7 @@ public: bool can_change_sample_rate_when_running () const; bool can_change_buffer_size_when_running () const; + bool can_measure_systemic_latency () const { return false; } int set_device_name (const std::string&); int set_sample_rate (float);