summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/vst_pluginui.cc7
-rw-r--r--libs/ardour/vst_plugin.cc10
-rw-r--r--libs/fst/fst.h1
-rw-r--r--libs/fst/vstwin.c7
4 files changed, 23 insertions, 2 deletions
diff --git a/gtk2_ardour/vst_pluginui.cc b/gtk2_ardour/vst_pluginui.cc
index aed9fb7337..19a0826065 100644
--- a/gtk2_ardour/vst_pluginui.cc
+++ b/gtk2_ardour/vst_pluginui.cc
@@ -167,7 +167,12 @@ VSTPluginUI::create_preset_store ()
CellRenderer* renderer = manage (new CellRendererText());
vst_preset_combo.pack_start (*renderer, true);
vst_preset_combo.add_attribute (*renderer, "text", 0);
- vst_preset_combo.set_active (0);
+
+ if (vst->fst()->current_program != -1) {
+ vst_preset_combo.set_active (vst->fst()->current_program);
+ } else {
+ vst_preset_combo.set_active (0);
+ }
}
typedef int (*error_handler_t)( Display *, XErrorEvent *);
diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc
index e4e623c356..eb067d6c5a 100644
--- a/libs/ardour/vst_plugin.cc
+++ b/libs/ardour/vst_plugin.cc
@@ -222,7 +222,11 @@ VSTPlugin::set_state(const XMLNode& node)
}
}
+ _fst->current_program = _plugin->dispatcher (_plugin, 3, /* effGetProgram */, 0, NULL, NULL, 0);
+ cerr << name() << ": current program is " << _fst->current_program << endl;
+
return 0;
+
} else if ((child = find_named_node (node, X_("parameters"))) != 0) {
XMLPropertyList::const_iterator i;
@@ -238,9 +242,15 @@ VSTPlugin::set_state(const XMLNode& node)
_plugin->setParameter (_plugin, param, val);
}
+ /* program number is not knowable */
+
+ _fst->current_program = -1;
+
return 0;
}
+
+
return -1;
}
diff --git a/libs/fst/fst.h b/libs/fst/fst.h
index 7e2cfec08b..1cecc71d52 100644
--- a/libs/fst/fst.h
+++ b/libs/fst/fst.h
@@ -82,6 +82,7 @@ struct _FST
int destroy;
int want_program;
+ int current_program;
float *want_params;
float *set_params;
diff --git a/libs/fst/vstwin.c b/libs/fst/vstwin.c
index 151eedcbdb..82c4d81d68 100644
--- a/libs/fst/vstwin.c
+++ b/libs/fst/vstwin.c
@@ -71,6 +71,7 @@ fst_new ()
pthread_cond_init (&fst->window_status_change, NULL);
pthread_cond_init (&fst->plugin_dispatcher_called, NULL);
fst->want_program = -1;
+ fst->current_program = -1;
return fst;
}
@@ -165,7 +166,11 @@ again:
}
if (fst->want_program != -1 ) {
- fst->plugin->dispatcher (fst->plugin, effSetProgram, 0, fst->want_program, NULL, 0);
+ fst->plugin->dispatcher (fst->plugin, 67 /* effBeginSetProgram */, 0, 0, NULL, 0);
+ fst->plugin->dispatcher (fst->plugin, effSetProgram, 0, fst->want_program, NULL, 0))
+ fst->plugin->dispatcher (fst->plugin, 68 /* effEndSetProgram */, 0, 0, NULL, 0);
+ /* assume it worked */
+ fst->current_program = fst->want_program;
fst->want_program = -1;
}