mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-04 05:22:30 +00:00
ladspa: add initial liblrdf support.
Get classification from rdf metadata.
This commit is contained in:
parent
1b7a9ca6c5
commit
eae238a125
3 changed files with 169 additions and 11 deletions
|
@ -860,6 +860,13 @@ AG_GST_CHECK_FEATURE(LADSPA, [ladspa], ladspa, [
|
||||||
LADSPA_LIBS="-ldl",
|
LADSPA_LIBS="-ldl",
|
||||||
HAVE_LADSPA="no")
|
HAVE_LADSPA="no")
|
||||||
CFLAGS="$save_cflags"
|
CFLAGS="$save_cflags"
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(LRDF, lrdf, HAVE_LRDF=yes, HAVE_LRDF=no)
|
||||||
|
if test $HAVE_LRDF = "yes"; then
|
||||||
|
AC_DEFINE(HAVE_LRDF, 1, [Define if we have liblrdf])
|
||||||
|
fi
|
||||||
|
AC_SUBST(LRDF_LIBS)
|
||||||
|
AC_SUBST(LRDF_CFLAGS)
|
||||||
])
|
])
|
||||||
AC_SUBST(LADSPA_LIBS)
|
AC_SUBST(LADSPA_LIBS)
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
plugin_LTLIBRARIES = libgstladspa.la
|
plugin_LTLIBRARIES = libgstladspa.la
|
||||||
|
|
||||||
libgstladspa_la_SOURCES = gstsignalprocessor.c gstladspa.c
|
libgstladspa_la_SOURCES = gstsignalprocessor.c gstladspa.c
|
||||||
libgstladspa_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS)
|
libgstladspa_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(LRDF_CFLAGS)
|
||||||
libgstladspa_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LIBM) $(LADSPA_LIBS)
|
libgstladspa_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LIBM) $(LADSPA_LIBS) $(LRDF_LIBS)
|
||||||
libgstladspa_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
libgstladspa_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
||||||
libgstladspa_la_LIBTOOLFLAGS = --tag=disable-static
|
libgstladspa_la_LIBTOOLFLAGS = --tag=disable-static
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,9 @@
|
||||||
|
|
||||||
#include "gstladspa.h"
|
#include "gstladspa.h"
|
||||||
#include <ladspa.h> /* main ladspa sdk include file */
|
#include <ladspa.h> /* main ladspa sdk include file */
|
||||||
|
#if HAVE_LRDF
|
||||||
|
#include <lrdf.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 1.0 and the 1.1 preliminary headers don't define a version, but 1.1 final
|
/* 1.0 and the 1.1 preliminary headers don't define a version, but 1.1 final
|
||||||
does */
|
does */
|
||||||
|
@ -72,6 +75,10 @@ gst_ladspa_base_init (gpointer g_class)
|
||||||
GstElementDetails *details;
|
GstElementDetails *details;
|
||||||
LADSPA_Descriptor *desc;
|
LADSPA_Descriptor *desc;
|
||||||
guint j, audio_in_count, audio_out_count, control_in_count, control_out_count;
|
guint j, audio_in_count, audio_out_count, control_in_count, control_out_count;
|
||||||
|
gchar *klass_tags;
|
||||||
|
#if HAVE_LRDF
|
||||||
|
gchar *uri, *extra_klass_tags = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
GST_DEBUG ("base_init %p", g_class);
|
GST_DEBUG ("base_init %p", g_class);
|
||||||
|
|
||||||
|
@ -133,21 +140,104 @@ gst_ladspa_base_init (gpointer g_class)
|
||||||
if (!details->author)
|
if (!details->author)
|
||||||
details->author = g_strdup ("no author available");
|
details->author = g_strdup ("no author available");
|
||||||
|
|
||||||
|
#if HAVE_LRDF
|
||||||
|
/* libldrf support, we want to get extra class information here */
|
||||||
|
uri = g_strdup_printf (LADSPA_BASE "%ld", desc->UniqueID);
|
||||||
|
if (uri) {
|
||||||
|
lrdf_statement query = { 0, };
|
||||||
|
lrdf_uris *uris;
|
||||||
|
gchar *str, *base_type = NULL;
|
||||||
|
|
||||||
|
GST_DEBUG ("uri (id=%d) : %s", desc->UniqueID, uri);
|
||||||
|
/* we can take this directly from 'desc', keep this example for future
|
||||||
|
attributes.
|
||||||
|
if ((str = lrdf_get_setting_metadata (uri, "title"))) {
|
||||||
|
GST_DEBUG ("title : %s", str);
|
||||||
|
}
|
||||||
|
if ((str = lrdf_get_setting_metadata (uri, "creator"))) {
|
||||||
|
GST_DEBUG ("creator : %s", str);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* get the rdf:type for this plugin */
|
||||||
|
query.subject = uri;
|
||||||
|
query.predicate = RDF_BASE "type";
|
||||||
|
query.object = "?";
|
||||||
|
query.next = NULL;
|
||||||
|
uris = lrdf_match_multi (&query);
|
||||||
|
if (uris) {
|
||||||
|
if (uris->count == 1) {
|
||||||
|
base_type = g_strdup (uris->items[0]);
|
||||||
|
GST_DEBUG ("base_type : %s", base_type);
|
||||||
|
}
|
||||||
|
lrdf_free_uris (uris);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* query taxonomy */
|
||||||
|
if (base_type) {
|
||||||
|
uris = lrdf_get_all_superclasses (base_type);
|
||||||
|
if (uris) {
|
||||||
|
guint32 j;
|
||||||
|
|
||||||
|
for (j = 0; j < uris->count; j++) {
|
||||||
|
GST_LOG ("parent_type_uri : %s", uris->items[j]);
|
||||||
|
if ((str = lrdf_get_label (uris->items[j]))) {
|
||||||
|
GST_DEBUG ("parent_type_label : %s", str);
|
||||||
|
if (extra_klass_tags) {
|
||||||
|
gchar *old_tags = extra_klass_tags;
|
||||||
|
extra_klass_tags = g_strconcat (extra_klass_tags, "/", str, NULL);
|
||||||
|
g_free (old_tags);
|
||||||
|
} else {
|
||||||
|
extra_klass_tags = g_strconcat ("/", str, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lrdf_free_uris (uris);
|
||||||
|
}
|
||||||
|
g_free (base_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we can use this for the presets
|
||||||
|
uris = lrdf_get_setting_uris (desc->UniqueID);
|
||||||
|
if (uris) {
|
||||||
|
guint32 j;
|
||||||
|
|
||||||
|
for (j = 0; j < uris->count; j++) {
|
||||||
|
GST_INFO ("setting_uri : %s", uris->items[j]);
|
||||||
|
if ((str = lrdf_get_label (uris->items[j]))) {
|
||||||
|
GST_INFO ("setting_label : %s", str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lrdf_free_uris (uris);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
|
g_free (uri);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (gsp_class->num_audio_in == 0)
|
if (gsp_class->num_audio_in == 0)
|
||||||
details->klass = "Source/Audio/LADSPA";
|
klass_tags = "Source/Audio/LADSPA";
|
||||||
else if (gsp_class->num_audio_out == 0) {
|
else if (gsp_class->num_audio_out == 0) {
|
||||||
if (gsp_class->num_control_out == 0)
|
if (gsp_class->num_control_out == 0)
|
||||||
details->klass = "Sink/Audio/LADSPA";
|
klass_tags = "Sink/Audio/LADSPA";
|
||||||
else
|
else
|
||||||
details->klass = "Sink/Analyzer/Audio/LADSPA";
|
klass_tags = "Sink/Analyzer/Audio/LADSPA";
|
||||||
} else
|
} else
|
||||||
details->klass = "Filter/Effect/Audio/LADSPA";
|
klass_tags = "Filter/Effect/Audio/LADSPA";
|
||||||
|
|
||||||
|
if (extra_klass_tags) {
|
||||||
|
details->klass = g_strconcat (klass_tags, extra_klass_tags, NULL);
|
||||||
|
g_free (extra_klass_tags);
|
||||||
|
} else {
|
||||||
|
details->klass = klass_tags;
|
||||||
|
}
|
||||||
|
GST_INFO ("tags : %s", details->klass);
|
||||||
gst_element_class_set_details (element_class, details);
|
gst_element_class_set_details (element_class, details);
|
||||||
g_free (details->longname);
|
g_free (details->longname);
|
||||||
g_free (details->author);
|
g_free (details->author);
|
||||||
g_free (details);
|
g_free (details);
|
||||||
|
|
||||||
|
|
||||||
klass->audio_in_portnums = g_new0 (gint, gsp_class->num_audio_in);
|
klass->audio_in_portnums = g_new0 (gint, gsp_class->num_audio_in);
|
||||||
klass->audio_out_portnums = g_new0 (gint, gsp_class->num_audio_out);
|
klass->audio_out_portnums = g_new0 (gint, gsp_class->num_audio_out);
|
||||||
klass->control_in_portnums = g_new0 (gint, gsp_class->num_control_in);
|
klass->control_in_portnums = g_new0 (gint, gsp_class->num_control_in);
|
||||||
|
@ -593,7 +683,6 @@ ladspa_describe_plugin (LADSPA_Descriptor_Function descriptor_function)
|
||||||
(GInstanceInitFunc) gst_ladspa_init,
|
(GInstanceInitFunc) gst_ladspa_init,
|
||||||
};
|
};
|
||||||
GType type;
|
GType type;
|
||||||
|
|
||||||
/* construct the type */
|
/* construct the type */
|
||||||
type_name = g_strdup_printf ("ladspa-%s", desc->Label);
|
type_name = g_strdup_printf ("ladspa-%s", desc->Label);
|
||||||
g_strcanon (type_name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-+", '-');
|
g_strcanon (type_name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-+", '-');
|
||||||
|
@ -617,6 +706,36 @@ ladspa_describe_plugin (LADSPA_Descriptor_Function descriptor_function)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if HAVE_LRDF
|
||||||
|
static gboolean
|
||||||
|
ladspa_rdf_directory_search (const char *dir_name)
|
||||||
|
{
|
||||||
|
GDir *dir;
|
||||||
|
gchar *file_name, *file_uri;
|
||||||
|
const gchar *entry_name;
|
||||||
|
gint ok;
|
||||||
|
|
||||||
|
GST_INFO ("scanning directory for rdfs \"%s\"", dir_name);
|
||||||
|
|
||||||
|
dir = g_dir_open (dir_name, 0, NULL);
|
||||||
|
if (!dir)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
while ((entry_name = g_dir_read_name (dir))) {
|
||||||
|
file_name = g_build_filename (dir_name, entry_name, NULL);
|
||||||
|
file_uri = g_strconcat ("file://", file_name, NULL);
|
||||||
|
ok = lrdf_read_file (file_uri);
|
||||||
|
GST_INFO ("read %s : %d", file_uri, ok);
|
||||||
|
g_free (file_uri);
|
||||||
|
g_free (file_name);
|
||||||
|
}
|
||||||
|
g_dir_close (dir);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/* search just the one directory.
|
/* search just the one directory.
|
||||||
*/
|
*/
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -629,7 +748,7 @@ ladspa_plugin_directory_search (const char *dir_name)
|
||||||
GModule *plugin;
|
GModule *plugin;
|
||||||
gboolean ok = FALSE;
|
gboolean ok = FALSE;
|
||||||
|
|
||||||
GST_INFO ("scanning directory \"%s\"", dir_name);
|
GST_INFO ("scanning directory for plugins \"%s\"", dir_name);
|
||||||
|
|
||||||
dir = g_dir_open (dir_name, 0, NULL);
|
dir = g_dir_open (dir_name, 0, NULL);
|
||||||
if (!dir)
|
if (!dir)
|
||||||
|
@ -644,6 +763,7 @@ ladspa_plugin_directory_search (const char *dir_name)
|
||||||
if (g_module_symbol (plugin, "ladspa_descriptor",
|
if (g_module_symbol (plugin, "ladspa_descriptor",
|
||||||
(gpointer *) & descriptor_function)) {
|
(gpointer *) & descriptor_function)) {
|
||||||
/* we've found a ladspa_descriptor function, now introspect it. */
|
/* we've found a ladspa_descriptor function, now introspect it. */
|
||||||
|
GST_INFO ("describe %s", file_name);
|
||||||
ladspa_describe_plugin (descriptor_function);
|
ladspa_describe_plugin (descriptor_function);
|
||||||
ok = TRUE;
|
ok = TRUE;
|
||||||
} else {
|
} else {
|
||||||
|
@ -663,11 +783,14 @@ ladspa_plugin_directory_search (const char *dir_name)
|
||||||
static gboolean
|
static gboolean
|
||||||
ladspa_plugin_path_search (void)
|
ladspa_plugin_path_search (void)
|
||||||
{
|
{
|
||||||
const char *search_path;
|
const gchar *search_path;
|
||||||
char *ladspa_path;
|
gchar *ladspa_path;
|
||||||
gchar **paths;
|
gchar **paths;
|
||||||
gint i, j, path_entries;
|
gint i, j, path_entries;
|
||||||
gboolean res = FALSE, skip;
|
gboolean res = FALSE, skip;
|
||||||
|
#if HAVE_LRDF
|
||||||
|
gchar *pos, *prefix, *rdf_path;
|
||||||
|
#endif
|
||||||
|
|
||||||
search_path = g_getenv ("LADSPA_PATH");
|
search_path = g_getenv ("LADSPA_PATH");
|
||||||
if (search_path) {
|
if (search_path) {
|
||||||
|
@ -682,6 +805,30 @@ ladspa_plugin_path_search (void)
|
||||||
path_entries = g_strv_length (paths);
|
path_entries = g_strv_length (paths);
|
||||||
GST_INFO ("%d dirs in search paths \"%s\"", path_entries, ladspa_path);
|
GST_INFO ("%d dirs in search paths \"%s\"", path_entries, ladspa_path);
|
||||||
|
|
||||||
|
#if HAVE_LRDF
|
||||||
|
for (i = 0; i < path_entries; i++) {
|
||||||
|
skip = FALSE;
|
||||||
|
for (j = 0; j < i; j++) {
|
||||||
|
if (!strcmp (paths[i], paths[j])) {
|
||||||
|
skip = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (skip)
|
||||||
|
break;
|
||||||
|
/* transform path: /usr/lib/ladspa -> /usr/share/ladspa/rdf/
|
||||||
|
* yes, this is ugly, but lrdf has not searchpath
|
||||||
|
*/
|
||||||
|
if ((pos = strstr (paths[i], "/lib/ladspa"))) {
|
||||||
|
prefix = g_strndup (paths[i], (pos - paths[i]));
|
||||||
|
rdf_path = g_build_filename (prefix, "share", "ladspa", "rdf", NULL);
|
||||||
|
ladspa_rdf_directory_search (rdf_path);
|
||||||
|
g_free (rdf_path);
|
||||||
|
g_free (prefix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < path_entries; i++) {
|
for (i = 0; i < path_entries; i++) {
|
||||||
skip = FALSE;
|
skip = FALSE;
|
||||||
for (j = 0; j < i; j++) {
|
for (j = 0; j < i; j++) {
|
||||||
|
@ -711,6 +858,10 @@ plugin_init (GstPlugin * plugin)
|
||||||
"LADSPA_PATH",
|
"LADSPA_PATH",
|
||||||
GST_LADSPA_DEFAULT_PATH, NULL, GST_PLUGIN_DEPENDENCY_FLAG_NONE);
|
GST_LADSPA_DEFAULT_PATH, NULL, GST_PLUGIN_DEPENDENCY_FLAG_NONE);
|
||||||
|
|
||||||
|
#if HAVE_LRDF
|
||||||
|
lrdf_init ();
|
||||||
|
#endif
|
||||||
|
|
||||||
parent_class = g_type_class_ref (GST_TYPE_SIGNAL_PROCESSOR);
|
parent_class = g_type_class_ref (GST_TYPE_SIGNAL_PROCESSOR);
|
||||||
|
|
||||||
ladspa_plugin = plugin;
|
ladspa_plugin = plugin;
|
||||||
|
|
Loading…
Reference in a new issue