+
+void
+AUPlugin::set_info (PluginInfoPtr info)
+{
+ Plugin::set_info (info);
+
+ AUPluginInfoPtr pinfo = boost::dynamic_pointer_cast<AUPluginInfo>(get_info());
+ _has_midi_input = pinfo->needs_midi_input ();
+ _has_midi_output = false;
+}
+
+int
+AUPlugin::create_parameter_listener (AUEventListenerProc cb, void* arg, float interval_secs)
+{
+#ifdef WITH_CARBON
+ CFRunLoopRef run_loop = (CFRunLoopRef) GetCFRunLoopFromEventLoop(GetCurrentEventLoop());
+#else
+ CFRunLoopRef run_loop = CFRunLoopGetCurrent();
+#endif
+ CFStringRef loop_mode = kCFRunLoopDefaultMode;
+
+ if (AUEventListenerCreate (cb, arg, run_loop, loop_mode, interval_secs, interval_secs, &_parameter_listener) != noErr) {
+ return -1;
+ }
+
+ _parameter_listener_arg = arg;
+
+ return 0;
+}
+
+int
+AUPlugin::listen_to_parameter (uint32_t param_id)
+{
+ AudioUnitEvent event;
+
+ if (!_parameter_listener || param_id >= descriptors.size()) {
+ return -2;
+ }
+
+ event.mEventType = kAudioUnitEvent_ParameterValueChange;
+ 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;
+}
+
+int
+AUPlugin::end_listen_to_parameter (uint32_t param_id)
+{
+ AudioUnitEvent event;
+
+ if (!_parameter_listener || param_id >= descriptors.size()) {
+ return -2;
+ }
+
+ event.mEventType = kAudioUnitEvent_ParameterValueChange;
+ 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;
+}
+
+void
+AUPlugin::_parameter_change_listener (void* arg, void* src, const AudioUnitEvent* event, UInt64 host_time, Float32 new_value)
+{
+ ((AUPlugin*) arg)->parameter_change_listener (arg, src, event, host_time, new_value);
+}
+
+void
+AUPlugin::parameter_change_listener (void* /*arg*/, void* /*src*/, const AudioUnitEvent* event, UInt64 /*host_time*/, Float32 new_value)
+{
+ ParameterMap::iterator i = parameter_map.find (event->mArgument.mParameter.mParameterID);
+
+ if (i != parameter_map.end()) {
+ ParameterChanged (i->second, new_value);
+ }
+}