Mercurial > audlegacy
annotate Plugins/Visualization/paranormal/pn/pnvis.c @ 1591:02841f72b897 trunk
[svn] Cast variable to proper type before passing it into libxml2. Include necessary header to make this possible. Resolves 35 pointer signedness warnings on PPC.
author | chainsaw |
---|---|
date | Thu, 24 Aug 2006 11:40:00 -0700 |
parents | 4319ae8c8f69 |
children | 752949e9aec4 |
rev | line source |
---|---|
1507 | 1 /* Paranormal - A highly customizable audio visualization library |
2 * Copyright (C) 2001 Jamie Gennis <jgennis@mindspring.com> | |
3 * | |
4 * This library is free software; you can redistribute it and/or | |
5 * modify it under the terms of the GNU Library General Public | |
6 * License as published by the Free Software Foundation; either | |
7 * version 2 of the License, or (at your option) any later version. | |
8 * | |
9 * This library is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 * Library General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU Library General Public | |
15 * License along with this library; if not, write to the Free | |
16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
17 */ | |
18 | |
19 #include <config.h> | |
20 | |
21 #include <glib.h> | |
22 #include "pnvis.h" | |
23 #include "pnactuatorfactory.h" | |
24 #include "pnerror.h" | |
25 | |
26 static void pn_vis_class_init (PnVisClass *class); | |
27 static void pn_vis_init (PnVis *vis, | |
28 PnVisClass *class); | |
29 | |
30 /* GObject signals */ | |
31 static void pn_vis_finalize (GObject *gobject); | |
32 | |
33 /* PnObject signals */ | |
34 static void pn_vis_destroy (PnObject *object); | |
35 | |
36 /* PnUserObject methods */ | |
37 static void pn_vis_save_thyself (PnUserObject *user_object, | |
38 xmlNodePtr node); | |
39 static void pn_vis_load_thyself (PnUserObject *user_object, | |
40 xmlNodePtr node); | |
41 | |
42 static PnUserObjectClass *parent_class = NULL; | |
43 | |
44 GType | |
45 pn_vis_get_type (void) | |
46 { | |
47 static GType vis_type = 0; | |
48 | |
49 if (! vis_type) | |
50 { | |
51 static const GTypeInfo vis_info = | |
52 { | |
53 sizeof (PnVisClass), | |
54 NULL, /* base_init */ | |
55 NULL, /* base_finalize */ | |
56 (GClassInitFunc) pn_vis_class_init, | |
57 NULL, /* class_finalize */ | |
58 NULL, /* class_data */ | |
59 sizeof (PnVis), | |
60 0, /* n_preallocs */ | |
61 (GInstanceInitFunc) pn_vis_init | |
62 }; | |
63 | |
64 /* FIXME: should this be dynamic? */ | |
65 vis_type = g_type_register_static (PN_TYPE_USER_OBJECT, | |
66 "PnVis", | |
67 &vis_info, | |
68 0); | |
69 } | |
70 return vis_type; | |
71 } | |
72 | |
73 static void | |
74 pn_vis_class_init (PnVisClass *class) | |
75 { | |
76 GObjectClass *gobject_class; | |
77 PnObjectClass *object_class; | |
78 PnUserObjectClass *user_object_class; | |
79 | |
80 parent_class = g_type_class_peek_parent (class); | |
81 | |
82 gobject_class = (GObjectClass *) class; | |
83 object_class = (PnObjectClass *) class; | |
84 user_object_class = (PnUserObjectClass *) class; | |
85 | |
86 /* GObject signals */ | |
87 gobject_class->finalize = pn_vis_finalize; | |
88 | |
89 /* PnObject signals */ | |
90 object_class->destroy = pn_vis_destroy; | |
91 | |
92 /* PnUserObject methods */ | |
93 user_object_class->save_thyself = pn_vis_save_thyself; | |
94 user_object_class->load_thyself = pn_vis_load_thyself; | |
95 } | |
96 | |
97 static void | |
98 pn_vis_init (PnVis *vis, PnVisClass *class) | |
99 { | |
100 /* Set a name for xml stuffs */ | |
101 pn_user_object_set_name (PN_USER_OBJECT (vis), "Paranormal_Visualization"); | |
102 | |
103 /* Create a new image context */ | |
104 vis->root_image = pn_image_new (); | |
105 pn_object_ref (PN_OBJECT (vis->root_image)); | |
106 pn_object_sink (PN_OBJECT (vis->root_image)); | |
107 } | |
108 | |
109 static void | |
110 pn_vis_destroy (PnObject *object) | |
111 { | |
112 PnVis *vis = (PnVis *) object; | |
113 | |
114 if (vis->root_actuator) | |
115 pn_object_unref (PN_OBJECT (vis->root_actuator)); | |
116 | |
117 if (vis->root_image) | |
118 pn_object_unref (PN_OBJECT (vis->root_image)); | |
119 } | |
120 | |
121 static void | |
122 pn_vis_finalize (GObject *gobject) | |
123 { | |
124 PnVis *vis; | |
125 | |
126 vis = (PnVis *) gobject; | |
127 } | |
128 | |
129 static void | |
130 pn_vis_save_thyself (PnUserObject *user_object, xmlNodePtr node) | |
131 { | |
132 PnVis *vis; | |
133 xmlNsPtr ns; | |
134 xmlNodePtr actuators_node, actuator_node; | |
135 | |
136 g_return_if_fail (user_object != NULL); | |
137 g_return_if_fail (PN_IS_VIS (user_object)); | |
138 g_return_if_fail (node != NULL); | |
139 | |
140 vis = (PnVis *) user_object; | |
141 | |
1591
02841f72b897
[svn] Cast variable to proper type before passing it into libxml2. Include necessary header to make this possible. Resolves 35 pointer signedness warnings on PPC.
chainsaw
parents:
1531
diff
changeset
|
142 ns = xmlNewNs (node, PN_XML_NS_HREF, (xmlChar *) "pn"); |
1507 | 143 xmlSetNs (node, ns); |
144 | |
1591
02841f72b897
[svn] Cast variable to proper type before passing it into libxml2. Include necessary header to make this possible. Resolves 35 pointer signedness warnings on PPC.
chainsaw
parents:
1531
diff
changeset
|
145 actuators_node = xmlNewChild (node, NULL, (xmlChar *) "Actuators", NULL); |
02841f72b897
[svn] Cast variable to proper type before passing it into libxml2. Include necessary header to make this possible. Resolves 35 pointer signedness warnings on PPC.
chainsaw
parents:
1531
diff
changeset
|
146 actuator_node = xmlNewChild (actuators_node, NULL, (xmlChar *) user_object->name, NULL); |
1507 | 147 if (vis->root_actuator) |
148 pn_user_object_save_thyself (PN_USER_OBJECT (vis->root_actuator), actuator_node); | |
149 | |
150 if (parent_class->save_thyself) | |
151 parent_class->save_thyself (user_object, node); | |
152 } | |
153 | |
154 static void | |
155 pn_vis_load_thyself (PnUserObject *user_object, const xmlNodePtr node) | |
156 { | |
157 PnVis *vis; | |
1527 | 158 xmlNodePtr actuators_node, actuator_node, tptr; |
159 PnActuator *root_actuator = NULL; | |
1507 | 160 |
161 g_return_if_fail (user_object != NULL); | |
162 g_return_if_fail (PN_IS_VIS (user_object)); | |
163 g_return_if_fail (node != NULL); | |
164 | |
165 vis = (PnVis *) user_object; | |
166 | |
167 /* find the 'Actuators' node */ | |
168 for (actuators_node = node->xmlChildrenNode; actuators_node; actuators_node = actuators_node->next) | |
169 if (g_strcasecmp (actuators_node->name, "Actuators") == 0) | |
170 break; | |
171 if (! actuators_node) | |
172 { | |
173 pn_error ("unable to load a PnVis from xml node \"%s\"", node->name); | |
174 return; | |
175 } | |
176 | |
177 /* get the root actuator's node */ | |
1531
4319ae8c8f69
[svn] - ok, with this commit, loading now works =)
nenolod
parents:
1527
diff
changeset
|
178 for (actuator_node = actuators_node->xmlChildrenNode; actuator_node != NULL && !g_strcasecmp(actuator_node->name, "text"); |
4319ae8c8f69
[svn] - ok, with this commit, loading now works =)
nenolod
parents:
1527
diff
changeset
|
179 actuator_node = actuator_node->next); |
1507 | 180 if (! actuator_node) |
181 goto done; | |
182 | |
1527 | 183 /* Create a new actuator (reworked by nenolod) */ |
1531
4319ae8c8f69
[svn] - ok, with this commit, loading now works =)
nenolod
parents:
1527
diff
changeset
|
184 #if 0 |
1527 | 185 for (tptr = actuator_node; tptr != NULL && root_actuator == NULL; tptr = tptr->next) |
186 { | |
187 xmlNodePtr ttptr; | |
188 | |
189 for (ttptr = tptr; ttptr != NULL; ttptr = ttptr->xmlChildrenNode) | |
190 } | |
1531
4319ae8c8f69
[svn] - ok, with this commit, loading now works =)
nenolod
parents:
1527
diff
changeset
|
191 #endif |
1527 | 192 |
1531
4319ae8c8f69
[svn] - ok, with this commit, loading now works =)
nenolod
parents:
1527
diff
changeset
|
193 root_actuator = pn_actuator_factory_new_actuator_from_xml (actuator_node); |
1527 | 194 if (!root_actuator) |
1531
4319ae8c8f69
[svn] - ok, with this commit, loading now works =)
nenolod
parents:
1527
diff
changeset
|
195 pn_error ("Unknown actuator \"%s\" -> '%s'", actuator_node->name, actuator_node->content); |
1507 | 196 |
197 pn_vis_set_root_actuator (vis, root_actuator); | |
198 | |
199 done: | |
200 if (parent_class->load_thyself) | |
201 parent_class->load_thyself (user_object, node); | |
202 } | |
203 | |
204 PnVis* | |
205 pn_vis_new (guint image_width, guint image_height) | |
206 { | |
207 PnVis *vis; | |
208 | |
209 g_return_val_if_fail (image_width > 0, NULL); | |
210 g_return_val_if_fail (image_height > 0, NULL); | |
211 | |
212 vis = (PnVis *) g_object_new (PN_TYPE_VIS, NULL); | |
213 pn_vis_set_image_size (vis, image_width, image_height); | |
214 | |
215 return vis; | |
216 } | |
217 | |
218 void | |
219 pn_vis_set_root_actuator (PnVis *vis, PnActuator *actuator) | |
220 { | |
221 g_return_if_fail (vis != NULL); | |
222 g_return_if_fail (PN_IS_VIS (vis)); | |
223 g_return_if_fail (actuator != NULL); | |
224 g_return_if_fail (PN_IS_ACTUATOR (actuator)); | |
225 | |
226 if (vis->root_actuator) | |
227 pn_object_unref (PN_OBJECT (vis->root_actuator)); | |
228 | |
229 vis->root_actuator = actuator; | |
230 | |
231 pn_object_ref (PN_OBJECT (actuator)); | |
232 pn_object_sink (PN_OBJECT (actuator)); | |
233 pn_user_object_set_owner (PN_USER_OBJECT (actuator), PN_USER_OBJECT (vis)); | |
234 | |
235 pn_actuator_prepare (actuator, vis->root_image); | |
236 } | |
237 | |
238 PnActuator* | |
239 pn_vis_get_root_actuator (PnVis *vis) | |
240 { | |
241 g_return_val_if_fail (vis != NULL, NULL); | |
242 g_return_val_if_fail (PN_IS_VIS (vis), NULL); | |
243 | |
244 return vis->root_actuator; | |
245 } | |
246 | |
247 void | |
248 pn_vis_set_image_size (PnVis *vis, guint width, guint height) | |
249 { | |
250 g_return_if_fail (vis != NULL); | |
251 g_return_if_fail (PN_IS_VIS (vis)); | |
252 | |
253 pn_image_set_size (vis->root_image, width, height); | |
254 | |
255 if (vis->root_actuator) | |
256 pn_actuator_prepare (vis->root_actuator, vis->root_image); | |
257 } | |
258 | |
259 gboolean | |
260 pn_vis_save_to_file (PnVis *vis, const gchar *fname) | |
261 { | |
262 xmlDocPtr doc; | |
263 | |
1591
02841f72b897
[svn] Cast variable to proper type before passing it into libxml2. Include necessary header to make this possible. Resolves 35 pointer signedness warnings on PPC.
chainsaw
parents:
1531
diff
changeset
|
264 doc = xmlNewDoc ((xmlChar *) "1.0"); |
1507 | 265 |
1591
02841f72b897
[svn] Cast variable to proper type before passing it into libxml2. Include necessary header to make this possible. Resolves 35 pointer signedness warnings on PPC.
chainsaw
parents:
1531
diff
changeset
|
266 doc->xmlRootNode = xmlNewDocNode (doc, NULL, (xmlChar *) "BUG", NULL); |
1507 | 267 |
268 pn_user_object_save_thyself (PN_USER_OBJECT (vis), doc->xmlRootNode); | |
269 | |
270 if ( xmlSaveFile (fname, doc) == -1) | |
271 { | |
272 xmlFreeDoc (doc); | |
273 return FALSE; | |
274 } | |
275 | |
276 xmlFreeDoc (doc); | |
277 return TRUE; | |
278 } | |
279 | |
280 gboolean | |
281 pn_vis_load_from_file (PnVis *vis, const gchar *fname) | |
282 { | |
283 xmlDocPtr doc; | |
284 xmlNodePtr root_node; | |
285 xmlNsPtr ns; | |
286 | |
287 doc = xmlParseFile (fname); | |
288 if (! doc) | |
289 { | |
290 pn_error ("unable to parse file \"%s\"", fname); | |
291 return FALSE; | |
292 } | |
293 | |
294 root_node = xmlDocGetRootElement (doc); | |
295 if (! root_node) | |
296 { | |
297 pn_error ("no root element for file \"%s\"", fname); | |
298 return FALSE; | |
299 } | |
300 | |
301 ns = xmlSearchNsByHref (doc, root_node, PN_XML_NS_HREF); | |
302 if (! ns) | |
303 { | |
304 pn_error ("invalid file format: paranormal namespace not found"); | |
305 return FALSE; | |
306 } | |
307 | |
308 if (g_strcasecmp (root_node->name, pn_user_object_get_name (PN_USER_OBJECT (vis)))) | |
309 { | |
310 pn_error ("invalid file format: this file does not contain a Paranormal visualization"); | |
311 return FALSE; | |
312 } | |
313 | |
314 pn_user_object_load_thyself (PN_USER_OBJECT (vis), root_node); | |
315 | |
316 return TRUE; | |
317 } | |
318 | |
319 PnImage* | |
320 pn_vis_render (PnVis *vis, PnAudioData *audio_data) | |
321 { | |
322 g_return_val_if_fail (vis != NULL, NULL); | |
323 g_return_val_if_fail (PN_IS_VIS (vis), NULL); | |
324 g_return_val_if_fail (audio_data != NULL, NULL); | |
325 /* g_return_val_if_fail (PN_IS_AUDIO_DATA (audio_data), NULL); */ | |
326 | |
327 if (vis->root_actuator) | |
328 pn_actuator_execute (vis->root_actuator, | |
329 vis->root_image, | |
330 audio_data); | |
331 | |
332 return vis->root_image; | |
333 } |