From 16aece1d47ad1c1137d68ab12989cbc94b112c0f Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 22 Nov 2011 02:27:26 +0000 Subject: Share main VSTFX / FST struct between windows / linux VSTs. git-svn-id: svn://localhost/ardour2/branches/3.0@10762 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/lxvst_pluginui.cc | 2 +- gtk2_ardour/vstfxwin.cc | 203 ++++++++++++++++---------------- gtk2_ardour/windows_vst_plugin_ui.cc | 2 +- libs/ardour/ardour/lxvst_plugin.h | 6 +- libs/ardour/ardour/vst_types.h | 59 ++++++++++ libs/ardour/ardour/vstfx.h | 87 +++----------- libs/ardour/ardour/windows_vst_plugin.h | 8 +- libs/ardour/vstfx.cc | 19 +-- libs/ardour/vstfxinfofile.cc | 11 +- libs/fst/fst.h | 64 ++-------- libs/fst/fstinfofile.c | 12 +- libs/fst/jackvst.h | 11 +- libs/fst/vstwin.c | 67 +++++------ 13 files changed, 250 insertions(+), 301 deletions(-) diff --git a/gtk2_ardour/lxvst_pluginui.cc b/gtk2_ardour/lxvst_pluginui.cc index b6c7f34327..b8f751ff08 100755 --- a/gtk2_ardour/lxvst_pluginui.cc +++ b/gtk2_ardour/lxvst_pluginui.cc @@ -226,7 +226,7 @@ LXVSTPluginUI::forward_key_event (GdkEventKey* ev) void LXVSTPluginUI::create_preset_store () { - VSTFX* vstfx = lxvst->vstfx(); + VSTState* vstfx = lxvst->vstfx(); int vst_version = vstfx->plugin->dispatcher (vstfx->plugin, effGetVstVersion, 0, 0, NULL, 0.0f); diff --git a/gtk2_ardour/vstfxwin.cc b/gtk2_ardour/vstfxwin.cc index 65ff7912e9..4b28170850 100755 --- a/gtk2_ardour/vstfxwin.cc +++ b/gtk2_ardour/vstfxwin.cc @@ -36,7 +36,7 @@ struct ERect{ static pthread_mutex_t plugin_mutex; -static VSTFX* vstfx_first = NULL; +static VSTState * vstfx_first = NULL; const char magic[] = "VSTFX Plugin State v002"; @@ -160,7 +160,8 @@ long getXWindowProperty(Window window, Atom atom) /*The event handler - called from within the main GUI thread to dispatch events to any VST UIs which have callbacks stuck to them*/ -static void dispatch_x_events(XEvent* event, VSTFX* vstfx) +static void +dispatch_x_events (XEvent* event, VSTState* vstfx) { /*Handle some of the Events we might be interested in*/ @@ -182,10 +183,8 @@ static void dispatch_x_events(XEvent* event, VSTFX* vstfx) /*if the size has changed, we flag this so that in lxvst_pluginui.cc we can make the change to the GTK parent window in ardour, from its UI thread*/ - if(window == (Window)(vstfx->window)) - { - if((width!=vstfx->width) || (height!=vstfx->height)) - { + if (window == (Window) (vstfx->linux_window)) { + if (width != vstfx->width || height!=vstfx->height) { vstfx->width = width; vstfx->height = height; vstfx->want_resize = 1; @@ -194,8 +193,9 @@ static void dispatch_x_events(XEvent* event, VSTFX* vstfx) position at the same time. We need to re-position the window at the origin of the parent window*/ - if(vstfx->plugin_ui_window) - XMoveWindow(LXVST_XDisplay, vstfx->plugin_ui_window, 0, 0); + if (vstfx->linux_plugin_ui_window) { + XMoveWindow (LXVST_XDisplay, vstfx->linux_plugin_ui_window, 0, 0); + } } } @@ -220,18 +220,19 @@ static void dispatch_x_events(XEvent* event, VSTFX* vstfx) /* present time */ /***********************************************************/ - if(ParentWindow == (Window)(vstfx->window)) - { + if (ParentWindow == (Window) (vstfx->linux_window)) { + Window PluginUIWindowID = event->xreparent.window; - vstfx->plugin_ui_window = PluginUIWindowID; + vstfx->linux_plugin_ui_window = PluginUIWindowID; #ifdef LXVST_32BIT int result = getXWindowProperty(PluginUIWindowID, XInternAtom(LXVST_XDisplay, "_XEventProc", false)); - if(result == 0) + if (result == 0) { vstfx->eventProc = NULL; - else + } else { vstfx->eventProc = (void (*) (void* event))result; + } #endif #ifdef LXVST_64BIT long result = getXWindowProperty(PluginUIWindowID, XInternAtom(LXVST_XDisplay, "_XEventProc", false)); @@ -254,15 +255,13 @@ static void dispatch_x_events(XEvent* event, VSTFX* vstfx) that the plugin parent window is now valid and can be passed to effEditOpen when the editor is launched*/ - if(window == (Window)(vstfx->window)) - { + if (window == (Window) (vstfx->linux_window)) { char* message = XGetAtomName(LXVST_XDisplay, message_type); - if(strcmp(message,"LaunchEditor") == 0) - { - - if(event->xclient.data.l[0] == 0x0FEEDBAC) - vstfx_launch_editor(vstfx); + if (strcmp(message,"LaunchEditor") == 0) { + if (event->xclient.data.l[0] == 0x0FEEDBAC) { + vstfx_launch_editor (vstfx); + } } XFree(message); @@ -283,8 +282,9 @@ static void dispatch_x_events(XEvent* event, VSTFX* vstfx) UI window after they create it. If that is the case, we need to call it here, passing the XEvent into it*/ - if(vstfx->eventProc == NULL) + if (vstfx->eventProc == NULL) { return; + } vstfx->eventProc((void*)event); } @@ -295,8 +295,7 @@ windows, that is if they don't manage their own UIs **/ void* gui_event_loop (void* ptr) { - - VSTFX* vstfx; + VSTState* vstfx; int LXVST_sched_event_timer = 0; int LXVST_sched_timer_interval = 50; //ms XEvent event; @@ -361,14 +360,13 @@ again: /*Window scheduled for destruction*/ - if (vstfx->destroy) - { - if (vstfx->window) - { - vstfx->plugin->dispatcher( vstfx->plugin, effEditClose, 0, 0, NULL, 0.0 ); + if (vstfx->destroy) { + if (vstfx->linux_window) { + vstfx->plugin->dispatcher (vstfx->plugin, effEditClose, 0, 0, NULL, 0.0); - XDestroyWindow (LXVST_XDisplay, vstfx->window); - vstfx->window = 0; //FIXME - probably safe to assume we never have an XID of 0 but not explicitly true + XDestroyWindow (LXVST_XDisplay, vstfx->linux_window); + /* FIXME - probably safe to assume we never have an XID of 0 but not explicitly true */ + vstfx->linux_window = 0; vstfx->destroy = FALSE; } @@ -381,19 +379,16 @@ again: } /*Window does not yet exist - scheduled for creation*/ - - if (vstfx->window == 0) //FIXME - probably safe to assume 0 is not a valid XID but not explicitly true - { - if (vstfx_create_editor (vstfx)) - { + + /* FIXME - probably safe to assume 0 is not a valid XID but not explicitly true */ + if (vstfx->linux_window == 0) { + if (vstfx_create_editor (vstfx)) { vstfx_error ("** ERROR ** VSTFX : Cannot create editor for plugin %s", vstfx->handle->name); vstfx_event_loop_remove_plugin (vstfx); pthread_cond_signal (&vstfx->window_status_change); pthread_mutex_unlock (&vstfx->lock); goto again; - } - else - { + } else { /* condition/unlock: it was signalled & unlocked in fst_create_editor() */ } } @@ -527,27 +522,23 @@ void vstfx_exit() /*Adds a new plugin (VSTFX) instance to the linked list*/ -int vstfx_run_editor (VSTFX* vstfx) +int vstfx_run_editor (VSTState* vstfx) { pthread_mutex_lock (&plugin_mutex); - /*Add the new VSTFX instance to the linked list*/ + /* Add the new VSTFX instance to the linked list */ - if (vstfx_first == NULL) - { + if (vstfx_first == NULL) { vstfx_first = vstfx; - } - else - { - VSTFX* p = vstfx_first; + } else { + VSTState* p = vstfx_first; - while (p->next) - { + while (p->next) { p = p->next; } p->next = vstfx; - /*Mark the new end of the list*/ + /* Mark the new end of the list */ vstfx->next = NULL; } @@ -558,15 +549,13 @@ int vstfx_run_editor (VSTFX* vstfx) pthread_mutex_lock (&vstfx->lock); - if (!vstfx->window) - { + if (!vstfx->linux_window) { pthread_cond_wait (&vstfx->window_status_change, &vstfx->lock); } pthread_mutex_unlock (&vstfx->lock); - if (!vstfx->window) - { + if (!vstfx->linux_window) { return -1; } @@ -577,7 +566,7 @@ int vstfx_run_editor (VSTFX* vstfx) /*Creates an editor for the plugin - normally called from within the gui event loop after run_editor has added the plugin (editor) to the linked list*/ -int vstfx_create_editor (VSTFX* vstfx) +int vstfx_create_editor (VSTState* vstfx) { Window parent_window; @@ -614,7 +603,7 @@ int vstfx_create_editor (VSTFX* vstfx) parent_window, SubstructureNotifyMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | ExposureMask); - vstfx->window = parent_window; + vstfx->linux_window = parent_window; vstfx->xid = parent_window; //vstfx->xid will be referenced to connect to GTK UI in ardour later @@ -654,7 +643,8 @@ int vstfx_create_editor (VSTFX* vstfx) return 0; } -int vstfx_launch_editor(VSTFX* vstfx) +int +vstfx_launch_editor (VSTState* vstfx) { /*This is the second stage of launching the editor (see vstfx_create editor) we get called here in response to receiving the ClientMessage on our Window, @@ -672,7 +662,7 @@ int vstfx_launch_editor(VSTFX* vstfx) int x_size = 1; int y_size = 1; - parent_window = vstfx->window; + parent_window = vstfx->linux_window; /*Open the editor - Bah! we have to pass the int windowID as a void pointer - yuck it gets cast back to an int as the parent window XID in the plugin - and we have to pass the @@ -726,93 +716,98 @@ int vstfx_launch_editor(VSTFX* vstfx) /*May not be needed in the XLib version*/ -void vstfx_move_window_into_view (VSTFX* vstfx) +void +vstfx_move_window_into_view (VSTState* vstfx) { - - /*This is probably the equivalent of Mapping an XWindow - but we most likely don't need it because the window - will be Mapped by XReparentWindow*/ + /* This is probably the equivalent of Mapping an XWindow + but we most likely don't need it because the window + will be Mapped by XReparentWindow + */ } -/*Destroy the editor window*/ - -void vstfx_destroy_editor (VSTFX* vstfx) +/** Destroy the editor window */ +void +vstfx_destroy_editor (VSTState* vstfx) { pthread_mutex_lock (&vstfx->lock); - if (vstfx->window) - { + if (vstfx->linux_window) { vstfx->destroy = TRUE; pthread_cond_wait (&vstfx->window_status_change, &vstfx->lock); } pthread_mutex_unlock (&vstfx->lock); } -/*Remove a vstfx instance from the linked list parsed by the -event loop*/ - -void vstfx_event_loop_remove_plugin (VSTFX* vstfx) +/** Remove a vstfx instance from the linked list parsed by the + event loop +*/ +void +vstfx_event_loop_remove_plugin (VSTState* vstfx) { - /*This only ever gets called from within our GUI thread - so we don't need to lock here - if we did there would be - a deadlock anyway*/ + /* This only ever gets called from within our GUI thread + so we don't need to lock here - if we did there would be + a deadlock anyway + */ - VSTFX* p; - VSTFX* prev; + VSTState* p; + VSTState* prev; - for(p = vstfx_first, prev = NULL; p; prev = p, p = p->next) - { - if(p == vstfx) - { - if(prev) - { + for (p = vstfx_first, prev = NULL; p; prev = p, p = p->next) { + if (p == vstfx) { + if (prev) { prev->next = p->next; break; } } } - if (vstfx_first == vstfx) + if (vstfx_first == vstfx) { vstfx_first = vstfx_first->next; + } } /*Get the XID of the plugin editor window*/ -int vstfx_get_XID (VSTFX* vstfx) +int +vstfx_get_XID (VSTState* vstfx) { int id; - /*Wait for the lock to become free - otherwise - the window might be in the process of being - created and we get bad Window errors when trying - to embed it in the GTK UI*/ + /* Wait for the lock to become free - otherwise + the window might be in the process of being + created and we get bad Window errors when trying + to embed it in the GTK UI + */ pthread_mutex_lock(&vstfx->lock); - /*The Window may be scheduled for creation - but not actually created by the gui_event_loop yet - - - spin here until it has been activated. Possible - deadlock if the window never gets activated but - should not be called here if the window doesn't - exist or will never exist*/ + /* The Window may be scheduled for creation + but not actually created by the gui_event_loop yet - + spin here until it has been activated. Possible + deadlock if the window never gets activated but + should not be called here if the window doesn't + exist or will never exist + */ - while(!(vstfx->been_activated)) - usleep(1000); + while (!(vstfx->been_activated)) { + usleep (1000); + } id = vstfx->xid; - pthread_mutex_unlock(&vstfx->lock); + pthread_mutex_unlock (&vstfx->lock); - /*Finally it might be safe to return the ID - - problems will arise if we return either a zero ID - and GTK tries to socket it or if we return an ID - which hasn't yet become real to the server*/ + /* Finally it might be safe to return the ID - + problems will arise if we return either a zero ID + and GTK tries to socket it or if we return an ID + which hasn't yet become real to the server + */ return id; } -float htonf (float v) +float +htonf (float v) { float result; char * fin = (char*)&v; @@ -830,7 +825,7 @@ float htonf (float v) #if 0 -int vstfx_load_state (VSTFX* vstfx, char * filename) +int vstfx_load_state (VSTState* vstfx, char * filename) { FILE* f = fopen (filename, "rb"); if(f) diff --git a/gtk2_ardour/windows_vst_plugin_ui.cc b/gtk2_ardour/windows_vst_plugin_ui.cc index dbd61b3268..1a966109ae 100644 --- a/gtk2_ardour/windows_vst_plugin_ui.cc +++ b/gtk2_ardour/windows_vst_plugin_ui.cc @@ -140,7 +140,7 @@ WindowsVSTPluginUI::forward_key_event (GdkEventKey* ev) { if (ev->type == GDK_KEY_PRESS) { - FST* fst = vst->fst (); + VSTState* fst = vst->fst (); pthread_mutex_lock (&fst->lock); if (fst->n_pending_keys == (sizeof (fst->pending_keys) * sizeof (VSTKey))) { diff --git a/libs/ardour/ardour/lxvst_plugin.h b/libs/ardour/ardour/lxvst_plugin.h index 9384014100..f47bb140aa 100755 --- a/libs/ardour/ardour/lxvst_plugin.h +++ b/libs/ardour/ardour/lxvst_plugin.h @@ -87,7 +87,7 @@ class LXVSTPlugin : public ARDOUR::Plugin int set_state (XMLNode const &, int); AEffect * plugin () const { return _plugin; } - VSTFX * vstfx () const { return _vstfx; } + VSTState * vstfx () const { return _vstfx; } private: @@ -103,8 +103,8 @@ private: void add_state (XMLNode *) const; VSTHandle * handle; - VSTFX* _vstfx; - AEffect* _plugin; + VSTState * _vstfx; + AEffect * _plugin; bool been_resumed; }; diff --git a/libs/ardour/ardour/vst_types.h b/libs/ardour/ardour/vst_types.h index f441844e2d..9bc64b269f 100644 --- a/libs/ardour/ardour/vst_types.h +++ b/libs/ardour/ardour/vst_types.h @@ -69,4 +69,63 @@ struct _VSTHandle typedef struct _VSTHandle VSTHandle; +struct _VSTState +{ + AEffect* plugin; + + /* Linux */ + int linux_window; /* The plugin's parent X11 XWindow */ + int linux_plugin_ui_window; /*The ID of the plugin UI window created by the plugin*/ + + /* Windows */ + void* windows_window; + + int xid; /* X11 XWindow */ + + int want_resize; /*Set to signal the plugin resized its UI*/ + void* extra_data; /*Pointer to any extra data*/ + + void* event_callback_thisptr; + void (*eventProc) (void* event); + + VSTHandle* handle; + + int width; + int height; + int wantIdle; + int destroy; + int vst_version; + int has_editor; + + int program_set_without_editor; + + int want_program; + int want_chunk; + int n_pending_keys; + unsigned char* wanted_chunk; + int wanted_chunk_size; + int current_program; + float * want_params; + float * set_params; + + VSTKey pending_keys[16]; + + int dispatcher_wantcall; + int dispatcher_opcode; + int dispatcher_index; + int dispatcher_val; + void * dispatcher_ptr; + float dispatcher_opt; + int dispatcher_retval; + + struct _VSTState * next; + pthread_mutex_t lock; + pthread_cond_t window_status_change; + pthread_cond_t plugin_dispatcher_called; + pthread_cond_t window_created; + int been_activated; +}; + +typedef struct _VSTState VSTState; + #endif diff --git a/libs/ardour/ardour/vstfx.h b/libs/ardour/ardour/vstfx.h index 08534e408a..0f8772230b 100755 --- a/libs/ardour/ardour/vstfx.h +++ b/libs/ardour/ardour/vstfx.h @@ -18,93 +18,34 @@ void vstfx_set_error_function (void (*func)(const char *)); void vstfx_error (const char *fmt, ...); -#include "ardour/vestige/aeffectx.h" - -typedef struct _VSTFX VSTFX; - -/*Structure used to describe the instance of VSTFX responsible for - a particular plugin instance. These are connected together in a - linked list*/ - -struct _VSTFX -{ - AEffect* plugin; - int window; /* The plugin's parent X11 XWindow */ - int plugin_ui_window; /*The ID of the plugin UI window created by the plugin*/ - int xid; /* X11 XWindow */ - - int want_resize; /*Set to signal the plugin resized its UI*/ - void* extra_data; /*Pointer to any extra data*/ - - void* event_callback_thisptr; - void (*eventProc) (void* event); - - VSTHandle* handle; - - int width; - int height; - int wantIdle; - int destroy; - int vst_version; - int has_editor; - - int program_set_without_editor; - - int want_program; - int want_chunk; - int n_pending_keys; - unsigned char* wanted_chunk; - int wanted_chunk_size; - int current_program; - float *want_params; - float *set_params; - - VSTKey pending_keys[16]; - - int dispatcher_wantcall; - int dispatcher_opcode; - int dispatcher_index; - int dispatcher_val; - void * dispatcher_ptr; - float dispatcher_opt; - int dispatcher_retval; - - struct _VSTFX* next; - pthread_mutex_t lock; - pthread_cond_t window_status_change; - pthread_cond_t plugin_dispatcher_called; - pthread_cond_t window_created; - int been_activated; -}; - /*API to vstfx*/ -extern int vstfx_launch_editor(VSTFX* vstfx); -extern int vstfx_init (void* possible_hmodule); +extern int vstfx_launch_editor (VSTState *); +extern int vstfx_init (void *); extern void vstfx_exit (); extern VSTHandle * vstfx_load (const char*); extern int vstfx_unload (VSTHandle *); -extern VSTFX* vstfx_instantiate (VSTHandle *, audioMasterCallback, void *); -extern void vstfx_close (VSTFX*); +extern VSTState * vstfx_instantiate (VSTHandle *, audioMasterCallback, void *); +extern void vstfx_close (VSTState*); -extern int vstfx_create_editor (VSTFX* vstfx); -extern int vstfx_run_editor (VSTFX*); -extern void vstfx_destroy_editor (VSTFX*); -extern int vstfx_get_XID (VSTFX*); -extern void vstfx_move_window_into_view (VSTFX*); +extern int vstfx_create_editor (VSTState *); +extern int vstfx_run_editor (VSTState *); +extern void vstfx_destroy_editor (VSTState *); +extern int vstfx_get_XID (VSTState *); +extern void vstfx_move_window_into_view (VSTState *); -extern VSTInfo * vstfx_get_info (char *dllpathname); +extern VSTInfo * vstfx_get_info (char *); extern void vstfx_free_info (VSTInfo *); -extern void vstfx_event_loop_remove_plugin (VSTFX* fst); -extern int vstfx_call_dispatcher (VSTFX *vstfx, int opcode, int index, int val, void *ptr, float opt); +extern void vstfx_event_loop_remove_plugin (VSTState *); +extern int vstfx_call_dispatcher (VSTState *, int, int, int, void *, float); /** Load a plugin state from a file.**/ -extern int vstfx_load_state (VSTFX* vstfx, char * filename); +extern int vstfx_load_state (VSTState* vstfx, char * filename); /** Save a plugin state to a file.**/ -extern bool vstfx_save_state (VSTFX* vstfx, char * filename); +extern bool vstfx_save_state (VSTState* vstfx, char * filename); #endif /* __vstfx_h__ */ diff --git a/libs/ardour/ardour/windows_vst_plugin.h b/libs/ardour/ardour/windows_vst_plugin.h index 973c25e6b0..6de87aee89 100644 --- a/libs/ardour/ardour/windows_vst_plugin.h +++ b/libs/ardour/ardour/windows_vst_plugin.h @@ -30,8 +30,8 @@ #include "pbd/stateful.h" #include "ardour/plugin.h" -struct _FST; -typedef struct _FST FST; +struct _VSTState; +typedef struct _VSTState VSTState; struct _AEffect; typedef struct _AEffect AEffect; struct _VSTHandle; @@ -87,7 +87,7 @@ class WindowsVSTPlugin : public ARDOUR::Plugin int set_state (XMLNode const &, int); AEffect * plugin () const { return _plugin; } - FST * fst () const { return _fst; } + VSTState * fst () const { return _fst; } private: @@ -103,7 +103,7 @@ private: void add_state (XMLNode *) const; VSTHandle* handle; - FST* _fst; + VSTState* _fst; AEffect* _plugin; bool been_resumed; }; diff --git a/libs/ardour/vstfx.cc b/libs/ardour/vstfx.cc index a150ead8ae..4cff1deb25 100755 --- a/libs/ardour/vstfx.cc +++ b/libs/ardour/vstfx.cc @@ -53,9 +53,10 @@ vstfx_handle_new () /*Create and return a pointer to a new vstfx instance*/ -VSTFX* vstfx_new () +VSTState * +vstfx_new () { - VSTFX* vstfx = (VSTFX*) calloc (1, sizeof (VSTFX)); + VSTState* vstfx = (VSTState *) calloc (1, sizeof (VSTState)); /*Mutexes*/ @@ -72,8 +73,8 @@ VSTFX* vstfx_new () vstfx->n_pending_keys = 0; vstfx->has_editor = 0; vstfx->program_set_without_editor = 0; - vstfx->window = 0; - vstfx->plugin_ui_window = 0; + vstfx->linux_window = 0; + vstfx->linux_plugin_ui_window = 0; vstfx->eventProc = NULL; vstfx->extra_data = NULL; vstfx->want_resize = 0; @@ -270,10 +271,10 @@ vstfx_unload (VSTHandle* fhandle) /*This instantiates a plugin*/ -VSTFX * +VSTState * vstfx_instantiate (VSTHandle* fhandle, audioMasterCallback amc, void* userptr) { - VSTFX* vstfx = vstfx_new (); + VSTState* vstfx = vstfx_new (); if(fhandle == NULL) { @@ -315,7 +316,7 @@ vstfx_instantiate (VSTHandle* fhandle, audioMasterCallback amc, void* userptr) /*Close a vstfx instance*/ -void vstfx_close (VSTFX* vstfx) +void vstfx_close (VSTState* vstfx) { vstfx_destroy_editor(vstfx); @@ -358,7 +359,7 @@ void vstfx_close (VSTFX* vstfx) bool -vstfx_save_state (VSTFX* vstfx, char * filename) +vstfx_save_state (VSTState* vstfx, char * filename) { FILE* f = fopen (filename, "wb"); if (f) @@ -460,7 +461,7 @@ vstfx_save_state (VSTFX* vstfx, char * filename) /*Set up a call to the plugins 'dispatcher' function*/ -int vstfx_call_dispatcher (VSTFX *vstfx, int opcode, int index, int val, void *ptr, float opt) +int vstfx_call_dispatcher (VSTState* vstfx, int opcode, int index, int val, void *ptr, float opt) { pthread_mutex_lock (&vstfx->lock); diff --git a/libs/ardour/vstfxinfofile.cc b/libs/ardour/vstfxinfofile.cc index e44e16f5c5..070c646dbe 100755 --- a/libs/ardour/vstfxinfofile.cc +++ b/libs/ardour/vstfxinfofile.cc @@ -257,7 +257,8 @@ static FILE* vstfx_infofile_for_write (char* dllpath) return f; } -static int vstfx_can_midi(VSTFX *vstfx) +static +int vstfx_can_midi (VSTState* vstfx) { AEffect *plugin = vstfx->plugin; @@ -274,7 +275,7 @@ static int vstfx_can_midi(VSTFX *vstfx) } static VSTInfo * -vstfx_info_from_plugin (VSTFX *vstfx) +vstfx_info_from_plugin (VSTState* vstfx) { VSTInfo* info = (VSTInfo*) malloc (sizeof (VSTInfo)); @@ -365,9 +366,9 @@ VSTInfo * vstfx_get_info (char* dllpath) { FILE* infofile; - VSTHandle *h; - VSTFX *vstfx; - VSTInfo *info; + VSTHandle* h; + VSTState* vstfx; + VSTInfo* info; if ((infofile = vstfx_infofile_for_read (dllpath)) != 0) { VSTInfo *info; diff --git a/libs/fst/fst.h b/libs/fst/fst.h index 545bfaf165..5313f5ee03 100644 --- a/libs/fst/fst.h +++ b/libs/fst/fst.h @@ -28,48 +28,6 @@ void fst_set_error_function (void (*func)(const char *)); void fst_error (const char *fmt, ...); -typedef struct _FST FST; - -struct _FST -{ - AEffect* plugin; - void* window; /* win32 HWND */ - int xid; /* X11 XWindow */ - VSTHandle* handle; - int width; - int height; - int wantIdle; - int destroy; - int vst_version; - int has_editor; - - int program_set_without_editor; - int want_program; - int want_chunk; - unsigned char *wanted_chunk; - int wanted_chunk_size; - int current_program; - float *want_params; - float *set_params; - - VSTKey pending_keys[16]; - int n_pending_keys; - - int dispatcher_wantcall; - int dispatcher_opcode; - int dispatcher_index; - int dispatcher_val; - void * dispatcher_ptr; - float dispatcher_opt; - int dispatcher_retval; - - struct _FST* next; - pthread_mutex_t lock; - pthread_cond_t window_status_change; - pthread_cond_t plugin_dispatcher_called; - int been_activated; -}; - #ifdef __cplusplus extern "C" { #endif @@ -80,29 +38,29 @@ extern void fst_exit (); extern VSTHandle* fst_load (const char*); extern int fst_unload (VSTHandle*); -extern FST* fst_instantiate (VSTHandle*, audioMasterCallback amc, void* userptr); -extern void fst_close (FST*); +extern VSTState * fst_instantiate (VSTHandle *, audioMasterCallback amc, void* userptr); +extern void fst_close (VSTState *); -extern int fst_create_editor (FST* fst); -extern int fst_run_editor (FST*); -extern void fst_destroy_editor (FST*); -extern int fst_get_XID (FST*); -extern void fst_move_window_into_view (FST*); +extern int fst_create_editor (VSTState* fst); +extern int fst_run_editor (VSTState *); +extern void fst_destroy_editor (VSTState *); +extern int fst_get_XID (VSTState *); +extern void fst_move_window_into_view (VSTState *); extern VSTInfo *fst_get_info (char *dllpathname); extern void fst_free_info (VSTInfo *info); -extern void fst_event_loop_remove_plugin (FST* fst); -extern int fst_call_dispatcher(FST *fst, int opcode, int index, int val, void *ptr, float opt ); +extern void fst_event_loop_remove_plugin (VSTState* fst); +extern int fst_call_dispatcher (VSTState *, int, int, int, void *, float); /** * Load a plugin state from a file. */ -extern int fst_load_state (FST * fst, char * filename); +extern int fst_load_state (VSTState *, char *); /** * Save a plugin state to a file. */ -extern int fst_save_state (FST * fst, char * filename); +extern int fst_save_state (VSTState *, char *); extern int wine_pthread_create (pthread_t* thread_id, const pthread_attr_t* attr, void *(*function)(void*), void* arg); diff --git a/libs/fst/fstinfofile.c b/libs/fst/fstinfofile.c index dec6db760a..4b5e95c2d1 100644 --- a/libs/fst/fstinfofile.c +++ b/libs/fst/fstinfofile.c @@ -148,7 +148,7 @@ static int fst_info_file_is_valid( char *dllpath ) { } static int -fst_can_midi (FST *fst) +fst_can_midi (VSTState* fst) { AEffect* plugin = fst->plugin; int vst_version = plugin->dispatcher (plugin, effGetVstVersion, 0, 0, NULL, 0.0f); @@ -165,7 +165,7 @@ fst_can_midi (FST *fst) } static VSTInfo * -fst_info_from_plugin (FST* fst) +fst_info_from_plugin (VSTState* fst) { VSTInfo* info = (VSTInfo *) malloc (sizeof (VSTInfo)); AEffect* plugin; @@ -241,10 +241,10 @@ fst_get_info (char* dllpath) } else { - VSTHandle *h; - FST *fst; - VSTInfo *info; - char *fstpath; + VSTHandle* h; + VSTState* fst; + VSTInfo* info; + char* fstpath; if( !(h = fst_load( dllpath )) ) return NULL; if( !(fst = fst_instantiate( h, simple_master_callback, NULL )) ) { diff --git a/libs/fst/jackvst.h b/libs/fst/jackvst.h index 28c6f05852..b496f68493 100644 --- a/libs/fst/jackvst.h +++ b/libs/fst/jackvst.h @@ -12,8 +12,8 @@ typedef struct _JackVST JackVST; struct _JackVST { jack_client_t *client; - VSTHandle* handle; - FST* fst; + VSTHandle * handle; + VSTState * fst; float **ins; float **outs; jack_port_t *midi_port; @@ -24,13 +24,6 @@ struct _JackVST { int muted; int current_program; - int midi_map[128]; - volatile int midi_learn; - volatile int midi_learn_CC; - volatile int midi_learn_PARAM; - - int resume_called; - /* For VST/i support */ int want_midi; diff --git a/libs/fst/vstwin.c b/libs/fst/vstwin.c index 91a25e5852..00c5be2fc7 100644 --- a/libs/fst/vstwin.c +++ b/libs/fst/vstwin.c @@ -26,7 +26,7 @@ struct ERect{ static pthread_mutex_t plugin_mutex; /** Head of linked list of all FSTs */ -static FST* fst_first = NULL; +static VSTState* fst_first = NULL; const char magic[] = "FST Plugin State v002"; @@ -68,10 +68,10 @@ my_window_proc (HWND w, UINT msg, WPARAM wp, LPARAM lp) return DefWindowProcA (w, msg, wp, lp ); } -static FST* +static VSTState * fst_new () { - FST* fst = (FST*) calloc (1, sizeof (FST)); + VSTState* fst = (VSTState *) calloc (1, sizeof (VSTState)); pthread_mutex_init (&fst->lock, NULL); pthread_cond_init (&fst->window_status_change, NULL); pthread_cond_init (&fst->plugin_dispatcher_called, NULL); @@ -92,7 +92,7 @@ fst_handle_new () } void -maybe_set_program (FST* fst) +maybe_set_program (VSTState* fst) { if (fst->want_program != -1) { if (fst->vst_version >= 2) { @@ -118,7 +118,7 @@ maybe_set_program (FST* fst) DWORD WINAPI gui_event_loop (LPVOID param) { MSG msg; - FST* fst; + VSTState* fst; HMODULE hInst; HWND window; int i; @@ -180,10 +180,10 @@ again: if (fst->destroy) { fprintf (stderr, "%s scheduled for destroy\n", fst->handle->name); - if (fst->window) { + if (fst->windows_window) { fst->plugin->dispatcher( fst->plugin, effEditClose, 0, 0, NULL, 0.0 ); - CloseWindow (fst->window); - fst->window = NULL; + CloseWindow (fst->windows_window); + fst->windows_window = NULL; fst->destroy = FALSE; } fst_event_loop_remove_plugin (fst); @@ -193,7 +193,7 @@ again: goto again; } - if (fst->window == NULL) { + if (fst->windows_window == NULL) { if (fst_create_editor (fst)) { fst_error ("cannot create editor for plugin %s", fst->handle->name); fst_event_loop_remove_plugin (fst); @@ -326,7 +326,7 @@ fst_exit () } int -fst_run_editor (FST* fst) +fst_run_editor (VSTState* fst) { /* wait for the plugin editor window to be created (or not) */ @@ -334,12 +334,12 @@ fst_run_editor (FST* fst) fst->has_editor = 1; - if (!fst->window) { + if (!fst->windows_window) { pthread_cond_wait (&fst->window_status_change, &fst->lock); } pthread_mutex_unlock (&fst->lock); - if (!fst->window) { + if (!fst->windows_window) { return -1; } @@ -347,7 +347,7 @@ fst_run_editor (FST* fst) } int -fst_call_dispatcher (FST *fst, int opcode, int index, int val, void *ptr, float opt) +fst_call_dispatcher (VSTState* fst, int opcode, int index, int val, void *ptr, float opt) { pthread_mutex_lock (&fst->lock); fst->dispatcher_opcode = opcode; @@ -364,7 +364,7 @@ fst_call_dispatcher (FST *fst, int opcode, int index, int val, void *ptr, float } int -fst_create_editor (FST* fst) +fst_create_editor (VSTState * fst) { HMODULE hInst; HWND window; @@ -401,12 +401,12 @@ fst_create_editor (FST* fst) fst_error ("cannot set fst_ptr on window"); } - fst->window = window; + fst->windows_window = window; // fst->xid = (int) GetPropA (window, "__wine_x11_whole_window"); //printf( "effEditOpen......\n" ); - fst->plugin->dispatcher (fst->plugin, effEditOpen, 0, 0, fst->window, 0 ); + fst->plugin->dispatcher (fst->plugin, effEditOpen, 0, 0, fst->windows_window, 0); fst->plugin->dispatcher (fst->plugin, effEditGetRect, 0, 0, &er, 0 ); fst->width = er->right-er->left; @@ -414,8 +414,8 @@ fst_create_editor (FST* fst) //printf( "get rect ses... %d,%d\n", fst->width, fst->height ); //SetWindowPos (fst->window, 0, 9999, 9999, er->right-er->left+8, er->bottom-er->top+26, 0); - SetWindowPos (fst->window, 0, 9999, 9999, 2, 2, 0); - ShowWindow (fst->window, SW_SHOWNA); + SetWindowPos (fst->windows_window, 0, 9999, 9999, 2, 2, 0); + ShowWindow (fst->windows_window, SW_SHOWNA); //SetWindowPos (fst->window, 0, 0, 0, er->right-er->left+8, er->bottom-er->top+26, SWP_NOMOVE|SWP_NOZORDER); fst->xid = (int) GetPropA (window, "__wine_x11_whole_window"); @@ -427,19 +427,19 @@ fst_create_editor (FST* fst) } void -fst_move_window_into_view (FST* fst) +fst_move_window_into_view (VSTState* fst) { - if (fst->window) { - SetWindowPos (fst->window, 0, 0, 0, fst->width, fst->height+24, 0); - ShowWindow (fst->window, SW_SHOWNA); + if (fst->windows_window) { + SetWindowPos (fst->windows_window, 0, 0, 0, fst->width, fst->height + 24, 0); + ShowWindow (fst->windows_window, SW_SHOWNA); } } void -fst_destroy_editor (FST* fst) +fst_destroy_editor (VSTState* fst) { pthread_mutex_lock (&fst->lock); - if (fst->window) { + if (fst->windows_window) { fprintf (stderr, "mark %s for destroy\n", fst->handle->name); fst->destroy = TRUE; //if (!PostThreadMessageA (gui_thread_id, WM_USER, 0, 0)) { @@ -454,10 +454,10 @@ fst_destroy_editor (FST* fst) } void -fst_event_loop_remove_plugin (FST* fst) +fst_event_loop_remove_plugin (VSTState* fst) { - FST* p; - FST* prev; + VSTState* p; + VSTState* prev; for (p = fst_first, prev = NULL; p->next; prev = p, p = p->next) { if (p == fst) { @@ -601,17 +601,17 @@ fst_unload (VSTHandle* fhandle) return 0; } -FST* +VSTState* fst_instantiate (VSTHandle* fhandle, audioMasterCallback amc, void* userptr) { - FST* fst = fst_new (); + VSTState* fst = fst_new (); pthread_mutex_lock (&plugin_mutex); if (fst_first == NULL) { fst_first = fst; } else { - FST* p = fst_first; + VSTState* p = fst_first; while (p->next) { p = p->next; } @@ -652,7 +652,7 @@ fst_instantiate (VSTHandle* fhandle, audioMasterCallback amc, void* userptr) } void -fst_close (FST* fst) +fst_close (VSTState* fst) { fst_destroy_editor (fst); @@ -665,7 +665,7 @@ fst_close (FST* fst) } int -fst_get_XID (FST* fst) +fst_get_XID (VSTState* fst) { return fst->xid; } @@ -791,7 +791,8 @@ int fst_load_state (FST * fst, char * filename) } #endif -int fst_save_state (FST * fst, char * filename) +int +fst_save_state (VSTState * fst, char * filename) { FILE * f = fopen (filename, "wb"); int j; -- cgit v1.2.3