add StartTouch and EndTouch signals to Plugin class; make PluginInsert handle these...
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 11 Jul 2012 15:31:02 +0000 (15:31 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 11 Jul 2012 15:31:02 +0000 (15:31 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@13028 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/plugin.h
libs/ardour/ardour/plugin_insert.h
libs/ardour/audio_unit.cc
libs/ardour/plugin_insert.cc

index bf91de903b68258fd16b7adb8afe08f218b01ed8..9e4f5c40fd7c8ef89fe6319c4606983d895492b3 100644 (file)
@@ -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;
index 0146604327fb86f1178f7615df257c205b26cd17..69bf7eadb5ed1e46988126aeda168528c01a285a 100644 (file)
@@ -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
index a76bcc4aaefea98f9b31861dabedba13627f00b7..431fb99a481630ed5c843d5cccd7a1bbefcf0a4c 100644 (file)
@@ -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;
index baaa632d2b683b4a9ff3ebba96c9f6b2e7f2ace9..6e7cfe373ffc7fef61bfb1482d02281be8b49aee 100644 (file)
@@ -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());
+        }
+}