From cf1651e6d7b615cba28025a5952afcc99946c18f Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 15 Nov 2016 17:07:04 +0100 Subject: consolidate VSTState functions --- libs/ardour/vst_state.cc | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 libs/ardour/vst_state.cc (limited to 'libs/ardour/vst_state.cc') 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 + * 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 +#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); + } +} -- cgit v1.2.3