/*
* This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2006 Richard Kettlewell
+ * Copyright (C) 2004-2008 Richard Kettlewell
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
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],
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;
}
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);
}