From 1ecb90d8b349e81ef7e1f1069aba39b4034adf41 Mon Sep 17 00:00:00 2001 From: "G.raud" Date: Mon, 24 Jun 2013 14:36:12 +0200 Subject: [PATCH] jackspa: jackspa_fini(): new function to close/cleanup struct control_t: new member library to store the dlopen() handle close_plugin(): new function to reverse find_plugin() njackspa, gjackspa, qjackspa, jackspa-cli: call jackspa_fini() in all the interfaces --- gjackspa.cpp | 2 ++ jackspa-cli.c | 3 ++- jackspa.c | 43 +++++++++++++++++++++++++++++++++++++++---- jackspa.h | 5 ++++- njackspa.c | 4 +--- qjackspa.cpp | 5 ++++- 6 files changed, 52 insertions(+), 10 deletions(-) diff --git a/gjackspa.cpp b/gjackspa.cpp index 772113b..72879b9 100644 --- a/gjackspa.cpp +++ b/gjackspa.cpp @@ -109,6 +109,8 @@ int main(int argc, char **argv) Main::run(main_window); + jackspa_fini(&state); + return 0; } diff --git a/jackspa-cli.c b/jackspa-cli.c index 81410bb..01cb32b 100644 --- a/jackspa-cli.c +++ b/jackspa-cli.c @@ -119,7 +119,7 @@ int main(int argc, char *argv[]) if (!jackspa_init(&state, argc, argv)) return 1; - /* Set the default values */ + /* Initialize the controls with the requested values */ unsigned long c; controls_t controls; if (control_buildall(&c, &controls, &state)) @@ -141,6 +141,7 @@ int main(int argc, char *argv[]) } control_cleanupall(c, &controls); + jackspa_fini(&state); return 0; } diff --git a/jackspa.c b/jackspa.c index a0ef205..20921d5 100644 --- a/jackspa.c +++ b/jackspa.c @@ -84,19 +84,18 @@ int find_plugin(state_t *state, const char *file, const plugin_id_t plugin_id, { int err = 0; unsigned long i; /* port index */ - void *library; LADSPA_Descriptor *(*descriptor_fun)(unsigned long index); LADSPA_Descriptor *descriptor; /* Open the library. */ - library = ladspa_dlopen(file, RTLD_LAZY); - if (!library) + state->library = ladspa_dlopen(file, RTLD_LAZY); + if (!state->library) err = 1, *error = dlerror(); /* Find the ladspa_descriptor() function. */ if (!err) { descriptor_fun = (LADSPA_Descriptor *(*)(unsigned long)) - dlsym(library, "ladspa_descriptor"); + dlsym(state->library, "ladspa_descriptor"); if (!descriptor_fun) err = 1, *error = dlerror(); } @@ -120,6 +119,17 @@ int find_plugin(state_t *state, const char *file, const plugin_id_t plugin_id, return !err; } +int close_plugin(state_t *state, const char **error) +{ + state->descriptor = NULL; + + if (dlclose(state->library)) + return (*error = dlerror(), 0); + state->library = NULL; + + return 1; +} + /* The JACK processing callback. */ int process(jack_nframes_t nframes, void *arg) { @@ -382,3 +392,28 @@ int jackspa_init(state_t *state, int argc, char **argv) return !err; } + +int jackspa_fini(state_t *state) +{ + int err = 0; + const char *error; + + if ((err = jack_client_close(state->jack_client))) + return !err; + state->jack_client = 0; + + if (state->descriptor->deactivate) + state->descriptor->deactivate(state->handle); + state->descriptor->cleanup(state->handle); + state->handle = 0; + + free(state->control_port_values), state->control_port_values = NULL; + free(state->jack_ports), state->jack_ports = NULL; + state->num_control_ports = 0; state->num_meter_ports = 0; + + free(state->port_names); + + err = !close_plugin(state, &error); + + return !err; +} diff --git a/jackspa.h b/jackspa.h index 0c01e82..47076db 100644 --- a/jackspa.h +++ b/jackspa.h @@ -35,8 +35,9 @@ typedef struct { unsigned long num_control_ports; /* input control ports */ unsigned long num_meter_ports; /* output control ports */ float *control_port_values; /* indexed by the LADSPA port index */ - LADSPA_Descriptor *descriptor; LADSPA_Handle handle; + LADSPA_Descriptor *descriptor; + void *library; } state_t; /* Initial config (command line switches) */ @@ -44,6 +45,8 @@ extern const GOptionEntry jackspa_entries[]; int jackspa_init(state_t *state, int argc, char **argv); +int jackspa_fini(state_t *state); + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/njackspa.c b/njackspa.c index 81b28fa..1643412 100644 --- a/njackspa.c +++ b/njackspa.c @@ -510,9 +510,7 @@ refresh: quit: cleanup_windows(windows); quit_no_clean: - /* jackspa_exit(state); */ - jack_deactivate(state.jack_client); - jack_client_close(state.jack_client); + jackspa_fini(&state); qxit: endwin(); diff --git a/qjackspa.cpp b/qjackspa.cpp index fb542c2..2697278 100644 --- a/qjackspa.cpp +++ b/qjackspa.cpp @@ -112,7 +112,10 @@ int main(int argc, char *argv[]) throw(e); } - return app.exec(); + int rc = app.exec(); + + jackspa_fini(&state); + return rc; } ControlLayout::ControlLayout(state_t *state, unsigned long port, -- 2.11.4.GIT