MacVST Program/Preset support
[ardour.git] / gtk2_ardour / mac_vst_plugin_ui.mm
index 2b10fc2a88e8190fbdb02e60e2d3fb4b65d032f4..2c0cd1c502a830715bccafddd095d5406fdce9d6 100644 (file)
@@ -56,6 +56,8 @@ MacVSTPluginUI::MacVSTPluginUI (boost::shared_ptr<PluginInsert> pi, boost::share
        low_box.signal_realize().connect (mem_fun (this, &MacVSTPluginUI::lower_box_realized));
        pack_start (low_box, true, true);
        low_box.show ();
+       vst->LoadPresetProgram.connect (_program_connection, invalidator (*this), boost::bind (&MacVSTPluginUI::set_program, this), gui_context());
+
 }
 
 MacVSTPluginUI::~MacVSTPluginUI ()
@@ -149,3 +151,30 @@ MacVSTPluginUI::idle ()
        _vst->state()->wantIdle = plugin->dispatcher (plugin, effEditIdle, 0, 0, NULL, 0);
        return true; // _vst->state()->wantIdle;
 }
+
+void
+MacVSTPluginUI::set_program ()
+{
+       VSTState* vstfx = _vst->state();
+
+       if (vstfx->want_program != -1) {
+               if (vstfx->vst_version >= 2) {
+                       vstfx->plugin->dispatcher (vstfx->plugin, 67 /* effBeginSetProgram */, 0, 0, NULL, 0);
+               }
+
+               vstfx->plugin->dispatcher (vstfx->plugin, effSetProgram, 0, vstfx->want_program, NULL, 0);
+
+               if (vstfx->vst_version >= 2) {
+                       vstfx->plugin->dispatcher (vstfx->plugin, 68 /* effEndSetProgram */, 0, 0, NULL, 0);
+               }
+
+               vstfx->want_program = -1;
+       }
+
+       if (vstfx->want_chunk == 1) {
+               pthread_mutex_lock (&vstfx->state_lock);
+               vstfx->plugin->dispatcher (vstfx->plugin, 24 /* effSetChunk */, 1, vstfx->wanted_chunk_size, vstfx->wanted_chunk, 0);
+               vstfx->want_chunk = 0;
+               pthread_mutex_unlock (&vstfx->state_lock);
+       }
+}