It's 2020...
[terminatorX.git] / src / tX_global.h
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 1999-2020  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, see <http://www.gnu.org/licenses/>.
17  
18     File: tX_global.h
19  
20     Description: Header to tX_global.c / defines the heavily used
21                  tX_global struct.
22 */    
23
24 #ifndef _TX_GLOBAL_H
25 #define _TX_GLOBAL_H
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif /* __cplusplus */
30
31 #include <limits.h>
32 #include <stdio.h>
33 #include "tX_types.h"
34
35 #ifndef PATH_MAX
36 #define PATH_MAX 1024
37 #endif
38
39 // JACK clips with true 16 Bit MAX...
40 #define FL_SHRT_MAX 32765.0 // 32767.0
41 #define FL_SHRT_MIN -32765.0 // -32768.0
42
43 #define BUTTON_TYPE_ICON 1
44 #define BUTTON_TYPE_TEXT 2
45 #define BUTTON_TYPE_BOTH 3
46
47 #ifdef HAVE_CONFIG_H
48 #include <config.h>
49 #endif
50
51 #include <zlib.h>
52         
53 #ifdef ENABLE_DEBUG_OUTPUT      
54 #define tX_debug(fmt, args...); { fprintf(stderr, "~ tX_debug: "); fprintf(stderr, fmt , ## args); fprintf(stderr, "\n"); }
55 #else
56 #define tX_debug(fmt, args...);
57 #endif
58         
59 #define tX_error(fmt, args...); { fprintf(stderr, "* tX_error: "); fprintf(stderr, fmt , ## args); fprintf(stderr, "\n"); }
60 #define tX_warning(fmt, args...); { fprintf(stderr, "+ tX_warning: "); fprintf(stderr, fmt , ## args); fprintf(stderr, "\n"); }
61 #define tX_msg(fmt, args...); { fprintf(stderr, "- tX_msg: "); fprintf(stderr, fmt , ## args); fprintf(stderr, "\n"); }
62 #define tX_plugin_warning(fmt, args...); { if (globals.verbose_plugin_loading) { fprintf(stderr, "+ tX_warning: "); fprintf(stderr, fmt , ## args); fprintf(stderr, "\n"); }}
63
64 #define tX_min(a,b) ((a) < (b) ? (a) : (b))
65 #define tX_max(a,b) ((a) > (b) ? (a) : (b))
66         
67 #ifdef MEM_DEBUG
68 #define tX_freemem(ptr, varname, comment); fprintf(stderr, "** free() [%s] at %08x. %s.\n", varname, ptr, comment); free(ptr);
69 #define tX_malloc(ptr, varname, comment, size, type); fprintf(stderr, "**[1/2] malloc() [%s]. Size: %i. %s.\n", varname, size, comment); ptr=type malloc(size); fprintf(stderr, "**[2/2] malloc() [%s]. ptr: %08x.\n", varname, ptr);
70 #else
71 #define tX_freemem(ptr, varname, comment); free(ptr);
72 #define tX_malloc(ptr, varname, comment, size, type); ptr=type malloc(size);
73 #endif
74
75 typedef enum {
76         OSS =0,
77         ALSA = 1,
78         JACK = 2,
79         PULSE = 3
80 } tX_audiodevice_type;
81         
82 typedef struct {
83         int     xinput_enable;
84         char xinput_device[256];
85         
86         int     store_globals;          // if it should store the globals vals on exit
87         char *startup_set;      
88         char *alternate_rc;             // a diferent set of stored globals to load
89         int     no_gui;                 // run without any gui
90         
91         int     update_idle;    
92         int     sense_cycles;
93         
94         int width;
95         int height;
96
97         int tooltips;
98         
99         f_prec mouse_speed;
100                 
101         char last_fn[PATH_MAX];
102
103         int use_stdout;
104         int use_stdout_cmdline;
105         int use_stdout_from_conf_file;
106         int show_nag;
107         int input_fallback_warning;
108         
109         int prelis;
110         
111         f_prec pitch;
112         f_prec volume;
113         
114         int gui_wrap;
115         
116         char tables_filename[PATH_MAX];
117         char record_filename[PATH_MAX];
118         int autoname;
119         
120         float flash_response;
121         int knob_size_override;
122         
123         int button_type;
124
125         char file_editor[PATH_MAX];
126         int true_block_size;
127         int update_delay; 
128         
129         char current_path[PATH_MAX];
130         
131         /* new audiodevice handling 
132            we have *all* variables for *all* audiodevice types -
133            even if support for them is not compiled in - to keep
134            the .terminatorX3rc.bin in sync.
135         */
136         
137         tX_audiodevice_type audiodevice_type; // TX_AUDIODEVICE_TYPE_OSS etc.
138         
139         /* OSS specific options  */
140         char oss_device[PATH_MAX];
141         int oss_buff_no;
142         int oss_buff_size; // 2^X Bytes
143         int oss_samplerate;
144         
145         /* ALSA specific options */
146         char alsa_device_id[PATH_MAX];
147         int alsa_buffer_time;
148         int alsa_period_time;
149         int alsa_samplerate;
150
151         /* PULSE specific options */
152         int pulse_buffer_length;
153
154         char lrdf_path[PATH_MAX];
155         
156         int compress_set_files;
157         
158         int fullscreen_enabled;
159         int confirm_events;
160         
161         double vtt_inertia;
162         
163         int alsa_free_hwstats;
164         int filename_length;
165         
166         int restore_midi_connections;
167         int wav_display_history;
168         
169         char wav_display_bg_focus[8];
170         char wav_display_bg_no_focus[8];
171         
172         char wav_display_fg_focus[8];
173         char wav_display_fg_no_focus[8];        
174         
175         char wav_display_cursor[8];     
176         char wav_display_cursor_mute[8];
177         
178         char vu_meter_bg[8];
179         char vu_meter_loud[8];
180         char vu_meter_normal[8];
181         double vu_meter_border_intensity;
182         
183         int quit_confirm;
184         int use_realtime;
185         int auto_assign_midi;
186         
187         int verbose_plugin_loading;
188         int force_nonrt_plugins;
189 } tx_global;
190
191 extern tx_global globals;
192
193 extern void load_globals();
194 extern void store_globals();
195 extern void set_global_defaults();
196 extern char *encode_xml(char *dest, const char *src);
197 extern char *decode_xml(char *dest, const char *src);
198
199 #define nop
200
201 /* some ugly XML macros... */
202 #define restore_int(s, i); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) { sscanf((char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1), "%i", &i); }}
203 #define restore_float(s, i); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if  (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {sscanf((char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1), "%lf", &dvalue); i=dvalue;}}
204 #define restore_string(s, i); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {strcpy(i, decode_xml(tmp_xml_buffer, (const char *)  xmlNodeListGetString(doc, cur->xmlChildrenNode, 1))); }}
205 #define restore_bool(s, i); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {if (xmlStrcmp(xmlNodeListGetString(doc, cur->xmlChildrenNode, 1),  (const xmlChar *) "true")==0) i=true; else i=false; }}
206 #define restore_id(s, sp); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; pid_attr=(char* ) xmlGetProp(cur, (xmlChar *) "id"); if (pid_attr) { sscanf(pid_attr, "%i",  &pid); sp.set_persistence_id(pid); }}
207
208 #define restore_int_ac(s, i, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) { sscanf((char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1), "%i", &i); init; }}
209 #define restore_float_ac(s, i, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if  (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {sscanf((char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1), "%lf", &dvalue); i=dvalue; init; }}
210 #define restore_string_ac(s, i, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {strcpy(i, decode_xml(tmp_xml_buffer, (const char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1))); init; }}
211 #define restore_bool_ac(s, i, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {if (xmlStrcmp(xmlNodeListGetString(doc, cur->xmlChildrenNode, 1), (const xmlChar *) "true")==0) i=true; else i=false; init; }}
212
213 //#define restore_int_id(s, i, sp, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) { sscanf((char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1), "%i", &i); pid_attr=(char* ) xmlGetProp(cur, (xmlChar *) "id"); if (pid_attr) { sscanf(pid_attr, "%i",  &pid); sp.set_persistence_id(pid); } init; }}
214 //#define restore_float_id(s, i, sp, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if  (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {sscanf((char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1), "%lf", &dvalue); i=dvalue; pid_attr=(char* ) xmlGetProp(cur, (xmlChar *) "id"); if (pid_attr) { sscanf(pid_attr, "%i",  &pid); sp.set_persistence_id(pid); } init; }}
215 //#define restore_bool_id(s, i, sp, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {if (xmlStrcmp(xmlNodeListGetString(doc, cur->xmlChildrenNode, 1),  (const xmlChar *) "true")==0) i=true; else i=false; pid_attr=(char* ) xmlGetProp(cur,  (xmlChar *)"id"); if (pid_attr) { sscanf(pid_attr, "%i",  &pid); sp.set_persistence_id(pid); } init; }}
216
217 extern int _store_compress_xml;
218
219 #define tX_store(fmt, args...); { _store_compress_xml ? gzprintf(rz, fmt , ## args) : fprintf(rc, fmt , ## args); }
220
221 #define store_int(s, i); tX_store("%s<%s>%i</%s>\n", indent, s,(int) i, s);
222 #define store_float(s, i); tX_store((sizeof(i)>4) ? "%s<%s>%lf</%s>\n" : "%s<%s>%f</%s>\n", indent, s, i, s);
223 #define store_string(s, i); tX_store("%s<%s>%s</%s>\n", indent, s, encode_xml(tmp_xml_buffer, i) , s);
224 #define store_bool(s, i); tX_store("%s<%s>%s</%s>\n", indent, s, i ? "true" : "false", s);
225
226 #define store_id(s, id); tX_store("%s<%s id=\"%i\"/>\n", indent, s, id);
227 #define store_int_id(s, i, id); tX_store("%s<%s id=\"%i\">%i</%s>\n", indent, s, id, (int) i, s);
228 #define store_float_id(s, i, id); tX_store((sizeof(i)>4) ? "%s<%s id=\"%i\">%lf</%s>\n" : "%s<%s id=\"%i\">%f</%s>\n", indent, s, id, i, s);
229 #define store_bool_id(s, i, id); tX_store("%s<%s id=\"%i\">%s</%s>\n", indent, s, id, i ? "true" : "false", s);
230
231 #define store_id_sp(name, sp); { tX_store("%s<%s ", indent, name); sp.store_meta(rc, rz); tX_store("/>\n"); }
232 #define store_int_sp(name, i, sp); { tX_store("%s<%s ", indent, name); sp.store_meta(rc, rz); tX_store(">%i</%s>\n", (int) i, name); }
233 #define store_float_sp(name, i, sp); { tX_store("%s<%s ", indent, name); sp.store_meta(rc, rz); tX_store((sizeof(i)>4) ? ">%lf</%s>\n" : ">%f</%s>\n" , i, name); }
234 #define store_bool_sp(name, i, sp); { tX_store("%s<%s ", indent, name); sp.store_meta(rc, rz); tX_store(">%s</%s>\n", i ? "true" : "false", name); }
235
236 #define restore_sp_id(s, sp); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; sp.restore_meta(cur); }
237 #define restore_int_id(s, i, sp, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) { sscanf((char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1), "%i", &i);  init; } sp.restore_meta(cur); }
238 #define restore_float_id(s, i, sp, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if  (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {sscanf((char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1), "%lf", &dvalue); i=dvalue; init; } sp.restore_meta(cur);}
239 #define restore_bool_id(s, i, sp, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {if (xmlStrcmp(xmlNodeListGetString(doc, cur->xmlChildrenNode, 1),  (const xmlChar *) "true")==0) i=true; else i=false; init; } sp.restore_meta(cur);}
240
241 #ifdef __cplusplus
242 }
243 #endif /* __cplusplus */
244
245 #endif