diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2012-07-11 15:31:02 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2012-07-11 15:31:02 +0000 |
commit | 8d6d3c309d75f5280bf32cffcab271a287827c01 (patch) | |
tree | b303256e444f26db230ff4b0e31982930894bf2a | |
parent | a782dd36e74b3a346c82ba82bf0e9d9533255691 (diff) |
add StartTouch and EndTouch signals to Plugin class; make PluginInsert handle these signals and mark the start end of touch/gestures for a given AutomationControl; net result is that touch automation now works for AudioUnit plugins, at least those whose GUIs send kAudioUnitEvent_{Begin,End}ParameterGesture events
git-svn-id: svn://localhost/ardour2/branches/3.0@13028 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | libs/ardour/ardour/plugin.h | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/plugin_insert.h | 6 | ||||
-rw-r--r-- | libs/ardour/audio_unit.cc | 52 | ||||
-rw-r--r-- | libs/ardour/plugin_insert.cc | 23 |
4 files changed, 79 insertions, 5 deletions
diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index bf91de903b..9e4f5c40fd 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -255,6 +255,9 @@ class Plugin : public PBD::StatefulDestructible, public Latent void set_cycles (uint32_t c) { _cycles = c; } cycles_t cycles() const { return _cycles; } + PBD::Signal1<void,uint32_t> StartTouch; + PBD::Signal1<void,uint32_t> EndTouch; + protected: friend class PluginInsert; diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h index 0146604327..69bf7eadb5 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -138,6 +138,9 @@ class PluginInsert : public Processor Hide, ///< we `hide' some of the plugin's inputs by feeding them silence }; + PBD::Signal1<void,uint32_t> StartTouch; + PBD::Signal1<void,uint32_t> EndTouch; + private: /* disallow copy construction */ PluginInsert (const PluginInsert&); @@ -185,6 +188,9 @@ class PluginInsert : public Processor boost::shared_ptr<Plugin> plugin_factory (boost::shared_ptr<Plugin>); void add_plugin (boost::shared_ptr<Plugin>); + + void start_touch (uint32_t param_id); + void end_touch (uint32_t param_id); }; } // namespace ARDOUR diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index a76bcc4aae..431fb99a48 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -2753,6 +2753,26 @@ AUPlugin::listen_to_parameter (uint32_t param_id) return -1; } + event.mEventType = kAudioUnitEvent_BeginParameterChangeGesture; + event.mArgument.mParameter.mAudioUnit = unit->AU(); + event.mArgument.mParameter.mParameterID = descriptors[param_id].id; + event.mArgument.mParameter.mScope = descriptors[param_id].scope; + event.mArgument.mParameter.mElement = descriptors[param_id].element; + + if (AUEventListenerAddEventType (_parameter_listener, _parameter_listener_arg, &event) != noErr) { + return -1; + } + + event.mEventType = kAudioUnitEvent_EndParameterChangeGesture; + event.mArgument.mParameter.mAudioUnit = unit->AU(); + event.mArgument.mParameter.mParameterID = descriptors[param_id].id; + event.mArgument.mParameter.mScope = descriptors[param_id].scope; + event.mArgument.mParameter.mElement = descriptors[param_id].element; + + if (AUEventListenerAddEventType (_parameter_listener, _parameter_listener_arg, &event) != noErr) { + return -1; + } + return 0; } @@ -2775,6 +2795,26 @@ AUPlugin::end_listen_to_parameter (uint32_t param_id) return -1; } + event.mEventType = kAudioUnitEvent_BeginParameterChangeGesture; + event.mArgument.mParameter.mAudioUnit = unit->AU(); + event.mArgument.mParameter.mParameterID = descriptors[param_id].id; + event.mArgument.mParameter.mScope = descriptors[param_id].scope; + event.mArgument.mParameter.mElement = descriptors[param_id].element; + + if (AUEventListenerRemoveEventType (_parameter_listener, _parameter_listener_arg, &event) != noErr) { + return -1; + } + + event.mEventType = kAudioUnitEvent_EndParameterChangeGesture; + event.mArgument.mParameter.mAudioUnit = unit->AU(); + event.mArgument.mParameter.mParameterID = descriptors[param_id].id; + event.mArgument.mParameter.mScope = descriptors[param_id].scope; + event.mArgument.mParameter.mElement = descriptors[param_id].element; + + if (AUEventListenerRemoveEventType (_parameter_listener, _parameter_listener_arg, &event) != noErr) { + return -1; + } + return 0; } @@ -2789,17 +2829,19 @@ AUPlugin::parameter_change_listener (void* /*arg*/, void* /*src*/, const AudioUn { ParameterMap::iterator i; + if ((i = parameter_map.find (event->mArgument.mParameter.mParameterID)) == parameter_map.end()) { + return; + } + switch (event->mEventType) { case kAudioUnitEvent_BeginParameterChangeGesture: + StartTouch (i->second); break; case kAudioUnitEvent_EndParameterChangeGesture: + EndTouch (i->second); break; case kAudioUnitEvent_ParameterValueChange: - i = parameter_map.find (event->mArgument.mParameter.mParameterID); - - if (i != parameter_map.end()) { - ParameterChanged (i->second, new_value); - } + ParameterChanged (i->second, new_value); break; default: break; diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index baaa632d2b..6e7cfe373f 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -1263,7 +1263,12 @@ PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin) plugin->set_insert_info (this); if (_plugins.empty()) { + /* first (and probably only) plugin instance - connect to relevant signals + */ + plugin->ParameterChanged.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed, this, _1, _2)); + plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1)); + plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1)); } _plugins.push_back (plugin); @@ -1292,3 +1297,21 @@ PluginInsert::monitoring_changed () (*i)->monitoring_changed (); } } + +void +PluginInsert::start_touch (uint32_t param_id) +{ + boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id)); + if (ac) { + ac->start_touch (session().audible_frame()); + } +} + +void +PluginInsert::end_touch (uint32_t param_id) +{ + boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id)); + if (ac) { + ac->stop_touch (true, session().audible_frame()); + } +} |