diff options
author | Robin Gareus <robin@gareus.org> | 2016-11-15 17:07:04 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-11-15 17:10:13 +0100 |
commit | cf1651e6d7b615cba28025a5952afcc99946c18f (patch) | |
tree | 4244772fd4c01a6eaa96766521231345ffffa166 /libs/ardour | |
parent | f944c24c4bbbda1a9225ba9cd96f3caee6d4f453 (diff) |
consolidate VSTState functions
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/vst_types.h | 7 | ||||
-rw-r--r-- | libs/ardour/vst_helper.cc | 38 | ||||
-rw-r--r-- | libs/ardour/vst_state.cc | 63 | ||||
-rw-r--r-- | libs/ardour/wscript | 2 |
4 files changed, 71 insertions, 39 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' ] |