mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-09 23:25:43 +01:00
fix LXVST support for plugins that make audioMaster callbacks from within effOpen (e.g. glitch)
This commit is contained in:
parent
6592c8696a
commit
56bc98f78b
3 changed files with 22 additions and 12 deletions
|
|
@ -73,6 +73,7 @@ public:
|
|||
|
||||
AEffect * plugin () const { return _plugin; }
|
||||
VSTState * state () const { return _state; }
|
||||
void set_state (VSTState* s) { _state = s; }
|
||||
|
||||
int set_state (XMLNode const &, int);
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@
|
|||
#include <glibmm/fileutils.h>
|
||||
|
||||
#include "ardour/linux_vst_support.h"
|
||||
#include "ardour/vst_plugin.h"
|
||||
|
||||
#include "pbd/basename.h"
|
||||
#include "pbd/error.h"
|
||||
|
||||
|
|
@ -293,36 +295,43 @@ vstfx_unload (VSTHandle* fhandle)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*This instantiates a plugin*/
|
||||
/**
|
||||
Instantiates a VST plugin and also set _state of its plugin argument
|
||||
*/
|
||||
|
||||
VSTState *
|
||||
vstfx_instantiate (VSTHandle* fhandle, audioMasterCallback amc, void* userptr)
|
||||
VSTState*
|
||||
vstfx_instantiate (VSTHandle* fhandle, audioMasterCallback amc, void *ptr)
|
||||
{
|
||||
VSTState* vstfx = vstfx_new ();
|
||||
ARDOUR::VSTPlugin* plugin = reinterpret_cast<ARDOUR::VSTPlugin*> (ptr);
|
||||
|
||||
if(fhandle == 0)
|
||||
{
|
||||
if (fhandle == 0) {
|
||||
vstfx_error( "** ERROR ** VSTFX : The handle was 0\n" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((vstfx->plugin = fhandle->main_entry (amc)) == 0)
|
||||
{
|
||||
if ((vstfx->plugin = fhandle->main_entry (amc)) == 0) {
|
||||
vstfx_error ("** ERROR ** VSTFX : %s could not be instantiated :(\n", fhandle->name);
|
||||
free (vstfx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
vstfx->handle = fhandle;
|
||||
vstfx->plugin->user = userptr;
|
||||
vstfx->plugin->user = plugin;
|
||||
|
||||
if (vstfx->plugin->magic != kEffectMagic)
|
||||
{
|
||||
if (vstfx->plugin->magic != kEffectMagic) {
|
||||
vstfx_error ("** ERROR ** VSTFX : %s is not a VST plugin\n", fhandle->name);
|
||||
free (vstfx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* need to set this here because some plugins make audioMaster
|
||||
* callbacks from within effOpen, and _state must be set for
|
||||
* that to work.
|
||||
*/
|
||||
|
||||
plugin->set_state (vstfx);
|
||||
|
||||
vstfx->plugin->dispatcher (vstfx->plugin, effOpen, 0, 0, 0, 0);
|
||||
|
||||
/*May or May not need to 'switch the plugin on' here - unlikely
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ LXVSTPlugin::LXVSTPlugin (AudioEngine& e, Session& session, VSTHandle* h)
|
|||
{
|
||||
/* Instantiate the plugin and return a VSTState* */
|
||||
|
||||
if ((_state = vstfx_instantiate (_handle, Session::vst_callback, this)) == 0) {
|
||||
if (vstfx_instantiate (_handle, Session::vst_callback, this) == 0) {
|
||||
throw failed_constructor();
|
||||
}
|
||||
|
||||
|
|
@ -44,7 +44,7 @@ LXVSTPlugin::LXVSTPlugin (const LXVSTPlugin &other)
|
|||
{
|
||||
_handle = other._handle;
|
||||
|
||||
if ((_state = vstfx_instantiate (_handle, Session::vst_callback, this)) == 0) {
|
||||
if (vstfx_instantiate (_handle, Session::vst_callback, this) == 0) {
|
||||
throw failed_constructor();
|
||||
}
|
||||
_plugin = _state->plugin;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue