naspro

view naspro-bridges-bad/dssi/pluglib.c @ 168:c7f1f52651be

More fixes
author Stefano D'Angelo <zanga.mail@gmail.com>
date Sat Sep 12 18:43:25 2009 +0200 (2009-09-12)
parents aaa8564ded8c
children cebccb1b4718
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"
22 nacore_avl_tree_t _nadssi_pluglib_desc_tree = NULL;
24 struct pluglib
25 {
26 nacore_dl_module_t dl_module;
27 struct nacore_descriptor *descs;
28 size_t descs_count;
29 struct nacore_port_descriptor *port_descs;
30 size_t port_descs_count;
31 char *uris;
32 size_t uris_size;
33 };
35 static struct pluglib *pluglibs = NULL;
36 static size_t pluglibs_count = 0;
38 static void
39 pluglib_load(const char *file, const char *basename, void *data)
40 {
41 nacore_dl_module_t dl_module;
42 const DSSI_Descriptor *ddesc;
43 DSSI_Descriptor_Function get_desc;
44 struct pluglib *tmp_pluglibs;
45 struct nacore_descriptor *tmp_descs;
46 struct nacore_port_descriptor *tmp_port_descs;
47 char *tmp_uris;
48 size_t descs_count, ports_count, uris_size;
49 unsigned long i;
50 char *c;
52 dl_module = nacore_dl_open(file);
53 if (dl_module == NULL)
54 goto dl_open_err;
56 if (nacore_dl_sym(dl_module, "naspro_backbridge") != NULL)
57 goto backbridge;
59 *(void **)(&get_desc) = nacore_dl_sym(dl_module, "dssi_descriptor");
60 if (get_desc == NULL)
61 goto get_desc_err;
63 for (i = 0, descs_count = 0, ports_count = 0, uris_size = 0;
64 (ddesc = get_desc(i)) != NULL; i++)
65 {
66 if (ddesc->DSSI_API_Version != 1)
67 continue;
69 ports_count += ddesc->LADSPA_Plugin->PortCount;
70 if (ddesc->run_synth != NULL)
71 ports_count++;
72 c = strrchr(basename, '.');
73 uris_size += c - basename
74 + strlen(ddesc->LADSPA_Plugin->Label) + 11;
75 descs_count++;
76 }
77 if (descs_count == 0)
78 goto no_desc;
80 tmp_descs = malloc(descs_count * sizeof(struct nacore_descriptor));
81 if (tmp_descs == NULL)
82 goto descs_err;
84 tmp_port_descs = NULL;
85 if (ports_count != 0)
86 {
87 tmp_port_descs = malloc(ports_count
88 * sizeof(struct nacore_port_descriptor));
89 if (tmp_port_descs == NULL)
90 goto port_descs_err;
91 }
93 tmp_uris = malloc(uris_size);
94 if (tmp_uris == NULL)
95 goto uris_err;
97 tmp_pluglibs = realloc(pluglibs,
98 (pluglibs_count + 1) * sizeof(struct pluglib));
99 if (tmp_pluglibs == NULL)
100 goto pluglibs_err;
102 pluglibs = tmp_pluglibs;
103 tmp_pluglibs = pluglibs + pluglibs_count;
104 pluglibs_count++;
106 tmp_pluglibs->dl_module = dl_module;
108 tmp_pluglibs->descs = tmp_descs;
109 tmp_pluglibs->descs_count = descs_count;
110 tmp_pluglibs->port_descs = tmp_port_descs;
111 tmp_pluglibs->port_descs_count = ports_count;
112 tmp_pluglibs->uris = tmp_uris;
113 tmp_pluglibs->uris_size = uris_size;
115 for (i = 0, descs_count = 0, ports_count = 0, uris_size = 0;
116 (ddesc = get_desc(i)) != NULL; i++)
117 {
118 if (ddesc->DSSI_API_Version != 1)
119 continue;
121 tmp_pluglibs->descs[descs_count].port_descs =
122 tmp_pluglibs->port_descs + ports_count;
123 tmp_pluglibs->descs[descs_count].port_descs_count =
124 ddesc->LADSPA_Plugin->PortCount;
125 if (ddesc->run_synth != NULL)
126 tmp_pluglibs->descs[descs_count].port_descs_count++;
127 tmp_pluglibs->descs[descs_count].uri =
128 tmp_pluglibs->uris + uris_size;
129 c = strrchr(basename, '.');
130 strcpy(tmp_pluglibs->descs[descs_count].uri, "urn:dssi:");
131 strncat(tmp_pluglibs->descs[descs_count].uri, basename,
132 c - basename);
133 strcat(tmp_pluglibs->descs[descs_count].uri, ":");
134 strcat(tmp_pluglibs->descs[descs_count].uri,
135 ddesc->LADSPA_Plugin->Label);
137 _nadssi_descriptor_fill(tmp_pluglibs->descs + descs_count,
138 ddesc);
140 nacore_avl_tree_add(_nadssi_pluglib_desc_tree,
141 tmp_pluglibs->descs + descs_count);
143 ports_count += ddesc->LADSPA_Plugin->PortCount;
144 if (ddesc->run_synth != NULL)
145 ports_count++;
146 uris_size += c - basename
147 + strlen(ddesc->LADSPA_Plugin->Label) + 11;
148 descs_count++;
149 }
151 return;
153 pluglibs_err:
154 free(tmp_uris);
155 uris_err:
156 if (tmp_port_descs != NULL)
157 free(tmp_port_descs);
158 port_descs_err:
159 free(tmp_descs);
160 descs_err:
161 no_desc:
162 get_desc_err:
163 backbridge:
164 nacore_dl_close(dl_module);
165 dl_open_err:
166 return;
167 }
169 void
170 _nadssi_pluglib_load_all()
171 {
172 char *dssi_path;
173 char *ladspa_path;
175 _nadssi_pluglib_desc_tree = nacore_avl_tree_new(
176 nacore_content_cmp_descriptor_by_uri,
177 nacore_key_cmp_descriptor_by_uri);
178 if (_nadssi_pluglib_desc_tree == NULL)
179 return;
181 dssi_path = nacore_env_get_var("DSSI_PATH");
182 ladspa_path = nacore_env_get_var("LADSPA_PATH");
183 if (NACORE_STRING_IS_NULL_OR_EMPTY(ladspa_path)
184 && NACORE_STRING_IS_NULL_OR_EMPTY(dssi_path))
185 {
186 /* TODO: This is *nix-only */
187 nacore_path_home_for_each(".dssi", pluglib_load,
188 nacore_dl_filename_filter, NULL);
189 nacore_path_for_each("/usr/local/lib/dssi:/usr/lib/dssi",
190 pluglib_load, nacore_dl_filename_filter,
191 NULL);
192 }
193 else
194 {
195 if (!NACORE_STRING_IS_NULL_OR_EMPTY(dssi_path))
196 nacore_path_for_each(dssi_path, pluglib_load,
197 nacore_dl_filename_filter, NULL);
198 if (!NACORE_STRING_IS_NULL_OR_EMPTY(ladspa_path))
199 nacore_path_for_each(ladspa_path, pluglib_load,
200 nacore_dl_filename_filter, NULL);
201 }
203 if (ladspa_path != NULL)
204 nacore_env_free_var_value(ladspa_path);
205 if (dssi_path != NULL)
206 nacore_env_free_var_value(dssi_path);
207 }
209 void
210 _nadssi_pluglib_unload_all()
211 {
212 size_t i;
214 if (pluglibs == NULL)
215 return;
217 for (i = 0; i < pluglibs_count; i++)
218 {
219 nacore_dl_close(pluglibs[i].dl_module);
220 free(pluglibs[i].descs);
221 free(pluglibs[i].port_descs);
222 free(pluglibs[i].uris);
223 }
225 free(pluglibs);
226 pluglibs = NULL;
227 pluglibs_count = 0;
229 nacore_avl_tree_free(_nadssi_pluglib_desc_tree);
230 _nadssi_pluglib_desc_tree = NULL;
231 }