From 25a4cae8ad30dc090f2313600456d759ab7e81a5 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 16 Jul 2016 05:05:52 +0200 Subject: AU: install latency listener Don't query after every cycle, some plugins inject license checks when a host queries latency (!) --- libs/ardour/ardour/audio_unit.h | 1 + libs/ardour/audio_unit.cc | 29 ++++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index 7914dce0ab..24f427b124 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -171,6 +171,7 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin int32_t output_channels; std::vector > io_configs; framecnt_t _last_nframes; + mutable framecnt_t _current_latency; bool _requires_fixed_size_buffers; AudioBufferList* buffers; bool _has_midi_input; diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index 74b7ce6566..3e6bdfb691 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -955,7 +955,10 @@ AUPlugin::default_value (uint32_t port) framecnt_t AUPlugin::signal_latency () const { - return unit->Latency() * _session.frame_rate(); + if (_current_latency < 0) { + _current_latency = unit->Latency() * _session.frame_rate(); + } + return _current_latency; } void @@ -1082,8 +1085,6 @@ AUPlugin::set_block_size (pframes_t nframes) activate (); } - _current_block_size = nframes; - return 0; } @@ -3362,6 +3363,19 @@ AUPlugin::create_parameter_listener (AUEventListenerProc cb, void* arg, float in _parameter_listener_arg = arg; + // listen for latency changes + AudioUnitEvent event; + event.mEventType = kAudioUnitEvent_PropertyChange; + event.mArgument.mProperty.mAudioUnit = unit->AU(); + event.mArgument.mProperty.mPropertyID = kAudioUnitProperty_Latency; + event.mArgument.mProperty.mScope = kAudioUnitScope_Global; + event.mArgument.mProperty.mElement = 0; + + if (AUEventListenerAddEventType (_parameter_listener, _parameter_listener_arg, &event) != noErr) { + PBD::error << "Failed to create latency event listener\n"; + // TODO don't cache _current_latency + } + return 0; } @@ -3458,6 +3472,15 @@ AUPlugin::_parameter_change_listener (void* arg, void* src, const AudioUnitEvent void AUPlugin::parameter_change_listener (void* /*arg*/, void* src, const AudioUnitEvent* event, UInt64 /*host_time*/, Float32 new_value) { + if (event->mEventType == kAudioUnitEvent_PropertyChange) { + if (event->mArgument.mProperty.mPropertyID == kAudioUnitProperty_Latency) { + DEBUG_TRACE (DEBUG::AudioUnits, string_compose("AU Latency Change Event %1 <> %1\n", new_value, unit->Latency())); + // TODO atomically set //_current_latency = -1; + _current_latency = unit->Latency() * _session.frame_rate(); // TODO: check: new_value + } + return; + } + ParameterMap::iterator i; if ((i = parameter_map.find (event->mArgument.mParameter.mParameterID)) == parameter_map.end()) { -- cgit v1.2.3