summaryrefslogtreecommitdiff
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
parentf944c24c4bbbda1a9225ba9cd96f3caee6d4f453 (diff)
consolidate VSTState functions
-rw-r--r--libs/ardour/ardour/vst_types.h7
-rw-r--r--libs/ardour/vst_helper.cc38
-rw-r--r--libs/ardour/vst_state.cc63
-rw-r--r--libs/ardour/wscript2
-rw-r--r--libs/fst/scanner.cc2
-rw-r--r--libs/fst/vstwin.c43
6 files changed, 76 insertions, 79 deletions
diff --git a/libs/ardour/ardour/vst_types.h b/libs/ardour/ardour/vst_types.h
index 580c213a0a..21e9ea01fc 100644
--- a/libs/ardour/ardour/vst_types.h
+++ b/libs/ardour/ardour/vst_types.h
@@ -138,6 +138,13 @@ struct LIBARDOUR_API _VSTState
typedef struct _VSTState VSTState;
+#ifdef __cplusplus
+extern "C" {
+#endif
LIBARDOUR_API extern void vststate_init (VSTState* state);
+LIBARDOUR_API extern void vststate_maybe_set_program (VSTState* state);
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/libs/ardour/vst_helper.cc b/libs/ardour/vst_helper.cc
deleted file mode 100644
index da14eea96b..0000000000
--- a/libs/ardour/vst_helper.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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 "ardour/vst_types.h"
-
-void vststate_init (VSTState* state) {
- 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;
- state->want_chunk = 0;
- state->n_pending_keys = 0;
- state->has_editor = 0;
- state->program_set_without_editor = 0;
- state->linux_window = 0;
- state->linux_plugin_ui_window = 0;
- state->eventProc = 0;
- state->extra_data = 0;
- state->want_resize = 0;
-}
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);
+ }
+}
diff --git a/libs/ardour/wscript b/libs/ardour/wscript
index b998732695..831440f23e 100644
--- a/libs/ardour/wscript
+++ b/libs/ardour/wscript
@@ -436,7 +436,7 @@ def build(bld):
obj.defines += [ 'LXVST_SUPPORT' ]
if bld.is_defined('WINDOWS_VST_SUPPORT') or bld.is_defined('LXVST_SUPPORT') or bld.is_defined('MACVST_SUPPORT'):
- obj.source += [ 'session_vst.cc', 'vst_plugin.cc', 'vst_info_file.cc', 'vst_helper.cc' ]
+ obj.source += [ 'session_vst.cc', 'vst_plugin.cc', 'vst_info_file.cc', 'vst_state.cc' ]
if bld.is_defined('MACVST_SUPPORT'):
obj.source += [ 'mac_vst_plugin.cc', 'mac_vst_support.cc' ]
diff --git a/libs/fst/scanner.cc b/libs/fst/scanner.cc
index 1c61976819..18f4048cbb 100644
--- a/libs/fst/scanner.cc
+++ b/libs/fst/scanner.cc
@@ -36,8 +36,8 @@
#endif
#include "../ardour/filesystem_paths.cc"
#include "../ardour/directory_names.cc"
-#include "../ardour/vst_helper.cc"
+#include "../ardour/vst_state.cc"
#ifdef LXVST_SUPPORT
void
diff --git a/libs/fst/vstwin.c b/libs/fst/vstwin.c
index 820027c9ae..fcfa836893 100644
--- a/libs/fst/vstwin.c
+++ b/libs/fst/vstwin.c
@@ -72,33 +72,6 @@ vstedit_wndproc (HWND w, UINT msg, WPARAM wp, LPARAM lp)
}
-static void
-maybe_set_program (VSTState* fst)
-{
- if (fst->want_program != -1) {
- if (fst->vst_version >= 2) {
- fst->plugin->dispatcher (fst->plugin, effBeginSetProgram, 0, 0, NULL, 0);
- }
-
- fst->plugin->dispatcher (fst->plugin, effSetProgram, 0, fst->want_program, NULL, 0);
-
- if (fst->vst_version >= 2) {
- fst->plugin->dispatcher (fst->plugin, effEndSetProgram, 0, 0, NULL, 0);
- }
- fst->want_program = -1;
- }
-
- if (fst->want_chunk == 1) {
- // XXX check
- // 24 == audioMasterGetAutomationState,
- // 48 == audioMasterGetChunkFile
- pthread_mutex_lock (&fst->state_lock);
- fst->plugin->dispatcher (fst->plugin, 24 /* effSetChunk */, 1, fst->wanted_chunk_size, fst->wanted_chunk, 0);
- fst->want_chunk = 0;
- pthread_mutex_unlock (&fst->state_lock);
- }
-}
-
static VOID CALLBACK
idle_hands(
HWND hwnd, // handle to window for timer messages
@@ -148,8 +121,8 @@ idle_hands(
fst->n_pending_keys = 0;
#endif
- /* See comment for maybe_set_program call below */
- maybe_set_program (fst);
+ /* See comment for call below */
+ vststate_maybe_set_program (fst);
fst->want_program = -1;
fst->want_chunk = 0;
/* If we don't have an editor window yet, we still need to
@@ -161,7 +134,7 @@ idle_hands(
* and so it will be done again if and when the GUI arrives.
*/
if (fst->program_set_without_editor == 0) {
- maybe_set_program (fst);
+ vststate_maybe_set_program (fst);
fst->program_set_without_editor = 1;
}
@@ -220,15 +193,7 @@ static VSTState*
fst_new (void)
{
VSTState* fst = (VSTState*) calloc (1, sizeof (VSTState));
-
- //vststate_init (fst);
- pthread_mutex_init (&fst->lock, 0);
- pthread_mutex_init (&fst->state_lock, 0);
- pthread_cond_init (&fst->window_status_change, 0);
- pthread_cond_init (&fst->plugin_dispatcher_called, 0);
- pthread_cond_init (&fst->window_created, 0);
- fst->want_program = -1;
- //
+ vststate_init (fst);
#ifdef PLATFORM_WINDOWS
fst->voffset = 50;