filter-chain: simplify the plugin API

This commit is contained in:
Wim Taymans 2021-08-10 20:07:06 +02:00
parent 85dd03c2d8
commit 48136b4c2b
2 changed files with 53 additions and 78 deletions

View file

@ -36,20 +36,22 @@
#include "ladspa.h" #include "ladspa.h"
struct plugin_data { struct plugin {
struct fc_plugin plugin;
void *handle; void *handle;
LADSPA_Descriptor_Function desc_func; LADSPA_Descriptor_Function desc_func;
}; };
struct desc_data { struct descriptor {
struct fc_descriptor desc;
const LADSPA_Descriptor *d; const LADSPA_Descriptor *d;
}; };
static void *ladspa_instantiate(const struct fc_descriptor *desc, static void *ladspa_instantiate(const struct fc_descriptor *desc,
unsigned long SampleRate, const char *config) unsigned long SampleRate, const char *config)
{ {
struct desc_data *dd = desc->user; struct descriptor *d = (struct descriptor *)desc;
return dd->d->instantiate(dd->d, SampleRate); return d->d->instantiate(d->d, SampleRate);
} }
static const LADSPA_Descriptor *find_desc(LADSPA_Descriptor_Function desc_func, const char *name) static const LADSPA_Descriptor *find_desc(LADSPA_Descriptor_Function desc_func, const char *name)
@ -65,11 +67,6 @@ static const LADSPA_Descriptor *find_desc(LADSPA_Descriptor_Function desc_func,
return NULL; return NULL;
} }
static void ladspa_free(struct fc_descriptor *desc)
{
free(desc->ports);
}
static const char *ladspa_get_prop(struct fc_descriptor *desc, const char *name) static const char *ladspa_get_prop(struct fc_descriptor *desc, const char *name)
{ {
return NULL; return NULL;
@ -131,8 +128,7 @@ static float get_default(struct fc_port *port, LADSPA_PortRangeHintDescriptor hi
static float ladspa_port_get_param(struct fc_port *port, const char *name) static float ladspa_port_get_param(struct fc_port *port, const char *name)
{ {
struct fc_descriptor *desc = port->desc; struct descriptor *dd = (struct descriptor*)port->desc;
struct desc_data *dd = desc->user;
const LADSPA_Descriptor *d = dd->d; const LADSPA_Descriptor *d = dd->d;
unsigned long p = port->index; unsigned long p = port->index;
LADSPA_PortRangeHintDescriptor hint = d->PortRangeHints[p].HintDescriptor; LADSPA_PortRangeHintDescriptor hint = d->PortRangeHints[p].HintDescriptor;
@ -158,68 +154,71 @@ static float ladspa_port_get_param(struct fc_port *port, const char *name)
return 0.0f; return 0.0f;
} }
static void ladspa_free(struct fc_descriptor *desc)
{
struct descriptor *d = (struct descriptor*)desc;
free(d->desc.ports);
free(d);
}
static const struct fc_descriptor *ladspa_make_desc(struct fc_plugin *plugin, const char *name) static const struct fc_descriptor *ladspa_make_desc(struct fc_plugin *plugin, const char *name)
{ {
struct plugin_data *pd = plugin->user; struct plugin *p = (struct plugin *)plugin;
struct fc_descriptor *desc; struct descriptor *desc;
struct desc_data *dd;
const LADSPA_Descriptor *d; const LADSPA_Descriptor *d;
uint32_t i; uint32_t i;
d = find_desc(pd->desc_func, name); d = find_desc(p->desc_func, name);
if (d == NULL) if (d == NULL)
return NULL; return NULL;
desc = fc_descriptor_new(plugin, sizeof(*dd)); desc = calloc(1, sizeof(*desc));
dd = desc->user; desc->d = d;
dd->d = d;
desc->instantiate = ladspa_instantiate; desc->desc.instantiate = ladspa_instantiate;
desc->cleanup = d->cleanup; desc->desc.cleanup = d->cleanup;
desc->connect_port = d->connect_port; desc->desc.connect_port = d->connect_port;
desc->activate = d->activate; desc->desc.activate = d->activate;
desc->deactivate = d->deactivate; desc->desc.deactivate = d->deactivate;
desc->run = d->run; desc->desc.run = d->run;
desc->free = ladspa_free; desc->desc.free = ladspa_free;
desc->get_prop = ladspa_get_prop; desc->desc.get_prop = ladspa_get_prop;
desc->name = d->Label; desc->desc.name = d->Label;
desc->flags = d->Properties; desc->desc.flags = d->Properties;
desc->n_ports = d->PortCount; desc->desc.n_ports = d->PortCount;
desc->ports = calloc(desc->n_ports, sizeof(struct fc_port)); desc->desc.ports = calloc(desc->desc.n_ports, sizeof(struct fc_port));
for (i = 0; i < desc->n_ports; i++) { for (i = 0; i < desc->desc.n_ports; i++) {
desc->ports[i].index = i; desc->desc.ports[i].index = i;
desc->ports[i].name = d->PortNames[i]; desc->desc.ports[i].name = d->PortNames[i];
desc->ports[i].flags = d->PortDescriptors[i]; desc->desc.ports[i].flags = d->PortDescriptors[i];
desc->ports[i].get_param = ladspa_port_get_param; desc->desc.ports[i].get_param = ladspa_port_get_param;
} }
return desc; return &desc->desc;
} }
static void ladspa_unload(struct fc_plugin *plugin) static void ladspa_unload(struct fc_plugin *plugin)
{ {
struct plugin_data *pd = plugin->user; struct plugin *p = (struct plugin *)plugin;
if (pd->handle) if (p->handle)
dlclose(pd->handle); dlclose(p->handle);
free(p);
} }
static struct fc_plugin *ladspa_handle_load_by_path(const char *path) static struct fc_plugin *ladspa_handle_load_by_path(const char *path)
{ {
struct fc_plugin *plugin; struct plugin *p;
struct plugin_data *pd;
int res; int res;
plugin = fc_plugin_new(sizeof(*pd)); p = calloc(1, sizeof(*p));
if (!plugin) if (!p)
return NULL; return NULL;
pd = plugin->user; p->handle = dlopen(path, RTLD_NOW);
if (!p->handle) {
pd->handle = dlopen(path, RTLD_NOW);
if (!pd->handle) {
pw_log_debug("failed to open '%s': %s", path, dlerror()); pw_log_debug("failed to open '%s': %s", path, dlerror());
res = -ENOENT; res = -ENOENT;
goto exit; goto exit;
@ -227,20 +226,20 @@ static struct fc_plugin *ladspa_handle_load_by_path(const char *path)
pw_log_info("successfully opened '%s'", path); pw_log_info("successfully opened '%s'", path);
pd->desc_func = (LADSPA_Descriptor_Function) dlsym(pd->handle, "ladspa_descriptor"); p->desc_func = (LADSPA_Descriptor_Function) dlsym(p->handle, "ladspa_descriptor");
if (!pd->desc_func) { if (!p->desc_func) {
pw_log_warn("cannot find descriptor function in '%s': %s", path, dlerror()); pw_log_warn("cannot find descriptor function in '%s': %s", path, dlerror());
res = -ENOSYS; res = -ENOSYS;
goto exit; goto exit;
} }
plugin->make_desc = ladspa_make_desc; p->plugin.make_desc = ladspa_make_desc;
plugin->unload = ladspa_unload; p->plugin.unload = ladspa_unload;
return plugin; return &p->plugin;
exit: exit:
if (pd->handle) if (p->handle)
dlclose(pd->handle); dlclose(p->handle);
errno = -res; errno = -res;
return NULL; return NULL;
} }

View file

@ -33,8 +33,6 @@
#include <spa/utils/string.h> #include <spa/utils/string.h>
struct fc_plugin { struct fc_plugin {
void *user;
const struct fc_descriptor *(*make_desc)(struct fc_plugin *plugin, const char *name); const struct fc_descriptor *(*make_desc)(struct fc_plugin *plugin, const char *name);
void (*unload) (struct fc_plugin *plugin); void (*unload) (struct fc_plugin *plugin);
}; };
@ -50,7 +48,6 @@ struct fc_port {
struct fc_descriptor { struct fc_descriptor {
struct fc_plugin *plugin; struct fc_plugin *plugin;
void *user;
const char *name; const char *name;
uint64_t flags; uint64_t flags;
@ -75,37 +72,16 @@ struct fc_descriptor {
void (*run) (void *instance, unsigned long SampleCount); void (*run) (void *instance, unsigned long SampleCount);
}; };
static inline struct fc_plugin *fc_plugin_new(size_t extra)
{
struct fc_plugin *plugin;
plugin = calloc(1, sizeof(*plugin) + extra);
plugin->user = SPA_PTROFF(plugin, sizeof(*plugin), void);
return plugin;
}
static inline void fc_plugin_free(struct fc_plugin *plugin) static inline void fc_plugin_free(struct fc_plugin *plugin)
{ {
if (plugin->unload) if (plugin->unload)
plugin->unload(plugin); plugin->unload(plugin);
free(plugin);
}
static inline struct fc_descriptor *fc_descriptor_new(struct fc_plugin *plugin, size_t extra)
{
struct fc_descriptor *desc;
desc = calloc(1, sizeof(*desc) + extra);
desc->plugin = plugin;
desc->user = SPA_PTROFF(desc, sizeof(*desc), void);
return desc;
} }
static inline void fc_descriptor_free(struct fc_descriptor *desc) static inline void fc_descriptor_free(struct fc_descriptor *desc)
{ {
if (desc->free) if (desc->free)
desc->free(desc); desc->free(desc);
free(desc);
} }
struct fc_plugin *load_ladspa_plugin(const char *path, const char *config); struct fc_plugin *load_ladspa_plugin(const char *path, const char *config);