X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/6d2d327ca57fefaddceba10eb323451f8150e95d..eb5f83f45eb2ff415ededbb30187fec8c3e71010:/lib/plugin.c diff --git a/lib/plugin.c b/lib/plugin.c index 57496e6..abeaa66 100644 --- a/lib/plugin.c +++ b/lib/plugin.c @@ -58,6 +58,7 @@ const struct plugin *open_plugin(const char *name, for(pl = plugins; pl && strcmp(pl->name, name); pl = pl->next) ; if(pl) return pl; + /* Search the plugin path */ for(n = 0; n <= config->plugins.n; ++n) { byte_xasprintf(&p, "%s/%s" SOSUFFIX, n == config->plugins.n ? pkglibdir : config->plugins.s[n], @@ -83,22 +84,22 @@ const struct plugin *open_plugin(const char *name, function_t *get_plugin_function(const struct plugin *pl, const char *symbol) { function_t *f; - const char *e; f = (function_t *)dlsym(pl->dlhandle, symbol); - if((e = dlerror())) - fatal(0, "error looking up function '%s' in '%s': %s",symbol, pl->name, e); + if(!f) + fatal(0, "error looking up function '%s' in '%s': %s", + symbol, pl->name, dlerror()); return f; } const void *get_plugin_object(const struct plugin *pl, const char *symbol) { void *o; - const char *e; o = dlsym(pl->dlhandle, symbol); - if((e = dlerror())) - fatal(0, "error looking up object '%s' in '%s': %s", symbol, pl->name, e); + if(!o) + fatal(0, "error looking up object '%s' in '%s': %s", + symbol, pl->name, dlerror()); return o; } @@ -106,13 +107,18 @@ const void *get_plugin_object(const struct plugin *pl, typedef long tracklength_fn(const char *track, const char *path); -long tracklength(const char *track, const char *path) { - static tracklength_fn *f = 0; +/** Compute the length of a track + * @param plugin plugin to use, as configured + * @param track UTF-8 name of track + * @param path file system path or 0 + * @return length of track in seconds, 0 for unknown, -1 for error + */ +long tracklength(const char *plugin, const char *track, const char *path) { + tracklength_fn *f = 0; - if(!f) - f = (tracklength_fn *)get_plugin_function(open_plugin("tracklength", - PLUGIN_FATAL), - "disorder_tracklength"); + f = (tracklength_fn *)get_plugin_function(open_plugin(plugin, + PLUGIN_FATAL), + "disorder_tracklength"); return (*f)(track, path); }