Adding support for Steve's cool liblrdf - Alex
[terminatorX.git] / src / tX_global.c
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 1999-2003  Alexander K├Ânig
4  
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9  
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14  
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  
19     File: tX_global.c
20  
21     Description:  This file contains the routines for handling the
22                   "globals" block. Intializing, reading setup from
23                   disk and storing it.
24                   
25     Changes:
26     
27     21 Jul 1999: introduced the lowpass globals.
28         There were some changes in between...
29         14 Jul 2002: switched to libxml instead of binary saving.
30 */    
31
32 #include <config.h>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include "tX_types.h"
36 #include "tX_global.h"
37 #include "string.h"
38 #include <libxml/xmlmemory.h>
39 #include <libxml/parser.h>
40
41 #define TX_XML_RC_VERSION "1.0"
42
43 tx_global globals;
44
45 void get_rc_name(char *buffer)
46 {
47         strcpy(buffer,"");
48         if (globals.alternate_rc)
49         {
50                 strcpy(buffer, globals.alternate_rc);
51         }
52         else 
53         {
54                 if (getenv("HOME"))
55                 {
56                         strcpy(buffer, getenv("HOME"));
57                         if (buffer[strlen(buffer)-1]!='/')
58                         strcat(buffer, "/");
59                 }
60                 strcat(buffer, ".terminatorXrc");
61         }
62 }
63
64 void set_global_defaults() {
65         globals.startup_set = 0;
66         globals.store_globals = 1;
67         globals.no_gui = 0;
68         globals.alternate_rc = 0;
69         
70         
71         strcpy(globals.xinput_device, "");
72         globals.xinput_enable=0;
73         
74         globals.update_idle=18;
75         globals.update_delay=1;
76         
77         strcpy(globals.oss_device, "/dev/dsp");
78         globals.oss_buff_no=2;
79         globals.oss_buff_size=9;
80         globals.oss_samplerate=44100;
81
82         strcpy(globals.alsa_device, "hw:0,0");  
83         globals.alsa_buff_no=2;
84         globals.alsa_buff_size=1024;
85         globals.alsa_samplerate=44100;
86         
87         globals.sense_cycles=12;
88         
89         globals.mouse_speed=0.8;
90         
91         globals.width=800;
92         globals.height=440;     
93         
94         globals.tooltips=1;
95         
96         globals.use_stdout=0;
97         globals.use_stdout_from_conf_file=0;
98         
99         globals.show_nag=1;
100         globals.prelis=1;
101         
102         strcpy(globals.last_fn,"");
103         
104         globals.pitch=1.0;
105         globals.volume=1.0;
106         globals.gui_wrap=3;
107         
108         globals.flash_response=0.95;
109         
110         globals.button_type=BUTTON_TYPE_BOTH;
111                 
112         globals.true_block_size=0;
113         
114         strcpy(globals.tables_filename, "");
115         strcpy(globals.record_filename, "tX_record.wav");
116         strcpy(globals.file_editor, "");
117                 
118 #ifdef USE_OSS
119         globals.audiodevice_type=OSS;           
120 #else
121 #ifdef USE_ALSA
122         globals.audiodevice_type=ALSA;
123 #endif  
124 #endif          
125         globals.use_stdout_cmdline=0;
126         globals.current_path = NULL;
127         globals.pitch=1.0;
128         globals.volume=1.0;
129         
130         strcpy(globals.lrdf_path, "/usr/share/ladspa/rdf:/usr/local/share/ladspa/rdf");
131         globals.fullscreen_enabled=1;
132         
133         if (!globals.true_block_size) globals.true_block_size=1<globals.oss_buff_size;
134 }
135
136 int load_globals_xml() {
137         char rc_name[PATH_MAX]="";      
138         char device_type[16]="oss";
139         xmlDocPtr doc;
140         xmlNodePtr cur;
141         int elementFound;
142         double dvalue;
143
144         get_rc_name(rc_name);
145         
146         doc = xmlParseFile(rc_name);
147         
148         if (doc == NULL ) {
149                 fprintf(stderr, "tX: err: Error parsing terminatorXrc.\n");
150                 return 1;
151         }
152         
153         cur = xmlDocGetRootElement(doc);
154         
155         if (cur == NULL) {
156                 fprintf(stderr,"tX: err: terminatorXrc contains no elements.\n");
157                 xmlFreeDoc(doc);
158                 return 2;
159         }
160         
161         if (xmlStrcmp(cur->name, (const xmlChar *) "terminatorXrc")) {
162                 fprintf(stderr,"tX: err: This terminatorXrc is not a terminatorXrc.");
163                 xmlFreeDoc(doc);
164                 return 3;
165         }
166                 
167         for (cur=cur->xmlChildrenNode; cur != NULL; cur = cur->next) {
168                 if (cur->type == XML_ELEMENT_NODE) {                    
169                         elementFound=0;
170
171                         restore_int("store_globals", globals.store_globals);
172
173                         restore_string("audio_driver", device_type);
174                         
175                         restore_string("oss_device", globals.oss_device);
176                         restore_int("oss_buff_no", globals.oss_buff_no);
177                         restore_int("oss_buff_size", globals.oss_buff_size);
178                         restore_int("oss_samplerate", globals.oss_samplerate);
179
180                         restore_string("alsa_device", globals.alsa_device);
181                         restore_int("alsa_buff_no", globals.alsa_buff_no);
182                         restore_int("alsa_buff_size", globals.alsa_buff_size);
183                         restore_int("alsa_samplerate", globals.alsa_samplerate);
184
185                         restore_string("xinput_device", globals.xinput_device);
186                         restore_int("xinput_enable", globals.xinput_enable);
187                         restore_int("update_idle", globals.update_idle);
188                         restore_int("update_delay", globals.update_delay);
189                         restore_int("sense_cycles", globals.sense_cycles);
190                         restore_float("mouse_speed", globals.mouse_speed);
191                         restore_int("width", globals.width);
192                         restore_int("height", globals.height);
193                         restore_int("tooltips", globals.tooltips);
194                         restore_int("use_stdout", globals.use_stdout);
195                         restore_int("show_nag", globals.show_nag);
196                         restore_int("prelis", globals.prelis);
197                         restore_string("last_fn", globals.last_fn);
198                         restore_float("pitch", globals.pitch);
199                         restore_float("volume", globals.volume);
200                         restore_float("flash_response", globals.flash_response);
201                         restore_int("button_type", globals.button_type);
202                         restore_int("true_block_size", globals.true_block_size);
203                         restore_string("tables_filename", globals.tables_filename);
204                         restore_string("record_filename", globals.record_filename);
205                         restore_string("file_editor", globals.file_editor);
206                         restore_string("lrdf_path", globals.lrdf_path);
207                         
208                         restore_int("fullscreen_enabled", globals.fullscreen_enabled);
209
210                         if (!elementFound) {
211                                 fprintf(stderr, "tX: Unhandled XML element: \"%s\"\n", cur->name);
212                         }
213                 }
214         }
215
216         xmlFreeDoc(doc);
217         
218         if (strcmp(device_type, "alsa")==0) globals.audiodevice_type=ALSA;
219         else if (strcmp(device_type, "jack")==0) globals.audiodevice_type=JACK;
220         else globals.audiodevice_type=OSS;
221         
222         return 0;
223 }
224
225 void store_globals() {
226         char rc_name[PATH_MAX]="";
227         char device_type[16];
228         char indent[]="\t";
229         FILE *rc;
230         char tmp_xml_buffer[4096];
231         
232         get_rc_name(rc_name);
233
234         rc=fopen(rc_name, "w");
235         
236         switch (globals.audiodevice_type) {
237                 case JACK:
238                         strcpy(device_type, "jack");
239                         break;
240                 case ALSA:
241                         strcpy(device_type, "alsa");
242                         break;
243                 case OSS:
244                 default:
245                         strcpy(device_type, "oss");
246                 
247         }
248         
249         if (rc) {               
250                 fprintf(rc, "<?xml version=\"1.0\" encoding=\"US-ASCII\"?>\n\n");
251                 fprintf(rc, "<!-- Warning: this file will be rewritten by terminatorX on exit!\n     Don\'t waste your time adding comments - they will be erased -->\n\n" );
252                 fprintf(rc, "<terminatorXrc version=\"%s\">\n", TX_XML_RC_VERSION);
253
254                 store_int("store_globals", globals.store_globals);
255
256                 store_string("audio_driver", device_type);
257                 
258                 store_string("oss_device", globals.oss_device);
259                 store_int("oss_buff_no", globals.oss_buff_no);
260                 store_int("oss_buff_size", globals.oss_buff_size);
261                 store_int("oss_samplerate", globals.oss_samplerate);
262
263                 store_string("alsa_device", globals.alsa_device);
264                 store_int("alsa_buff_no", globals.alsa_buff_no);
265                 store_int("alsa_buff_size", globals.alsa_buff_size);
266                 store_int("alsa_samplerate", globals.alsa_samplerate);          
267                 
268                 store_string("xinput_device", globals.xinput_device);
269                 store_int("xinput_enable", globals.xinput_enable);
270                 store_int("update_idle", globals.update_idle);
271                 store_int("update_delay", globals.update_delay);
272                 store_int("sense_cycles", globals.sense_cycles);
273                 store_float("mouse_speed", globals.mouse_speed);
274                 store_int("width", globals.width);
275                 store_int("height", globals.height);
276                 store_int("tooltips", globals.tooltips);
277                 store_int("use_stdout", globals.use_stdout);
278                 // globals.use_stdout_from_conf_file=0; What the heck is this?
279                 store_int("show_nag", globals.show_nag);
280                 store_int("prelis", globals.prelis);
281                 store_string("last_fn", globals.last_fn);
282                 store_float("pitch", globals.pitch);
283                 store_float("volume", globals.volume);
284                 store_float("flash_response", globals.flash_response);
285                 store_int("button_type", globals.button_type);
286                 store_int("true_block_size", globals.true_block_size);
287                 store_string("tables_filename", globals.tables_filename);
288                 store_string("record_filename", globals.record_filename);
289                 store_string("file_editor", globals.file_editor);
290                 store_string("lrdf_path", globals.lrdf_path);
291                 store_int("fullscreen_enabled", globals.fullscreen_enabled);
292                 
293                 fprintf(rc,"</terminatorXrc>\n");
294         }
295 }
296
297 #ifdef ENABLE_TX_LEGACY
298 extern void load_globals_old();
299 #endif
300
301 void load_globals() {
302         set_global_defaults();
303
304         if (load_globals_xml()!=0) {
305                 fprintf(stderr, "tX: Failed loading terminatorXrc - trying to load old binary rc.\n");
306 #ifdef ENABLE_TX_LEGACY         
307                 load_globals_old();
308 #endif          
309         }
310 }
311
312 char *encode_xml(char *dest, const char *src) {
313         int i, t, max;
314         
315         dest[0]=0;
316         t=0;
317         max=strlen(src);
318         
319         for (i=0; i<max; i++) {
320                 switch (src[i]) {
321                         case '<': dest[t]=0; strcat(dest, "&lt;"); t+=4; break;
322                         case '>': dest[t]=0; strcat(dest, "&gt;"); t+=4; break;
323                         case '&': dest[t]=0; strcat(dest, "&amp;"); t+=5; break;
324                         case '"': dest[t]=0; strcat(dest, "&quot;"); t+=6; break;
325                         case '\'': strcat(dest, "&apos;"); t+=7; break;
326                         default: dest[t]=src[i]; t++;
327                 }
328         }
329         dest[t]=0;
330         
331         //tX_debug("encode_xml: from \"%s\" to \"%s\".", src, dest); 
332         return dest;
333 }