summaryrefslogtreecommitdiff
path: root/libs/ardour/vst_state.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-11-15 17:07:04 +0100
committerRobin Gareus <robin@gareus.org>2016-11-15 17:10:13 +0100
commitcf1651e6d7b615cba28025a5952afcc99946c18f (patch)
tree4244772fd4c01a6eaa96766521231345ffffa166 /libs/ardour/vst_state.cc
parentf944c24c4bbbda1a9225ba9cd96f3caee6d4f453 (diff)
consolidate VSTState functions
Diffstat (limited to 'libs/ardour/vst_state.cc')
-rw-r--r--libs/ardour/vst_state.cc63
1 files changed, 63 insertions, 0 deletions
diff --git a/libs/ardour/vst_state.cc b/libs/ardour/vst_state.cc
new file mode 100644
index 0000000000..7928bfda00
--- /dev/null
+++ b/libs/ardour/vst_state.cc
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin@gareus.org>
+ * Copyright (C) 2010 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <string.h>
+#include "ardour/vst_types.h"
+
+void
+vststate_init (VSTState* state) {
+ memset (state, 0, sizeof (VSTState));
+ pthread_mutex_init (&state->lock, 0);
+ pthread_mutex_init (&state->state_lock, 0);
+ pthread_cond_init (&state->window_status_change, 0);
+ pthread_cond_init (&state->plugin_dispatcher_called, 0);
+ pthread_cond_init (&state->window_created, 0);
+ state->want_program = -1;
+}
+
+/* This is to be called while handling VST UI events.
+ *
+ * Many plugins expect program dispatch from the GUI event-loop
+ * only (VSTPlugin::load_plugin_preset/set_chunk is invoked by
+ * the user in ardour's main GUI thread, which on Windows and Linux
+ * may *not* the VST event loop).
+ */
+void
+vststate_maybe_set_program (VSTState* state)
+{
+ if (state->want_program != -1) {
+ if (state->vst_version >= 2) {
+ state->plugin->dispatcher (state->plugin, effBeginSetProgram, 0, 0, NULL, 0);
+ }
+
+ state->plugin->dispatcher (state->plugin, effSetProgram, 0, state->want_program, NULL, 0);
+
+ if (state->vst_version >= 2) {
+ state->plugin->dispatcher (state->plugin, effEndSetProgram, 0, 0, NULL, 0);
+ }
+ state->want_program = -1;
+ }
+
+ if (state->want_chunk == 1) {
+ pthread_mutex_lock (&state->state_lock);
+ state->plugin->dispatcher (state->plugin, 24 /* effSetChunk */, 1, state->wanted_chunk_size, state->wanted_chunk, 0);
+ state->want_chunk = 0;
+ pthread_mutex_unlock (&state->state_lock);
+ }
+}