summaryrefslogtreecommitdiffstats
path: root/ext/lv2
diff options
context:
space:
mode:
Diffstat (limited to 'ext/lv2')
-rw-r--r--ext/lv2/gstlv2.c138
1 files changed, 69 insertions, 69 deletions
diff --git a/ext/lv2/gstlv2.c b/ext/lv2/gstlv2.c
index a4c55f49..a9cdbd79 100644
--- a/ext/lv2/gstlv2.c
+++ b/ext/lv2/gstlv2.c
@@ -88,13 +88,72 @@ gst_lv2_base_init (gpointer g_class)
g_assert (lv2plugin);
- /* pad templates */
- gsp_class->num_audio_in = 0;
- gsp_class->num_audio_out = 0;
- /* properties */
- gsp_class->num_control_in = 0;
- gsp_class->num_control_out = 0;
+ /* audio ports (pads) */
+ gsp_class->num_audio_in = slv2_plugin_get_num_ports_of_class (lv2plugin,
+ audio_class, input_class, NULL);
+ gsp_class->num_audio_out = slv2_plugin_get_num_ports_of_class (lv2plugin,
+ audio_class, output_class, NULL);
+
+ /* control ports (properties) */
+ gsp_class->num_control_in = slv2_plugin_get_num_ports_of_class (lv2plugin,
+ control_class, input_class, NULL);
+ gsp_class->num_control_out = slv2_plugin_get_num_ports_of_class (lv2plugin,
+ control_class, output_class, NULL);
+ klass->audio_in_ports = g_new0 (struct _GstLV2Port, gsp_class->num_audio_in);
+ klass->audio_out_ports =
+ g_new0 (struct _GstLV2Port, gsp_class->num_audio_out);
+ klass->control_in_ports =
+ g_new0 (struct _GstLV2Port, gsp_class->num_control_in);
+ klass->control_out_ports =
+ g_new0 (struct _GstLV2Port, gsp_class->num_control_out);
+
+ klass->groups = NULL;
+ pred = slv2_value_new_uri (world,
+ "http://lv2plug.in/ns/dev/port-groups#inGroup");
+
+ /* find port groups */
+ audio_in_count = audio_out_count = control_in_count = control_out_count = 0;
+ for (j = 0; j < slv2_plugin_get_num_ports (lv2plugin); j++) {
+ SLV2Port port = slv2_plugin_get_port_by_index (lv2plugin, j);
+ gboolean is_input = slv2_port_is_a (lv2plugin, port, input_class);
+ struct _GstLV2Port *desc = NULL;
+ if (slv2_port_is_a (lv2plugin, port, audio_class)) {
+ if (is_input)
+ desc = &klass->audio_in_ports[audio_in_count++];
+ else
+ desc = &klass->audio_out_ports[audio_out_count++];
+ } else if (slv2_port_is_a (lv2plugin, port, control_class)) {
+ if (is_input)
+ desc = &klass->control_in_ports[control_in_count++];
+ else
+ desc = &klass->control_out_ports[control_out_count++];
+ } else {
+ /* unknown port type */
+ continue;
+ }
+ desc->index = j;
+ values = slv2_port_get_value (lv2plugin, port, pred);
+ if (slv2_values_size (values) > 0) {
+ SLV2Value v = slv2_values_get_at (values, 0);
+ desc->group = v;
+ if (!g_slist_find_custom (klass->groups, v, gst_lv2_value_cmp)) {
+ klass->groups =
+ g_slist_prepend (klass->groups, slv2_value_duplicate (v));
+ }
+ g_assert (g_slist_find_custom (klass->groups, v, gst_lv2_value_cmp));
+ }
+ slv2_values_free (values);
+ }
+ g_assert (audio_in_count == gsp_class->num_audio_in);
+ g_assert (audio_out_count == gsp_class->num_audio_out);
+ g_assert (control_in_count == gsp_class->num_control_in);
+ g_assert (control_out_count == gsp_class->num_control_out);
+
+ slv2_value_free (pred);
+
+ /* add pad templates */
+ audio_in_count = audio_out_count = 0;
for (j = 0; j < slv2_plugin_get_num_ports (lv2plugin); j++) {
SLV2Port port = slv2_plugin_get_port_by_index (lv2plugin, j);
if (slv2_port_is_a (lv2plugin, port, audio_class)) {
@@ -106,22 +165,16 @@ gst_lv2_base_init (gpointer g_class)
if (slv2_port_is_a (lv2plugin, port, input_class))
gst_signal_processor_class_add_pad_template (gsp_class, name,
- GST_PAD_SINK, gsp_class->num_audio_in++);
+ GST_PAD_SINK, audio_in_count++);
else if (slv2_port_is_a (lv2plugin, port, output_class))
gst_signal_processor_class_add_pad_template (gsp_class, name,
- GST_PAD_SRC, gsp_class->num_audio_out++);
- /* TODO: else ignore plugin */
+ GST_PAD_SRC, audio_out_count++);
g_free (name);
- } else if (slv2_port_is_a (lv2plugin, port, control_class)) {
- if (slv2_port_is_a (lv2plugin, port, input_class))
- gsp_class->num_control_in++;
- else if (slv2_port_is_a (lv2plugin, port, output_class))
- gsp_class->num_control_out++;
- /* TODO: else ignore plugin */
}
- /* TODO: else ignore plugin */
}
+ g_assert (audio_in_count == gsp_class->num_audio_in);
+ g_assert (audio_out_count == gsp_class->num_audio_out);
/* construct the element details struct */
details = g_new0 (GstElementDetails, 1);
@@ -158,59 +211,6 @@ gst_lv2_base_init (gpointer g_class)
g_free (details->author);
g_free (details);
- klass->groups = NULL;
-
- klass->audio_in_ports = g_new0 (struct _GstLV2Port, gsp_class->num_audio_in);
- klass->audio_out_ports =
- g_new0 (struct _GstLV2Port, gsp_class->num_audio_out);
- klass->control_in_ports =
- g_new0 (struct _GstLV2Port, gsp_class->num_control_in);
- klass->control_out_ports =
- g_new0 (struct _GstLV2Port, gsp_class->num_control_out);
-
- audio_in_count = audio_out_count = control_in_count = control_out_count = 0;
-
- pred = slv2_value_new_uri (world,
- "http://lv2plug.in/ns/dev/port-groups#inGroup");
-
- for (j = 0; j < slv2_plugin_get_num_ports (lv2plugin); j++) {
- SLV2Port port = slv2_plugin_get_port_by_index (lv2plugin, j);
- gboolean is_input = slv2_port_is_a (lv2plugin, port, input_class);
- struct _GstLV2Port *desc = NULL;
- if (slv2_port_is_a (lv2plugin, port, audio_class)) {
- if (is_input)
- desc = &klass->audio_in_ports[audio_in_count++];
- else
- desc = &klass->audio_out_ports[audio_out_count++];
- } else if (slv2_port_is_a (lv2plugin, port, control_class)) {
- if (is_input)
- desc = &klass->control_in_ports[control_in_count++];
- else
- desc = &klass->control_out_ports[control_out_count++];
- } else {
- /* unknown port type */
- continue;
- }
- desc->index = j;
- values = slv2_port_get_value (lv2plugin, port, pred);
- if (slv2_values_size (values) > 0) {
- SLV2Value v = slv2_values_get_at (values, 0);
- desc->group = v;
- if (!g_slist_find_custom (klass->groups, v, gst_lv2_value_cmp)) {
- klass->groups =
- g_slist_prepend (klass->groups, slv2_value_duplicate (v));
- }
- }
- slv2_values_free (values);
- }
-
- slv2_value_free (pred);
-
- g_assert (audio_in_count == gsp_class->num_audio_in);
- g_assert (audio_out_count == gsp_class->num_audio_out);
- g_assert (control_in_count == gsp_class->num_control_in);
- g_assert (control_out_count == gsp_class->num_control_out);
-
pred = slv2_value_new_uri (world,
"http://lv2plug.in/ns/lv2core#inPlaceBroken");
if (!slv2_plugin_has_feature (lv2plugin, pred))