diff --git a/ext/ladspa/gstladspa.c b/ext/ladspa/gstladspa.c index 0acb245f62..f412ce35f5 100644 --- a/ext/ladspa/gstladspa.c +++ b/ext/ladspa/gstladspa.c @@ -130,7 +130,6 @@ #include "gstladspasink.h" #include -#include #include #include #ifdef HAVE_LRDF @@ -153,29 +152,107 @@ GST_DEBUG_CATEGORY (ladspa_debug); "/usr/local/lib/ladspa" G_SEARCHPATH_SEPARATOR_S \ LIBDIR "/ladspa" -GQuark descriptor_quark = 0; +GstStructure *ladspa_meta_all = NULL; static void -ladspa_describe_plugin (GstPlugin * plugin, - const gchar * filename, LADSPA_Descriptor_Function descriptor_function) +ladspa_plugin_register_element (GstPlugin * plugin, GstStructure * ladspa_meta) +{ + guint audio_in, audio_out; + + gst_structure_get_uint (ladspa_meta, "audio-in", &audio_in); + gst_structure_get_uint (ladspa_meta, "audio-out", &audio_out); + + if (audio_in == 0) { + ladspa_register_source_element (plugin, ladspa_meta); + } else if (audio_out == 0) { + ladspa_register_sink_element (plugin, ladspa_meta); + } else { + ladspa_register_filter_element (plugin, ladspa_meta); + } +} + +static void +ladspa_count_ports (const LADSPA_Descriptor * descriptor, + guint * audio_in, guint * audio_out, guint * control_in, + guint * control_out) +{ + guint i; + + *audio_in = *audio_out = *control_in = *control_out = 0; + + for (i = 0; i < descriptor->PortCount; i++) { + LADSPA_PortDescriptor p = descriptor->PortDescriptors[i]; + + if (LADSPA_IS_PORT_AUDIO (p)) { + if (LADSPA_IS_PORT_INPUT (p)) + (*audio_in)++; + else + (*audio_out)++; + } else if (LADSPA_IS_PORT_CONTROL (p)) { + if (LADSPA_IS_PORT_INPUT (p)) + (*control_in)++; + else + (*control_out)++; + } + } +} + +static void +ladspa_describe_plugin (const gchar * file_name, const gchar * entry_name, + LADSPA_Descriptor_Function descriptor_function) { const LADSPA_Descriptor *desc; guint i; /* walk through all the plugins in this plugin library */ for (i = 0; (desc = descriptor_function (i)); i++) { + GstStructure *ladspa_meta = NULL; + GValue value = { 0, }; + gchar *tmp; + gchar *type_name; guint audio_in, audio_out, control_in, control_out; /* count ports of this plugin */ ladspa_count_ports (desc, &audio_in, &audio_out, &control_in, &control_out); - /* categorize and register it */ - if (audio_in == 0) - ladspa_describe_source_plugin (plugin, filename, desc); - else if (audio_out == 0) - ladspa_describe_sink_plugin (plugin, filename, desc); - else - ladspa_describe_filter_plugin (plugin, filename, desc); + /* categorize */ + if (audio_in == 0 && audio_out == 0) { + GST_WARNING ("Skipping control only element (%s:%lu/%s)", + entry_name, desc->UniqueID, desc->Label); + continue; + } else if (audio_in == 0) { + tmp = g_strdup_printf ("ladspasrc-%s-%s", entry_name, desc->Label); + } else if (audio_out == 0) { + tmp = g_strdup_printf ("ladspasink-%s-%s", entry_name, desc->Label); + } else { + tmp = g_strdup_printf ("ladspa-%s-%s", entry_name, desc->Label); + } + type_name = g_ascii_strdown (tmp, -1); + g_free (tmp); + g_strcanon (type_name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-+", '-'); + + /* check if the type is already registered */ + if (g_type_from_name (type_name)) { + GST_WARNING ("Plugin identifier collision for %s (%s:%lu/%s)", type_name, + entry_name, desc->UniqueID, desc->Label); + g_free (type_name); + continue; + } + + ladspa_meta = gst_structure_new_empty ("ladspa"); + gst_structure_set (ladspa_meta, + "plugin-filename", G_TYPE_STRING, file_name, + "element-ix", G_TYPE_UINT, i, + "element-type-name", G_TYPE_STRING, type_name, + "audio-in", G_TYPE_UINT, audio_in, + "audio-out", G_TYPE_UINT, audio_out, + "control-in", G_TYPE_UINT, control_in, + "control-out", G_TYPE_UINT, control_out, NULL); + + g_value_init (&value, GST_TYPE_STRUCTURE); + g_value_set_boxed (&value, ladspa_meta); + gst_structure_set_value (ladspa_meta_all, type_name, &value); + g_value_unset (&value); } } @@ -235,7 +312,7 @@ ladspa_plugin_directory_search (GstPlugin * ladspa_plugin, const char *dir_name) (gpointer *) & descriptor_function)) { /* we've found a ladspa_descriptor function, now introspect it. */ GST_INFO ("describe %s", file_name); - ladspa_describe_plugin (ladspa_plugin, entry_name, descriptor_function); + ladspa_describe_plugin (file_name, entry_name, descriptor_function); ok = TRUE; } else { /* it was a library, but not a LADSPA one. Unload it. */ @@ -322,6 +399,9 @@ ladspa_plugin_path_search (GstPlugin * plugin) static gboolean plugin_init (GstPlugin * plugin) { + gboolean res = FALSE; + gint n = 0; + #ifdef ENABLE_NLS GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, LOCALEDIR); @@ -331,8 +411,6 @@ plugin_init (GstPlugin * plugin) GST_DEBUG_CATEGORY_INIT (ladspa_debug, "ladspa", 0, "LADSPA plugins"); - descriptor_quark = g_quark_from_static_string ("ladspa-descriptor"); - gst_plugin_add_dependency_simple (plugin, "LADSPA_PATH", GST_LADSPA_DEFAULT_PATH, NULL, GST_PLUGIN_DEPENDENCY_FLAG_NONE); @@ -341,8 +419,44 @@ plugin_init (GstPlugin * plugin) lrdf_init (); #endif - if (!ladspa_plugin_path_search (plugin)) + ladspa_meta_all = (GstStructure *) gst_plugin_get_cache_data (plugin); + if (ladspa_meta_all) { + n = gst_structure_n_fields (ladspa_meta_all); + } + GST_INFO ("%d entries in cache", n); + if (!n) { + ladspa_meta_all = gst_structure_new_empty ("ladspa"); + res = ladspa_plugin_path_search (plugin); + if (res) { + n = gst_structure_n_fields (ladspa_meta_all); + GST_INFO ("%d entries after scanning", n); + gst_plugin_set_cache_data (plugin, ladspa_meta_all); + } + } else { + res = TRUE; + } + + if (n) { + gint i; + const gchar *name; + const GValue *value; + + GST_INFO ("register types"); + + for (i = 0; i < n; i++) { + name = gst_structure_nth_field_name (ladspa_meta_all, i); + value = gst_structure_get_value (ladspa_meta_all, name); + if (G_VALUE_TYPE (value) == GST_TYPE_STRUCTURE) { + GstStructure *ladspa_meta = g_value_get_boxed (value); + + ladspa_plugin_register_element (plugin, ladspa_meta); + } + } + } + + if (!res) { GST_WARNING ("no LADSPA plugins found, check LADSPA_PATH"); + } /* we don't want to fail, even if there are no elements registered */ return TRUE; diff --git a/ext/ladspa/gstladspa.h b/ext/ladspa/gstladspa.h index 727b56cdaf..f93ab4eb77 100644 --- a/ext/ladspa/gstladspa.h +++ b/ext/ladspa/gstladspa.h @@ -1,6 +1,7 @@ /* GStreamer * Copyright (C) 1999 Erik Walthinsen * Copyright (C) 2013 Juan Manuel Borges Caño + * 2013 Stefan Sauer * * gstladspa.h: Header for LADSPA plugin * @@ -27,7 +28,7 @@ G_BEGIN_DECLS -extern GQuark descriptor_quark; +extern GstStructure *ladspa_meta_all; G_END_DECLS diff --git a/ext/ladspa/gstladspafilter.c b/ext/ladspa/gstladspafilter.c index af64b2118c..d1b853b6e5 100644 --- a/ext/ladspa/gstladspafilter.c +++ b/ext/ladspa/gstladspafilter.c @@ -236,8 +236,8 @@ gst_ladspa_filter_type_init (GstLADSPAFilter * ladspa, LADSPA_Descriptor * desc) gst_base_transform_set_in_place (base, ladspa_class->ladspa.count.audio.in == ladspa_class->ladspa.count.audio.out - && !LADSPA_IS_INPLACE_BROKEN (ladspa_class->ladspa. - descriptor->Properties)); + && !LADSPA_IS_INPLACE_BROKEN (ladspa_class->ladspa.descriptor-> + Properties)); } @@ -270,16 +270,11 @@ gst_ladspa_filter_type_finalize (GObject * object) static void gst_ladspa_filter_type_base_init (GstLADSPAFilterClass * ladspa_class) { - GObjectClass *object_class = G_OBJECT_CLASS (ladspa_class); GstElementClass *elem_class = GST_ELEMENT_CLASS (ladspa_class); GstAudioFilterClass *audio_class = GST_AUDIO_FILTER_CLASS (ladspa_class); - LADSPA_Descriptor *desc; - desc = - g_type_get_qdata (G_OBJECT_CLASS_TYPE (object_class), descriptor_quark); - g_assert (desc); - - gst_ladspa_class_init (&ladspa_class->ladspa, desc); + gst_ladspa_class_init (&ladspa_class->ladspa, + G_TYPE_FROM_CLASS (ladspa_class)); gst_ladspa_element_class_set_metadata (&ladspa_class->ladspa, elem_class, GST_LADSPA_FILTER_CLASS_TAGS); @@ -345,8 +340,7 @@ gst_ladspa_filter_class_init (GstLADSPAFilterClass * ladspa_class) * Construct the type. */ void -ladspa_describe_filter_plugin (GstPlugin * plugin, - const gchar * filename, const LADSPA_Descriptor * desc) +ladspa_register_filter_element (GstPlugin * plugin, GstStructure * ladspa_meta) { GTypeInfo info = { sizeof (GstLADSPAFilterClass), @@ -354,16 +348,11 @@ ladspa_describe_filter_plugin (GstPlugin * plugin, (GBaseFinalizeFunc) gst_ladspa_filter_type_base_finalize, (GClassInitFunc) gst_ladspa_filter_type_class_init, NULL, - desc, + NULL, sizeof (GstLADSPAFilter), 0, (GInstanceInitFunc) gst_ladspa_filter_type_init, NULL }; - gchar *tmp; - - tmp = g_strdup_printf ("ladspa-%s-%s", filename, desc->Label); - ladspa_register_plugin (plugin, GST_TYPE_LADSPA_FILTER, tmp, &info, - descriptor_quark, filename, desc); - g_free (tmp); + ladspa_register_element (plugin, GST_TYPE_LADSPA_FILTER, &info, ladspa_meta); } diff --git a/ext/ladspa/gstladspafilter.h b/ext/ladspa/gstladspafilter.h index 94c0ddaa5b..577330a906 100644 --- a/ext/ladspa/gstladspafilter.h +++ b/ext/ladspa/gstladspafilter.h @@ -60,8 +60,7 @@ GType gst_ladspa_filter_get_type (void); void -ladspa_describe_filter_plugin (GstPlugin * plugin, - const gchar * filename, const LADSPA_Descriptor * desc); +ladspa_register_filter_element (GstPlugin * plugin, GstStructure *ladspa_meta); void gst_my_audio_filter_class_add_pad_templates (GstAudioFilterClass * audio_class, diff --git a/ext/ladspa/gstladspasink.c b/ext/ladspa/gstladspasink.c index 620379aac1..3cb321c799 100644 --- a/ext/ladspa/gstladspasink.c +++ b/ext/ladspa/gstladspasink.c @@ -270,16 +270,11 @@ gst_ladspa_sink_type_finalize (GObject * object) static void gst_ladspa_sink_type_base_init (GstLADSPASinkClass * ladspa_class) { - GObjectClass *object_class = G_OBJECT_CLASS (ladspa_class); GstElementClass *elem_class = GST_ELEMENT_CLASS (ladspa_class); GstBaseSinkClass *base_class = GST_BASE_SINK_CLASS (ladspa_class); - LADSPA_Descriptor *desc; - desc = - g_type_get_qdata (G_OBJECT_CLASS_TYPE (object_class), descriptor_quark); - g_assert (desc); - - gst_ladspa_class_init (&ladspa_class->ladspa, desc); + gst_ladspa_class_init (&ladspa_class->ladspa, + G_TYPE_FROM_CLASS (ladspa_class)); gst_ladspa_element_class_set_metadata (&ladspa_class->ladspa, elem_class, GST_LADSPA_SINK_CLASS_TAGS); @@ -362,8 +357,7 @@ gst_ladspa_sink_class_init (GstLADSPASinkClass * ladspa_class) * Construct the type. */ void -ladspa_describe_sink_plugin (GstPlugin * plugin, - const gchar * filename, const LADSPA_Descriptor * desc) +ladspa_register_sink_element (GstPlugin * plugin, GstStructure * ladspa_meta) { GTypeInfo info = { sizeof (GstLADSPASinkClass), @@ -371,16 +365,11 @@ ladspa_describe_sink_plugin (GstPlugin * plugin, (GBaseFinalizeFunc) gst_ladspa_sink_type_base_finalize, (GClassInitFunc) gst_ladspa_sink_type_class_init, NULL, - desc, + NULL, sizeof (GstLADSPASink), 0, (GInstanceInitFunc) gst_ladspa_sink_type_init, NULL }; - gchar *tmp; - - tmp = g_strdup_printf ("ladspasink-%s-%s", filename, desc->Label); - ladspa_register_plugin (plugin, GST_TYPE_LADSPA_SINK, tmp, &info, - descriptor_quark, filename, desc); - g_free (tmp); + ladspa_register_element (plugin, GST_TYPE_LADSPA_SINK, &info, ladspa_meta); } diff --git a/ext/ladspa/gstladspasink.h b/ext/ladspa/gstladspasink.h index 6bed7f0750..f781b481e5 100644 --- a/ext/ladspa/gstladspasink.h +++ b/ext/ladspa/gstladspasink.h @@ -66,8 +66,7 @@ GType gst_ladspa_sink_get_type (void); void -ladspa_describe_sink_plugin (GstPlugin * plugin, - const gchar * filename, const LADSPA_Descriptor * desc); +ladspa_register_sink_element (GstPlugin * plugin, GstStructure *ladspa_meta); void gst_my_base_sink_class_add_pad_template (GstBaseSinkClass * base_class, diff --git a/ext/ladspa/gstladspasource.c b/ext/ladspa/gstladspasource.c index 202004cdf6..943da62cee 100644 --- a/ext/ladspa/gstladspasource.c +++ b/ext/ladspa/gstladspasource.c @@ -451,8 +451,7 @@ gst_ladspa_source_type_get_property (GObject * object, guint prop_id, } static void -gst_ladspa_source_type_init (GstLADSPASource * ladspa, - LADSPA_Descriptor * desc) +gst_ladspa_source_type_init (GstLADSPASource * ladspa, LADSPA_Descriptor * desc) { GstLADSPASourceClass *ladspa_class = GST_LADSPA_SOURCE_GET_CLASS (ladspa); @@ -500,16 +499,11 @@ gst_ladspa_source_type_finalize (GObject * object) static void gst_ladspa_source_type_base_init (GstLADSPASourceClass * ladspa_class) { - GObjectClass *object_class = G_OBJECT_CLASS (ladspa_class); GstElementClass *elem_class = GST_ELEMENT_CLASS (ladspa_class); GstBaseSrcClass *base_class = GST_BASE_SRC_CLASS (ladspa_class); - LADSPA_Descriptor *desc; - desc = - g_type_get_qdata (G_OBJECT_CLASS_TYPE (object_class), descriptor_quark); - g_assert (desc); - - gst_ladspa_class_init (&ladspa_class->ladspa, desc); + gst_ladspa_class_init (&ladspa_class->ladspa, + G_TYPE_FROM_CLASS (ladspa_class)); gst_ladspa_element_class_set_metadata (&ladspa_class->ladspa, elem_class, GST_LADSPA_SOURCE_CLASS_TAGS); @@ -531,27 +525,22 @@ gst_ladspa_source_type_class_init (GstLADSPASourceClass * ladspa_class, GObjectClass *object_class = (GObjectClass *) ladspa_class; GstBaseSrcClass *base_class = (GstBaseSrcClass *) ladspa_class; - gst_ladspa_source_type_parent_class = - g_type_class_peek_parent (ladspa_class); + gst_ladspa_source_type_parent_class = g_type_class_peek_parent (ladspa_class); - object_class->dispose = - GST_DEBUG_FUNCPTR (gst_ladspa_source_type_dispose); - object_class->finalize = - GST_DEBUG_FUNCPTR (gst_ladspa_source_type_finalize); + object_class->dispose = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_dispose); + object_class->finalize = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_finalize); object_class->set_property = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_set_property); object_class->get_property = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_get_property); - base_class->set_caps = - GST_DEBUG_FUNCPTR (gst_ladspa_source_type_set_caps); + base_class->set_caps = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_set_caps); base_class->fixate = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_fixate); base_class->is_seekable = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_is_seekable); base_class->do_seek = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_do_seek); base_class->query = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_query); - base_class->get_times = - GST_DEBUG_FUNCPTR (gst_ladspa_source_type_get_times); + base_class->get_times = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_get_times); base_class->start = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_start); base_class->stop = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_stop); base_class->fill = GST_DEBUG_FUNCPTR (gst_ladspa_source_type_fill); @@ -609,8 +598,7 @@ gst_ladspa_source_class_init (GstLADSPASourceClass * ladspa_class) * Construct the type. */ void -ladspa_describe_source_plugin (GstPlugin * plugin, - const gchar * filename, const LADSPA_Descriptor * desc) +ladspa_register_source_element (GstPlugin * plugin, GstStructure * ladspa_meta) { GTypeInfo info = { sizeof (GstLADSPASourceClass), @@ -618,16 +606,11 @@ ladspa_describe_source_plugin (GstPlugin * plugin, (GBaseFinalizeFunc) gst_ladspa_source_type_base_finalize, (GClassInitFunc) gst_ladspa_source_type_class_init, NULL, - desc, + NULL, sizeof (GstLADSPASource), 0, (GInstanceInitFunc) gst_ladspa_source_type_init, NULL }; - gchar *tmp; - - tmp = g_strdup_printf ("ladspasrc-%s-%s", filename, desc->Label); - ladspa_register_plugin (plugin, GST_TYPE_LADSPA_SOURCE, tmp, &info, - descriptor_quark, filename, desc); - g_free (tmp); + ladspa_register_element (plugin, GST_TYPE_LADSPA_SOURCE, &info, ladspa_meta); } diff --git a/ext/ladspa/gstladspasource.h b/ext/ladspa/gstladspasource.h index 15df9ba8c6..ca3a2941c6 100644 --- a/ext/ladspa/gstladspasource.h +++ b/ext/ladspa/gstladspasource.h @@ -78,8 +78,7 @@ GType gst_ladspa_source_get_type (void); void -ladspa_describe_source_plugin (GstPlugin * plugin, - const gchar * filename, const LADSPA_Descriptor * desc); +ladspa_register_source_element (GstPlugin * plugin, GstStructure *ladspa_meta); void gst_my_base_source_class_add_pad_template (GstBaseSrcClass * base_class, diff --git a/ext/ladspa/gstladspautils.c b/ext/ladspa/gstladspautils.c index 902bc03a78..c358b5ed89 100644 --- a/ext/ladspa/gstladspautils.c +++ b/ext/ladspa/gstladspautils.c @@ -2,7 +2,8 @@ * Copyright (C) 1999 Erik Walthinsen * 2001 Steve Baker * 2003 Andy Wingo - * Copyright (C) 2013 Juan Manuel Borges Caño + * 2013 Juan Manuel Borges Caño + * 2013 Stefan Sauer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -49,6 +50,7 @@ #include "config.h" #endif +#include "gstladspa.h" #include "gstladspautils.h" #include "gstladspafilter.h" #include "gstladspasource.h" @@ -286,12 +288,10 @@ static gchar * gst_ladspa_object_class_get_param_name (GstLADSPAClass * ladspa_class, GObjectClass * object_class, unsigned long portnum) { - LADSPA_Descriptor *desc; + const LADSPA_Descriptor *desc = ladspa_class->descriptor; gchar *name, **namev, **v, *tmp; guint i; - desc = ladspa_class->descriptor; - /* beauty in the mess */ name = g_strdup (""); namev = g_strsplit_set (desc->PortNames[portnum], "[]()", 0); @@ -342,14 +342,12 @@ static GParamSpec * gst_ladspa_object_class_get_param_spec (GstLADSPAClass * ladspa_class, GObjectClass * object_class, unsigned long portnum) { - LADSPA_Descriptor *desc; + const LADSPA_Descriptor *desc = ladspa_class->descriptor; GParamSpec *ret; gchar *name; gint hintdesc, perms; gfloat lower, upper, def; - desc = ladspa_class->descriptor; - name = gst_ladspa_object_class_get_param_name (ladspa_class, object_class, portnum); @@ -544,7 +542,7 @@ void gst_ladspa_element_class_set_metadata (GstLADSPAClass * ladspa_class, GstElementClass * elem_class, const gchar * ladspa_class_tags) { - LADSPA_Descriptor *desc = ladspa_class->descriptor; + const LADSPA_Descriptor *desc = ladspa_class->descriptor; gchar *longname, *author, *extra_ladspa_class_tags = NULL, *tmp; #ifdef HAVE_LRDF gchar *uri; @@ -564,7 +562,7 @@ gst_ladspa_element_class_set_metadata (GstLADSPAClass * ladspa_class, "Andy Wingo ", "Steve Baker ", "Erik Walthinsen ", - "Stefan Kost ", + "Stefan Sauer ", "Wim Taymans ", NULL); g_free (tmp); @@ -760,30 +758,35 @@ gst_ladspa_finalize (GstLADSPA * ladspa) } void -gst_ladspa_class_init (GstLADSPAClass * ladspa_class, - LADSPA_Descriptor * descriptor) +gst_ladspa_class_init (GstLADSPAClass * ladspa_class, GType type) { - guint mapper; - struct - { - struct - { - guint in, out; - } control; - struct - { - guint in, out; - } audio; - } count; + guint mapper, ix; + guint audio_in = 0, audio_out = 0, control_in = 0, control_out = 0; + const GValue *value = + gst_structure_get_value (ladspa_meta_all, g_type_name (type)); + GstStructure *ladspa_meta = g_value_get_boxed (value); + const gchar *file_name; + LADSPA_Descriptor_Function descriptor_function; GST_DEBUG ("LADSPA initializing class"); - ladspa_class->descriptor = descriptor; - ladspa_class->properties = 1; + file_name = gst_structure_get_string (ladspa_meta, "plugin-filename"); + ladspa_class->plugin = + g_module_open (file_name, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL); + g_module_symbol (ladspa_class->plugin, "ladspa_descriptor", + (gpointer *) & descriptor_function); + gst_structure_get_uint (ladspa_meta, "element-ix", &ix); - ladspa_count_ports (ladspa_class->descriptor, &ladspa_class->count.audio.in, - &ladspa_class->count.audio.out, &ladspa_class->count.control.in, + ladspa_class->descriptor = descriptor_function (ix); + gst_structure_get_uint (ladspa_meta, "audio-in", + &ladspa_class->count.audio.in); + gst_structure_get_uint (ladspa_meta, "audio-out", + &ladspa_class->count.audio.out); + gst_structure_get_uint (ladspa_meta, "control-in", + &ladspa_class->count.control.in); + gst_structure_get_uint (ladspa_meta, "control-out", &ladspa_class->count.control.out); + ladspa_class->properties = 1; ladspa_class->map.audio.in = g_new0 (unsigned long, ladspa_class->count.audio.in); @@ -795,29 +798,27 @@ gst_ladspa_class_init (GstLADSPAClass * ladspa_class, ladspa_class->map.control.out = g_new0 (unsigned long, ladspa_class->count.control.out); - count.audio.in = count.audio.out = count.control.in = count.control.out = 0; - for (mapper = 0; mapper < ladspa_class->descriptor->PortCount; mapper++) { LADSPA_PortDescriptor p = ladspa_class->descriptor->PortDescriptors[mapper]; if (LADSPA_IS_PORT_AUDIO (p)) { if (LADSPA_IS_PORT_INPUT (p)) - ladspa_class->map.audio.in[count.audio.in++] = mapper; + ladspa_class->map.audio.in[audio_in++] = mapper; else - ladspa_class->map.audio.out[count.audio.out++] = mapper; + ladspa_class->map.audio.out[audio_out++] = mapper; } else if (LADSPA_IS_PORT_CONTROL (p)) { if (LADSPA_IS_PORT_INPUT (p)) - ladspa_class->map.control.in[count.control.in++] = mapper; + ladspa_class->map.control.in[control_in++] = mapper; else - ladspa_class->map.control.out[count.control.out++] = mapper; + ladspa_class->map.control.out[control_out++] = mapper; } } - g_assert (count.control.out == ladspa_class->count.control.out); - g_assert (count.control.in == ladspa_class->count.control.in); + g_assert (control_out == ladspa_class->count.control.out); + g_assert (control_in == ladspa_class->count.control.in); - g_assert (count.audio.out == ladspa_class->count.audio.out); - g_assert (count.audio.in == ladspa_class->count.audio.in); + g_assert (audio_out == ladspa_class->count.audio.out); + g_assert (audio_in == ladspa_class->count.audio.in); } void @@ -834,61 +835,21 @@ gst_ladspa_class_finalize (GstLADSPAClass * ladspa_class) ladspa_class->map.audio.out = NULL; g_free (ladspa_class->map.audio.in); ladspa_class->map.audio.in = NULL; -} -void -ladspa_count_ports (const LADSPA_Descriptor * descriptor, - guint * audio_in, guint * audio_out, guint * control_in, - guint * control_out) -{ - guint i; - - *audio_in = *audio_out = *control_in = *control_out = 0; - - for (i = 0; i < descriptor->PortCount; i++) { - LADSPA_PortDescriptor p = descriptor->PortDescriptors[i]; - - if (LADSPA_IS_PORT_AUDIO (p)) { - if (LADSPA_IS_PORT_INPUT (p)) - (*audio_in)++; - else - (*audio_out)++; - } else if (LADSPA_IS_PORT_CONTROL (p)) { - if (LADSPA_IS_PORT_INPUT (p)) - (*control_in)++; - else - (*control_out)++; - } - } + g_module_close (ladspa_class->plugin); + ladspa_class->plugin = NULL; } /* - * Register the type. + * Create the type & register the element. */ void -ladspa_register_plugin (GstPlugin * plugin, GType parent_type, - const gchar * tmp, const GTypeInfo * info, GQuark descriptor_quark, - const gchar * filename, const LADSPA_Descriptor * desc) +ladspa_register_element (GstPlugin * plugin, GType parent_type, + const GTypeInfo * info, GstStructure * ladspa_meta) { - gchar *name; - GType type; + const gchar *type_name = + gst_structure_get_string (ladspa_meta, "element-type-name"); - name = g_ascii_strdown (tmp, -1); - g_strcanon (name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-+", '-'); - - /* if it's not already registered, do it */ - if (!g_type_from_name (name)) { - /* create the type now */ - type = g_type_register_static (parent_type, name, info, 0); - - /* base init is expected to initialize dynamic data */ - g_type_set_qdata (type, descriptor_quark, (gpointer) desc); - - /* register the element */ - gst_element_register (plugin, name, GST_RANK_NONE, type); - } else - GST_WARNING ("Plugin identifier collision for %s (%s:%lu/%s)", name, - filename, desc->UniqueID, desc->Label); - - g_free (name); + gst_element_register (plugin, type_name, GST_RANK_NONE, + g_type_register_static (parent_type, type_name, info, 0)); } diff --git a/ext/ladspa/gstladspautils.h b/ext/ladspa/gstladspautils.h index 7ab5e1d76f..050cbaa567 100644 --- a/ext/ladspa/gstladspautils.h +++ b/ext/ladspa/gstladspautils.h @@ -1,5 +1,6 @@ /* GStreamer * Copyright (C) 2013 Juan Manuel Borges Caño + * 2013 Stefan Sauer * * gstladspautils.h: Header for LADSPA plugin utils * @@ -22,6 +23,7 @@ #ifndef __GST_LADSPA_UTILS_H__ #define __GST_LADSPA_UTILS_H__ +#include #include #include #include @@ -63,7 +65,8 @@ struct _GstLADSPAClass { guint properties; - LADSPA_Descriptor *descriptor; + GModule *plugin; + const LADSPA_Descriptor *descriptor; struct { @@ -141,19 +144,14 @@ void gst_ladspa_finalize (GstLADSPA * ladspa); void -gst_ladspa_class_init (GstLADSPAClass * ladspa_class, LADSPA_Descriptor * desc); +gst_ladspa_class_init (GstLADSPAClass * ladspa_class, GType type); void gst_ladspa_class_finalize (GstLADSPAClass * ladspa_class); void -ladspa_count_ports (const LADSPA_Descriptor * desc, guint * audio_in, - guint * audio_out, guint * control_in, guint * control_out); - -void -ladspa_register_plugin (GstPlugin * plugin, GType parent_type, - const gchar * tmp, const GTypeInfo * info, GQuark descriptor_quark, - const gchar * filename, const LADSPA_Descriptor * desc); +ladspa_register_element (GstPlugin * plugin, GType parent_type, + const GTypeInfo * info, GstStructure * ladspa_meta); G_END_DECLS