#include <string.h>
#include <windows.h>
+#define fst_error(...) fprintf(stderr, __VA_ARGS__)
+
#ifdef PLATFORM_WINDOWS
-#include <ardourext/misc.h>
-#include <ardourext/pthread.h>
+#include <pthread.h>
static UINT_PTR idle_timer_id = 0;
#else /* linux + wine */
#include <linux/limits.h> // PATH_MAX
-#include <libgen.h> // basename
#include <winnt.h>
#include <wine/exception.h>
#include <pthread.h>
static int gui_quit = 0;
+static unsigned int idle_id = 0;
#endif
+#ifndef COMPILER_MSVC
extern char * strdup (const char *);
+#endif
+
#include <glib.h>
#include "fst.h"
}
}
+ pthread_mutex_lock (&fst->lock);
#ifndef PLATFORM_WINDOWS /* linux + wine */
/* Dispatch messages to send keypresses to the plugin */
- pthread_mutex_lock (&fst->lock);
int i;
for (i = 0; i < fst->n_pending_keys; ++i) {
}
fst->n_pending_keys = 0;
+#endif
/* See comment for maybe_set_program call below */
maybe_set_program (fst);
maybe_set_program (fst);
fst->program_set_without_editor = 1;
}
-#endif
pthread_mutex_unlock (&fst->lock);
}
fst->n_pending_keys = 0;
fst->has_editor = 0;
#ifdef PLATFORM_WINDOWS
- fst->voffset = 36;
+ fst->voffset = 50;
+ fst->hoffset = 0;
#else /* linux + wine */
fst->voffset = 24;
+ fst->hoffset = 6;
#endif
fst->program_set_without_editor = 0;
return fst;
#ifndef PLATFORM_WINDOWS /* linux + wine */
static gboolean
g_idle_call (gpointer ignored) {
+ if (gui_quit) return FALSE;
MSG msg;
if (PeekMessageA (&msg, NULL, 0, 0, 1)) {
TranslateMessage (&msg);
DispatchMessageA (&msg);
}
idle_hands(NULL, 0, 0, 0);
+ g_main_context_iteration(NULL, FALSE);
return gui_quit ? FALSE : TRUE;
}
#endif
fst_error ("Error in fst_init(): (class registration failed");
return -1;
}
+ return 0;
+}
+
+void
+fst_start_threading(void)
+{
+#ifndef PLATFORM_WINDOWS /* linux + wine */
+ if (idle_id == 0) {
+ gui_quit = 0;
+ idle_id = g_idle_add (g_idle_call, NULL);
+ }
+#endif
+}
+
+void
+fst_stop_threading(void) {
#ifndef PLATFORM_WINDOWS /* linux + wine */
- gui_quit = 0;
- g_idle_add (g_idle_call, NULL); // XXX too early ?
- //g_timeout_add(40, g_idle_call, NULL);
+ if (idle_id != 0) {
+ gui_quit = 1;
+ PostQuitMessage (0);
+ g_main_context_iteration(NULL, FALSE);
+ //g_source_remove(idle_id);
+ idle_id = 0;
+ }
#endif
- return 0;
}
void
KillTimer(NULL, idle_timer_id);
}
#else /* linux + wine */
- gui_quit = 1;
- PostQuitMessage (0);
+ if (idle_id) {
+ gui_quit = 1;
+ PostQuitMessage (0);
+ }
#endif
host_initialized = FALSE;
if (fst->windows_window == NULL) {
HMODULE hInst;
HWND window;
- struct ERect* er;
+ struct ERect* er = NULL;
if (!(fst->plugin->flags & effFlagsHasEditor)) {
fst_error ("Plugin \"%s\" has no editor", fst->handle->name);
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;
- fst->height = er->bottom-er->top;
-
+ if (er != NULL) {
+ fst->width = er->right - er->left;
+ fst->height = er->bottom - er->top;
+ }
fst->been_activated = TRUE;
{
if (fst->windows_window) {
#ifdef PLATFORM_WINDOWS
- SetWindowPos ((HWND)(fst->windows_window), 0, 0, fst->voffset, fst->width, fst->height, 0);
+ SetWindowPos ((HWND)(fst->windows_window), 0, fst->hoffset, fst->voffset, fst->width + fst->hoffset, fst->height + fst->voffset, 0);
#else /* linux + wine */
- SetWindowPos ((HWND)(fst->windows_window), 0, 0, 0, fst->width, fst->height, 0);
+ SetWindowPos ((HWND)(fst->windows_window), 0, 0, 0, fst->width + fst->hoffset, fst->height + fst->voffset, 0);
#endif
ShowWindow ((HWND)(fst->windows_window), SW_SHOWNA);
}
if ((strlen(path)) && (NULL != (fhandle = fst_handle_new ())))
{
char* period;
- fhandle->nameptr = strdup (path);
fhandle->path = strdup (path);
- fhandle->name = basename(fhandle->nameptr);
+ fhandle->name = g_path_get_basename(path);
if ((period = strrchr (fhandle->name, '.'))) {
*period = '\0';
}
return NULL;
}
- fhandle->main_entry = (main_entry_t) GetProcAddress (fhandle->dll, "main");
+ fhandle->main_entry = (main_entry_t) GetProcAddress ((HMODULE)fhandle->dll, "main");
if (fhandle->main_entry == 0) {
- if ((fhandle->main_entry = (main_entry_t) GetProcAddress (fhandle->dll, "VSTPluginMain"))) {
+ if ((fhandle->main_entry = (main_entry_t) GetProcAddress ((HMODULE)fhandle->dll, "VSTPluginMain"))) {
fprintf(stderr, "VST >= 2.4 plugin '%s'\n", path);
//PBD::warning << path << _(": is a VST >= 2.4 - this plugin may or may not function correctly with this version of Ardour.") << endmsg;
}
(*fhandle)->path = NULL;
}
- if ((*fhandle)->nameptr) {
- free ((*fhandle)->nameptr);
- (*fhandle)->nameptr = NULL;
+ if ((*fhandle)->name) {
+ free ((*fhandle)->name);
(*fhandle)->name = NULL;
}
return fst;
}
+void fst_audio_master_idle(void) {
+ while(g_main_context_iteration(NULL, FALSE)) ;
+}
+
void
fst_close (VSTState* fst)
{
if (fst->handle->plugincnt && --fst->handle->plugincnt == 0) {
fst->handle->main_entry = NULL;
- fst_unload (&fst->handle);
+ fst_unload (&fst->handle); // XXX
}
}