naspro

view naspro-bridges-bad/dssi/pluglib.c @ 167:aaa8564ded8c

Little fix
author Stefano D'Angelo <zanga.mail@gmail.com>
date Fri Sep 11 19:15:15 2009 +0200 (2009-09-11)
parents 1bb57a7a5b46
children c7f1f52651be
line source
1 /*
2 * NASPRO - NASPRO Architecture for Sound Processing
3 * DSSI bridge
4 *
5 * Copyright (C) 2007-2009 Stefano D'Angelo <zanga.mail@gmail.com>
6 *
7 * See the COPYING file for license conditions.
8 */
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <errno.h>
15 #include <dssi.h>
17 #include <NASPRO/core/lib.h>
19 #include "pluglib.h"
20 #include "descriptor.h"
21 #include "lrdf.h"
23 nacore_avl_tree_t _nadssi_pluglib_desc_tree = NULL;
25 struct pluglib
26 {
27 nacore_dl_module_t dl_module;
28 struct nacore_descriptor *descs;
29 size_t descs_count;
30 struct nacore_port_descriptor *port_descs;
31 size_t port_descs_count;
32 char *uris;
33 size_t uris_size;
34 };
36 static struct pluglib *pluglibs = NULL;
37 static size_t pluglibs_count = 0;
39 static void
40 pluglib_load(const char *file, const char *basename, void *data)
41 {
42 nacore_dl_module_t dl_module;
43 const DSSI_Descriptor *ddesc;
44 DSSI_Descriptor_Function get_desc;
45 struct pluglib *tmp_pluglibs;
46 struct nacore_descriptor *tmp_descs;
47 struct nacore_port_descriptor *tmp_port_descs;
48 char *tmp_uris;
49 size_t descs_count, ports_count, uris_size;
50 unsigned long i;
51 char *c;
53 dl_module = nacore_dl_open(file);
54 if (dl_module == NULL)
55 goto dl_open_err;
57 if (nacore_dl_sym(dl_module, "naspro_backbridge") != NULL)
58 goto backbridge;
60 *(void **)(&get_desc) = nacore_dl_sym(dl_module, "dssi_descriptor");
61 if (get_desc == NULL)
62 goto get_desc_err;
64 for (i = 0, descs_count = 0, ports_count = 0, uris_size = 0;
65 (ddesc = get_desc(i)) != NULL; i++)
66 {
67 if (ddesc->DSSI_API_Version != 1)
68 continue;
70 ports_count += ddesc->LADSPA_Plugin->PortCount;
71 if (ddesc->run_synth != NULL)
72 ports_count++;
73 c = strrchr(basename, '.');
74 uris_size += c - basename
75 + strlen(ddesc->LADSPA_Plugin->Label) + 11;
76 descs_count++;
77 }
78 if (descs_count == 0)
79 goto no_desc;
81 tmp_descs = malloc(descs_count * sizeof(struct nacore_descriptor));
82 if (tmp_descs == NULL)
83 goto descs_err;
85 tmp_port_descs = NULL;
86 if (ports_count != 0)
87 {
88 tmp_port_descs = malloc(ports_count
89 * sizeof(struct nacore_port_descriptor));
90 if (tmp_port_descs == NULL)
91 goto port_descs_err;
92 }
94 tmp_uris = malloc(uris_size);
95 if (tmp_uris == NULL)
96 goto uris_err;
98 tmp_pluglibs = realloc(pluglibs,
99 (pluglibs_count + 1) * sizeof(struct pluglib));
100 if (tmp_pluglibs == NULL)
101 goto pluglibs_err;
103 pluglibs = tmp_pluglibs;
104 tmp_pluglibs = pluglibs + pluglibs_count;
105 pluglibs_count++;
107 tmp_pluglibs->dl_module = dl_module;
109 tmp_pluglibs->descs = tmp_descs;
110 tmp_pluglibs->descs_count = descs_count;
111 tmp_pluglibs->port_descs = tmp_port_descs;
112 tmp_pluglibs->port_descs_count = ports_count;
113 tmp_pluglibs->uris = tmp_uris;
114 tmp_pluglibs->uris_size = uris_size;
116 for (i = 0, descs_count = 0, ports_count = 0, uris_size = 0;
117 (ddesc = get_desc(i)) != NULL; i++)
118 {
119 if (ddesc->DSSI_API_Version != 1)
120 continue;
122 tmp_pluglibs->descs[descs_count].port_descs =
123 tmp_pluglibs->port_descs + ports_count;
124 tmp_pluglibs->descs[descs_count].port_descs_count =
125 ddesc->LADSPA_Plugin->PortCount;
126 if (ddesc->run_synth != NULL)
127 tmp_pluglibs->descs[descs_count].port_descs_count++;
128 tmp_pluglibs->descs[descs_count].uri =
129 tmp_pluglibs->uris + uris_size;
130 c = strrchr(basename, '.');
131 strcpy(tmp_pluglibs->descs[descs_count].uri, "urn:dssi:");
132 strncat(tmp_pluglibs->descs[descs_count].uri, basename,
133 c - basename);
134 strcat(tmp_pluglibs->descs[descs_count].uri, ":");
135 strcat(tmp_pluglibs->descs[descs_count].uri,
136 ddesc->LADSPA_Plugin->Label);
138 _nadssi_descriptor_fill(tmp_pluglibs->descs + descs_count,
139 ddesc);
141 nacore_avl_tree_add(_nadssi_pluglib_desc_tree,
142 tmp_pluglibs->descs + descs_count);
144 ports_count += ddesc->LADSPA_Plugin->PortCount;
145 if (ddesc->run_synth != NULL)
146 ports_count++;
147 uris_size += c - basename
148 + strlen(ddesc->LADSPA_Plugin->Label) + 11;
149 descs_count++;
150 }
152 return;
154 pluglibs_err:
155 free(tmp_uris);
156 uris_err:
157 if (tmp_port_descs != NULL)
158 free(tmp_port_descs);
159 port_descs_err:
160 free(tmp_descs);
161 descs_err:
162 no_desc:
163 get_desc_err:
164 backbridge:
165 nacore_dl_close(dl_module);
166 dl_open_err:
167 return;
168 }
170 void
171 _nadssi_pluglib_load_all()
172 {
173 char *dssi_path;
174 char *ladspa_path;
176 _nadssi_pluglib_desc_tree = nacore_avl_tree_new(
177 nacore_content_cmp_descriptor_by_uri,
178 nacore_key_cmp_descriptor_by_uri);
179 if (_nadssi_pluglib_desc_tree == NULL)
180 return;
182 dssi_path = nacore_env_get_var("DSSI_PATH");
183 ladspa_path = nacore_env_get_var("LADSPA_PATH");
184 if (NACORE_STRING_IS_NULL_OR_EMPTY(ladspa_path)
185 && NACORE_STRING_IS_NULL_OR_EMPTY(dssi_path))
186 {
187 /* TODO: This is *nix-only */
188 nacore_path_home_for_each(".dssi", pluglib_load,
189 nacore_dl_filename_filter, NULL);
190 nacore_path_for_each("/usr/local/lib/dssi:/usr/lib/dssi",
191 pluglib_load, nacore_dl_filename_filter,
192 NULL);
193 }
194 else
195 {
196 if (!NACORE_STRING_IS_NULL_OR_EMPTY(dssi_path))
197 nacore_path_for_each(dssi_path, pluglib_load,
198 nacore_dl_filename_filter, NULL);
199 if (!NACORE_STRING_IS_NULL_OR_EMPTY(ladspa_path))
200 nacore_path_for_each(ladspa_path, pluglib_load,
201 nacore_dl_filename_filter, NULL);
202 }
204 if (ladspa_path != NULL)
205 nacore_env_free_var_value(ladspa_path);
206 if (dssi_path != NULL)
207 nacore_env_free_var_value(dssi_path);
208 }
210 void
211 _nadssi_pluglib_unload_all()
212 {
213 size_t i;
215 if (pluglibs == NULL)
216 return;
218 for (i = 0; i < pluglibs_count; i++)
219 {
220 nacore_dl_close(pluglibs[i].dl_module);
221 free(pluglibs[i].descs);
222 free(pluglibs[i].port_descs);
223 free(pluglibs[i].uris);
224 }
226 free(pluglibs);
227 pluglibs = NULL;
228 pluglibs_count = 0;
230 nacore_avl_tree_free(_nadssi_pluglib_desc_tree);
231 _nadssi_pluglib_desc_tree = NULL;
232 }