pdlua almost getting somewhere
[pdlua:pdlua.git] / src / m_pd.h
1 /* Copyright (c) 1997-1999 Miller Puckette.
2 * For information on usage and redistribution, and for a DISCLAIMER OF ALL
3 * WARRANTIES, see the file, "LICENSE.txt," in this distribution.  */
4
5 #ifndef __m_pd_h_
6
7 #if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
8 extern "C" {
9 #endif
10
11 #define PD_MAJOR_VERSION 0
12 #define PD_MINOR_VERSION 40
13 #define PD_BUGFIX_VERSION 2
14 #define PD_TEST_VERSION ""
15
16 /* old name for "MSW" flag -- we have to take it for the sake of many old
17 "nmakefiles" for externs, which will define NT and not MSW */
18 #if defined(NT) && !defined(MSW)
19 #define MSW
20 #endif
21
22 /* These pragmas are only used for MSVC, not MinGW or Cygwin <hans@at.or.at> */
23 #ifdef _MSC_VER
24 /* #pragma warning( disable : 4091 ) */
25 #pragma warning( disable : 4305 )  /* uncast const double to float */
26 #pragma warning( disable : 4244 )  /* uncast float/int conversion etc. */
27 #pragma warning( disable : 4101 )  /* unused automatic variables */
28 #endif /* _MSC_VER */
29
30     /* the external storage class is "extern" in UNIX; in MSW it's ugly. */
31 #ifdef MSW
32 #ifdef PD_INTERNAL
33 #define EXTERN __declspec(dllexport) extern
34 #else
35 #define EXTERN __declspec(dllimport) extern
36 #endif /* PD_INTERNAL */
37 #else
38 #define EXTERN extern
39 #endif /* MSW */
40
41     /* and depending on the compiler, hidden data structures are
42     declared differently: */
43 #if defined( __GNUC__) || defined( __BORLANDC__ ) || defined( __MWERKS__ )
44 #define EXTERN_STRUCT struct
45 #else
46 #define EXTERN_STRUCT extern struct
47 #endif
48
49
50 #if !defined(_SIZE_T) && !defined(_SIZE_T_)
51 #include <stddef.h>     /* just for size_t -- how lame! */
52 #endif
53
54 #define MAXPDSTRING 1000        /* use this for anything you want */
55 #define MAXPDARG 5              /* max number of args we can typecheck today */
56
57 /* signed and unsigned integer types the size of a pointer:  */
58 /* GG: long is the size of a pointer */
59 typedef long t_int;
60
61 typedef float t_float;  /* a floating-point number at most the same size */
62 typedef float t_floatarg;  /* floating-point type for function calls */
63
64 typedef struct _symbol
65 {
66     char *s_name;
67     struct _class **s_thing;
68     struct _symbol *s_next;
69 } t_symbol;
70
71 EXTERN_STRUCT _array;
72 #define t_array struct _array       /* g_canvas.h */
73
74 /* pointers to glist and array elements go through a "stub" which sticks
75 around after the glist or array is freed.  The stub itself is deleted when
76 both the glist/array is gone and the refcount is zero, ensuring that no
77 gpointers are pointing here. */
78
79 #define GP_NONE 0       /* the stub points nowhere (has been cut off) */
80 #define GP_GLIST 1      /* the stub points to a glist element */
81 #define GP_ARRAY 2      /* ... or array */
82
83 typedef struct _gstub
84 {
85     union
86     {
87         struct _glist *gs_glist;    /* glist we're in */
88         struct _array *gs_array;    /* array we're in */
89     } gs_un;
90     int gs_which;                   /* GP_GLIST/GP_ARRAY */
91     int gs_refcount;                /* number of gpointers pointing here */
92 } t_gstub;
93
94 typedef struct _gpointer           /* pointer to a gobj in a glist */
95 {
96     union
97     {   
98         struct _scalar *gp_scalar;  /* scalar we're in (if glist) */
99         union word *gp_w;           /* raw data (if array) */
100     } gp_un;
101     int gp_valid;                   /* number which must match gpointee */
102     t_gstub *gp_stub;               /* stub which points to glist/array */
103 } t_gpointer;
104
105 typedef union word
106 {
107     t_float w_float;
108     t_symbol *w_symbol;
109     t_gpointer *w_gpointer;
110     t_array *w_array;
111     struct _glist *w_list;
112     int w_index;
113 } t_word;
114
115 typedef enum
116 {
117     A_NULL,
118     A_FLOAT,
119     A_SYMBOL,
120     A_POINTER,
121     A_SEMI,
122     A_COMMA,
123     A_DEFFLOAT,
124     A_DEFSYM,
125     A_DOLLAR, 
126     A_DOLLSYM,
127     A_GIMME,
128     A_CANT
129 }  t_atomtype;
130
131 #define A_DEFSYMBOL A_DEFSYM    /* better name for this */
132
133 typedef struct _atom
134 {
135     t_atomtype a_type;
136     union word a_w;
137 } t_atom;
138
139 EXTERN_STRUCT _class;
140 #define t_class struct _class
141
142 EXTERN_STRUCT _outlet;
143 #define t_outlet struct _outlet
144
145 EXTERN_STRUCT _inlet;
146 #define t_inlet struct _inlet
147
148 EXTERN_STRUCT _binbuf;
149 #define t_binbuf struct _binbuf
150
151 EXTERN_STRUCT _clock;
152 #define t_clock struct _clock
153
154 EXTERN_STRUCT _outconnect;
155 #define t_outconnect struct _outconnect
156
157 EXTERN_STRUCT _glist;
158 #define t_glist struct _glist
159 #define t_canvas struct _glist  /* LATER lose this */
160
161 typedef t_class *t_pd;      /* pure datum: nothing but a class pointer */
162
163 typedef struct _gobj        /* a graphical object */
164 {
165     t_pd g_pd;              /* pure datum header (class) */
166     struct _gobj *g_next;   /* next in list */
167 } t_gobj;
168
169 typedef struct _scalar      /* a graphical object holding data */
170 {
171     t_gobj sc_gobj;         /* header for graphical object */
172     t_symbol *sc_template;  /* template name (LATER replace with pointer) */
173     t_word sc_vec[1];       /* indeterminate-length array of words */
174 } t_scalar;
175
176 typedef struct _text        /* patchable object - graphical, with text */
177 {
178     t_gobj te_g;                /* header for graphical object */
179     t_binbuf *te_binbuf;        /* holder for the text */
180     t_outlet *te_outlet;        /* linked list of outlets */
181     t_inlet *te_inlet;          /* linked list of inlets */
182     short te_xpix;              /* x&y location (within the toplevel) */
183     short te_ypix;
184     short te_width;             /* requested width in chars, 0 if auto */
185     unsigned int te_type:2;     /* from defs below */
186 } t_text;
187
188 #define T_TEXT 0        /* just a textual comment */
189 #define T_OBJECT 1      /* a MAX style patchable object */
190 #define T_MESSAGE 2     /* a MAX stype message */
191 #define T_ATOM 3        /* a cell to display a number or symbol */
192
193 #define te_pd te_g.g_pd
194
195    /* t_object is synonym for t_text (LATER unify them) */
196
197 typedef struct _text t_object;
198
199 #define ob_outlet te_outlet
200 #define ob_inlet te_inlet
201 #define ob_binbuf te_binbuf
202 #define ob_pd te_g.g_pd
203 #define ob_g te_g
204
205 typedef void (*t_method)(void);
206 typedef void *(*t_newmethod)( void);
207 typedef void (*t_gotfn)(void *x, ...);
208
209 /* ---------------- pre-defined objects and symbols --------------*/
210 EXTERN t_pd pd_objectmaker;     /* factory for creating "object" boxes */
211 EXTERN t_pd pd_canvasmaker;     /* factory for creating canvases */
212 EXTERN t_symbol s_pointer;
213 EXTERN t_symbol s_float;
214 EXTERN t_symbol s_symbol;
215 EXTERN t_symbol s_bang;
216 EXTERN t_symbol s_list;
217 EXTERN t_symbol s_anything;
218 EXTERN t_symbol s_signal;
219 EXTERN t_symbol s__N;
220 EXTERN t_symbol s__X;
221 EXTERN t_symbol s_x;
222 EXTERN t_symbol s_y;
223 EXTERN t_symbol s_;
224
225 /* --------- prototypes from the central message system ----------- */
226 EXTERN void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv);
227 EXTERN void pd_forwardmess(t_pd *x, int argc, t_atom *argv);
228 EXTERN t_symbol *gensym(char *s);
229 EXTERN t_gotfn getfn(t_pd *x, t_symbol *s);
230 EXTERN t_gotfn zgetfn(t_pd *x, t_symbol *s);
231 EXTERN void nullfn(void);
232 EXTERN void pd_vmess(t_pd *x, t_symbol *s, char *fmt, ...);
233 #define mess0(x, s) ((*getfn((x), (s)))((x)))
234 #define mess1(x, s, a) ((*getfn((x), (s)))((x), (a)))
235 #define mess2(x, s, a,b) ((*getfn((x), (s)))((x), (a),(b)))
236 #define mess3(x, s, a,b,c) ((*getfn((x), (s)))((x), (a),(b),(c)))
237 #define mess4(x, s, a,b,c,d) ((*getfn((x), (s)))((x), (a),(b),(c),(d)))
238 #define mess5(x, s, a,b,c,d,e) ((*getfn((x), (s)))((x), (a),(b),(c),(d),(e)))
239 EXTERN void obj_list(t_object *x, t_symbol *s, int argc, t_atom *argv);
240 EXTERN t_pd *pd_newest(void);
241
242 /* --------------- memory management -------------------- */
243 EXTERN void *getbytes(size_t nbytes);
244 EXTERN void *getzbytes(size_t nbytes);
245 EXTERN void *copybytes(void *src, size_t nbytes);
246 EXTERN void freebytes(void *x, size_t nbytes);
247 EXTERN void *resizebytes(void *x, size_t oldsize, size_t newsize);
248
249 /* -------------------- atoms ----------------------------- */
250
251 #define SETSEMI(atom) ((atom)->a_type = A_SEMI, (atom)->a_w.w_index = 0)
252 #define SETCOMMA(atom) ((atom)->a_type = A_COMMA, (atom)->a_w.w_index = 0)
253 #define SETPOINTER(atom, gp) ((atom)->a_type = A_POINTER, \
254     (atom)->a_w.w_gpointer = (gp))
255 #define SETFLOAT(atom, f) ((atom)->a_type = A_FLOAT, (atom)->a_w.w_float = (f))
256 #define SETSYMBOL(atom, s) ((atom)->a_type = A_SYMBOL, \
257     (atom)->a_w.w_symbol = (s))
258 #define SETDOLLAR(atom, n) ((atom)->a_type = A_DOLLAR, \
259     (atom)->a_w.w_index = (n))
260 #define SETDOLLSYM(atom, s) ((atom)->a_type = A_DOLLSYM, \
261     (atom)->a_w.w_symbol= (s))
262
263 EXTERN t_float atom_getfloat(t_atom *a);
264 EXTERN t_int atom_getint(t_atom *a);
265 EXTERN t_symbol *atom_getsymbol(t_atom *a);
266 EXTERN t_symbol *atom_gensym(t_atom *a);
267 EXTERN t_float atom_getfloatarg(int which, int argc, t_atom *argv);
268 EXTERN t_int atom_getintarg(int which, int argc, t_atom *argv);
269 EXTERN t_symbol *atom_getsymbolarg(int which, int argc, t_atom *argv);
270
271 EXTERN void atom_string(t_atom *a, char *buf, unsigned int bufsize);
272
273 /* ------------------  binbufs --------------- */
274
275 EXTERN t_binbuf *binbuf_new(void);
276 EXTERN void binbuf_free(t_binbuf *x);
277 EXTERN t_binbuf *binbuf_duplicate(t_binbuf *y);
278
279 EXTERN void binbuf_text(t_binbuf *x, char *text, size_t size);
280 EXTERN void binbuf_gettext(t_binbuf *x, char **bufp, int *lengthp);
281 EXTERN void binbuf_clear(t_binbuf *x);
282 EXTERN void binbuf_add(t_binbuf *x, int argc, t_atom *argv);
283 EXTERN void binbuf_addv(t_binbuf *x, char *fmt, ...);
284 EXTERN void binbuf_addbinbuf(t_binbuf *x, t_binbuf *y);
285 EXTERN void binbuf_addsemi(t_binbuf *x);
286 EXTERN void binbuf_restore(t_binbuf *x, int argc, t_atom *argv);
287 EXTERN void binbuf_print(t_binbuf *x);
288 EXTERN int binbuf_getnatom(t_binbuf *x);
289 EXTERN t_atom *binbuf_getvec(t_binbuf *x);
290 EXTERN void binbuf_eval(t_binbuf *x, t_pd *target, int argc, t_atom *argv);
291 EXTERN int binbuf_read(t_binbuf *b, char *filename, char *dirname,
292     int crflag);
293 EXTERN int binbuf_read_via_canvas(t_binbuf *b, char *filename, t_canvas *canvas,
294     int crflag);
295 EXTERN int binbuf_read_via_path(t_binbuf *b, char *filename, char *dirname,
296     int crflag);
297 EXTERN int binbuf_write(t_binbuf *x, char *filename, char *dir,
298     int crflag);
299 EXTERN void binbuf_evalfile(t_symbol *name, t_symbol *dir);
300 EXTERN t_symbol *binbuf_realizedollsym(t_symbol *s, int ac, t_atom *av,
301     int tonew);
302
303 /* ------------------  clocks --------------- */
304
305 EXTERN t_clock *clock_new(void *owner, t_method fn);
306 EXTERN void clock_set(t_clock *x, double systime);
307 EXTERN void clock_delay(t_clock *x, double delaytime);
308 EXTERN void clock_unset(t_clock *x);
309 EXTERN double clock_getlogicaltime(void);
310 EXTERN double clock_getsystime(void); /* OBSOLETE; use clock_getlogicaltime() */
311 EXTERN double clock_gettimesince(double prevsystime);
312 EXTERN double clock_getsystimeafter(double delaytime);
313 EXTERN void clock_free(t_clock *x);
314
315 /* ----------------- pure data ---------------- */
316 EXTERN t_pd *pd_new(t_class *cls);
317 EXTERN void pd_free(t_pd *x);
318 EXTERN void pd_bind(t_pd *x, t_symbol *s);
319 EXTERN void pd_unbind(t_pd *x, t_symbol *s);
320 EXTERN t_pd *pd_findbyclass(t_symbol *s, t_class *c);
321 EXTERN void pd_pushsym(t_pd *x);
322 EXTERN void pd_popsym(t_pd *x);
323 #if 0
324 EXTERN t_symbol *pd_getfilename(void);
325 EXTERN t_symbol *pd_getdirname(void);
326 #endif
327 EXTERN void pd_bang(t_pd *x);
328 EXTERN void pd_pointer(t_pd *x, t_gpointer *gp);
329 EXTERN void pd_float(t_pd *x, t_float f);
330 EXTERN void pd_symbol(t_pd *x, t_symbol *s);
331 EXTERN void pd_list(t_pd *x, t_symbol *s, int argc, t_atom *argv);
332 #if 0
333 EXTERN void pd_anything(t_pd *x, t_symbol *s, int argc, t_atom *argv);
334 #endif
335 #define pd_class(x) (*(x))
336
337 /* ----------------- pointers ---------------- */
338 EXTERN void gpointer_init(t_gpointer *gp);
339 EXTERN void gpointer_copy(const t_gpointer *gpfrom, t_gpointer *gpto);
340 EXTERN void gpointer_unset(t_gpointer *gp);
341 EXTERN int gpointer_check(const t_gpointer *gp, int headok);
342
343 /* ----------------- patchable "objects" -------------- */
344 EXTERN t_inlet *inlet_new(t_object *owner, t_pd *dest, t_symbol *s1,
345     t_symbol *s2);
346 EXTERN t_inlet *pointerinlet_new(t_object *owner, t_gpointer *gp);
347 EXTERN t_inlet *floatinlet_new(t_object *owner, t_float *fp);
348 EXTERN t_inlet *symbolinlet_new(t_object *owner, t_symbol **sp);
349 EXTERN t_inlet *signalinlet_new(t_object *owner, t_float f);
350 EXTERN void inlet_free(t_inlet *x);
351
352 EXTERN t_outlet *outlet_new(t_object *owner, t_symbol *s);
353 EXTERN void outlet_bang(t_outlet *x);
354 EXTERN void outlet_pointer(t_outlet *x, t_gpointer *gp);
355 EXTERN void outlet_float(t_outlet *x, t_float f);
356 EXTERN void outlet_symbol(t_outlet *x, t_symbol *s);
357 EXTERN void outlet_list(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
358 EXTERN void outlet_anything(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
359 EXTERN t_symbol *outlet_getsymbol(t_outlet *x);
360 EXTERN void outlet_free(t_outlet *x);
361 EXTERN t_object *pd_checkobject(t_pd *x);
362
363
364 /* -------------------- canvases -------------- */
365
366 EXTERN void glob_setfilename(void *dummy, t_symbol *name, t_symbol *dir);
367
368 EXTERN void canvas_setargs(int argc, t_atom *argv);
369 EXTERN void canvas_getargs(int *argcp, t_atom **argvp);
370 EXTERN t_symbol *canvas_getcurrentdir(void);
371 EXTERN t_glist *canvas_getcurrent(void);
372 EXTERN void canvas_makefilename(t_glist *c, char *file,
373     char *result,int resultsize);
374 EXTERN t_symbol *canvas_getdir(t_glist *x);
375 EXTERN int sys_fontwidth(int fontsize);
376 EXTERN int sys_fontheight(int fontsize);
377 EXTERN void canvas_dataproperties(t_glist *x, t_scalar *sc, t_binbuf *b);
378 EXTERN int canvas_open(t_canvas *x, const char *name, const char *ext,
379     char *dirresult, char **nameresult, unsigned int size, int bin);
380
381 /* ---------------- widget behaviors ---------------------- */
382
383 EXTERN_STRUCT _widgetbehavior;
384 #define t_widgetbehavior struct _widgetbehavior
385
386 EXTERN_STRUCT _parentwidgetbehavior;
387 #define t_parentwidgetbehavior struct _parentwidgetbehavior
388 EXTERN t_parentwidgetbehavior *pd_getparentwidget(t_pd *x);
389
390 /* -------------------- classes -------------- */
391
392 #define CLASS_DEFAULT 0         /* flags for new classes below */
393 #define CLASS_PD 1
394 #define CLASS_GOBJ 2
395 #define CLASS_PATCHABLE 3
396 #define CLASS_NOINLET 8
397
398 #define CLASS_TYPEMASK 3
399
400
401 EXTERN t_class *class_new(t_symbol *name, t_newmethod newmethod,
402     t_method freemethod, size_t size, int flags, t_atomtype arg1, ...);
403 EXTERN void class_addcreator(t_newmethod newmethod, t_symbol *s, 
404     t_atomtype type1, ...);
405 EXTERN void class_addmethod(t_class *c, t_method fn, t_symbol *sel,
406     t_atomtype arg1, ...);
407 EXTERN void class_addbang(t_class *c, t_method fn);
408 EXTERN void class_addpointer(t_class *c, t_method fn);
409 EXTERN void class_doaddfloat(t_class *c, t_method fn);
410 EXTERN void class_addsymbol(t_class *c, t_method fn);
411 EXTERN void class_addlist(t_class *c, t_method fn);
412 EXTERN void class_addanything(t_class *c, t_method fn);
413 EXTERN void class_sethelpsymbol(t_class *c, t_symbol *s);
414 EXTERN void class_setwidget(t_class *c, t_widgetbehavior *w);
415 EXTERN void class_setparentwidget(t_class *c, t_parentwidgetbehavior *w);
416 #if 0
417 EXTERN t_parentwidgetbehavior *class_parentwidget(t_class *c);
418 #endif
419 EXTERN char *class_getname(t_class *c);
420 EXTERN char *class_gethelpname(t_class *c);
421 EXTERN void class_setdrawcommand(t_class *c);
422 EXTERN int class_isdrawcommand(t_class *c);
423 EXTERN void class_domainsignalin(t_class *c, int onset);
424 #define CLASS_MAINSIGNALIN(c, type, field) \
425     class_domainsignalin(c, (char *)(&((type *)0)->field) - (char *)0)
426
427          /* prototype for functions to save Pd's to a binbuf */
428 typedef void (*t_savefn)(t_gobj *x, t_binbuf *b);
429 EXTERN void class_setsavefn(t_class *c, t_savefn f);
430 EXTERN t_savefn class_getsavefn(t_class *c);
431         /* prototype for functions to open properties dialogs */
432 typedef void (*t_propertiesfn)(t_gobj *x, struct _glist *glist);
433 EXTERN void class_setpropertiesfn(t_class *c, t_propertiesfn f);
434 EXTERN t_propertiesfn class_getpropertiesfn(t_class *c);
435
436 #ifndef PD_CLASS_DEF
437 #define class_addbang(x, y) class_addbang((x), (t_method)(y))
438 #define class_addpointer(x, y) class_addpointer((x), (t_method)(y))
439 #define class_addfloat(x, y) class_doaddfloat((x), (t_method)(y))
440 #define class_addsymbol(x, y) class_addsymbol((x), (t_method)(y))
441 #define class_addlist(x, y) class_addlist((x), (t_method)(y))
442 #define class_addanything(x, y) class_addanything((x), (t_method)(y))
443 #endif
444
445 /* ------------   printing --------------------------------- */
446 EXTERN void post(const char *fmt, ...);
447 EXTERN void startpost(const char *fmt, ...);
448 EXTERN void poststring(const char *s);
449 EXTERN void postfloat(float f);
450 EXTERN void postatom(int argc, t_atom *argv);
451 EXTERN void endpost(void);
452 EXTERN void error(const char *fmt, ...);
453 EXTERN void verbose(int level, const char *fmt, ...);
454 EXTERN void bug(const char *fmt, ...);
455 EXTERN void pd_error(void *object, const char *fmt, ...);
456 EXTERN void sys_logerror(const char *object, const char *s);
457 EXTERN void sys_unixerror(const char *object);
458 EXTERN void sys_ouch(void);
459
460
461 /* ------------  system interface routines ------------------- */
462 #if 0
463 EXTERN int sys_isreadablefile(const char *name);
464 #endif
465 EXTERN void sys_bashfilename(const char *from, char *to);
466 EXTERN void sys_unbashfilename(const char *from, char *to);
467 EXTERN int open_via_path(const char *name, const char *ext, const char *dir,
468     char *dirresult, char **nameresult, unsigned int size, int bin);
469 EXTERN int sched_geteventno(void);
470 EXTERN double sys_getrealtime(void);
471 EXTERN int (*sys_idlehook)(void);   /* hook to add idle time computation */
472
473
474 /* ------------  threading ------------------- */ 
475 EXTERN void sys_lock(void);
476 EXTERN void sys_unlock(void);
477 EXTERN int sys_trylock(void);
478
479
480 /* --------------- signals ----------------------------------- */
481
482 typedef float t_sample;
483 #define MAXLOGSIG 32
484 #define MAXSIGSIZE (1 << MAXLOGSIG)
485
486 typedef struct _signal
487 {
488     int s_n;            /* number of points in the array */
489     t_sample *s_vec;    /* the array */
490     float s_sr;         /* sample rate */
491     int s_refcount;     /* number of times used */
492     int s_isborrowed;   /* whether we're going to borrow our array */
493     struct _signal *s_borrowedfrom;     /* signal to borrow it from */
494     struct _signal *s_nextfree;         /* next in freelist */
495     struct _signal *s_nextused;         /* next in used list */
496     int s_vecsize;      /* allocated size of array in points */
497 } t_signal;
498
499 typedef t_int *(*t_perfroutine)(t_int *args);
500
501 EXTERN t_int *plus_perform(t_int *args);
502 EXTERN t_int *zero_perform(t_int *args);
503 EXTERN t_int *copy_perform(t_int *args);
504
505 EXTERN void dsp_add_plus(t_sample *in1, t_sample *in2, t_sample *out, int n);
506 EXTERN void dsp_add_copy(t_sample *in, t_sample *out, int n);
507 EXTERN void dsp_add_scalarcopy(t_sample *in, t_sample *out, int n);
508 EXTERN void dsp_add_zero(t_sample *out, int n);
509
510 EXTERN int sys_getblksize(void);
511 EXTERN float sys_getsr(void);
512 EXTERN int sys_get_inchannels(void);
513 EXTERN int sys_get_outchannels(void);
514
515 EXTERN void dsp_add(t_perfroutine f, int n, ...);
516 EXTERN void dsp_addv(t_perfroutine f, int n, t_int *vec);
517 EXTERN void pd_fft(float *buf, int npoints, int inverse);
518 EXTERN int ilog2(int n);
519
520 EXTERN void mayer_fht(float *fz, int n);
521 EXTERN void mayer_fft(int n, float *real, float *imag);
522 EXTERN void mayer_ifft(int n, float *real, float *imag);
523 EXTERN void mayer_realfft(int n, float *real);
524 EXTERN void mayer_realifft(int n, float *real);
525
526 EXTERN float *cos_table;
527 #define LOGCOSTABSIZE 9
528 #define COSTABSIZE (1<<LOGCOSTABSIZE)
529
530 EXTERN int canvas_suspend_dsp(void);
531 EXTERN void canvas_resume_dsp(int oldstate);
532 EXTERN void canvas_update_dsp(void);
533 EXTERN int canvas_dspstate;
534
535 /*   up/downsampling */
536 typedef struct _resample
537 {
538   int method;       /* up/downsampling method ID */
539
540   t_int downsample; /* downsampling factor */
541   t_int upsample;   /* upsampling factor */
542
543   t_float *s_vec;   /* here we hold the resampled data */
544   int      s_n;
545
546   t_float *coeffs;  /* coefficients for filtering... */
547   int      coefsize;
548
549   t_float *buffer;  /* buffer for filtering */
550   int      bufsize;
551 } t_resample;
552
553 EXTERN void resample_init(t_resample *x);
554 EXTERN void resample_free(t_resample *x);
555
556 EXTERN void resample_dsp(t_resample *x, t_sample *in, int insize, t_sample *out, int outsize, int method);
557 EXTERN void resamplefrom_dsp(t_resample *x, t_sample *in, int insize, int outsize, int method);
558 EXTERN void resampleto_dsp(t_resample *x, t_sample *out, int insize, int outsize, int method);
559
560 /* ----------------------- utility functions for signals -------------- */
561 EXTERN float mtof(float);
562 EXTERN float ftom(float);
563 EXTERN float rmstodb(float);
564 EXTERN float powtodb(float);
565 EXTERN float dbtorms(float);
566 EXTERN float dbtopow(float);
567
568 EXTERN float q8_sqrt(float);
569 EXTERN float q8_rsqrt(float);
570 #ifndef N32     
571 EXTERN float qsqrt(float);  /* old names kept for extern compatibility */
572 EXTERN float qrsqrt(float);
573 #endif
574 /* --------------------- data --------------------------------- */
575
576     /* graphical arrays */
577 EXTERN_STRUCT _garray;
578 #define t_garray struct _garray
579
580 EXTERN t_class *garray_class;
581 EXTERN int garray_getfloatarray(t_garray *x, int *size, t_float **vec);
582 #if 0
583 EXTERN float garray_get(t_garray *x, t_symbol *s, t_int indx);
584 #endif
585 EXTERN void garray_redraw(t_garray *x);
586 EXTERN int garray_npoints(t_garray *x);
587 EXTERN char *garray_vec(t_garray *x);
588 EXTERN void garray_resize(t_garray *x, t_floatarg f);
589 EXTERN void garray_usedindsp(t_garray *x);
590 EXTERN void garray_setsaveit(t_garray *x, int saveit);
591 EXTERN t_class *scalar_class;
592
593 EXTERN t_float *value_get(t_symbol *s);
594 EXTERN void value_release(t_symbol *s);
595 EXTERN int value_getfloat(t_symbol *s, t_float *f);
596 EXTERN int value_setfloat(t_symbol *s, t_float f);
597
598 /* ------- GUI interface - functions to send strings to TK --------- */
599 typedef void (*t_guicallbackfn)(t_gobj *client, t_glist *glist);
600
601 EXTERN void sys_vgui(char *fmt, ...);
602 EXTERN void sys_gui(char *s);
603 EXTERN void sys_pretendguibytes(int n);
604 EXTERN void sys_queuegui(void *client, t_glist *glist, t_guicallbackfn f);
605 EXTERN void sys_unqueuegui(void *client);
606     /* dialog window creation and destruction */
607 EXTERN void gfxstub_new(t_pd *owner, void *key, const char *cmd);
608 EXTERN void gfxstub_deleteforkey(void *key);
609
610 extern t_class *glob_pdobject;  /* object to send "pd" messages */
611
612 /*-------------  Max 0.26 compatibility --------------------*/
613
614 /* the following reflects the new way classes are laid out, with the class
615    pointing to the messlist and not vice versa. Externs shouldn't feel it. */
616 typedef t_class *t_externclass;
617
618 #if 0
619 EXTERN void c_extern(t_externclass *cls, t_newmethod newroutine,
620     t_method freeroutine, t_symbol *name, size_t size, int tiny, \
621     t_atomtype arg1, ...);
622 EXTERN void c_addmess(t_method fn, t_symbol *sel, t_atomtype arg1, ...);
623 #endif
624
625 #define t_getbytes getbytes
626 #define t_freebytes freebytes
627 #define t_resizebytes resizebytes
628 #define typedmess pd_typedmess
629 #define vmess pd_vmess
630
631 /* A definition to help gui objects straddle 0.34-0.35 changes.  If this is
632 defined, there is a "te_xpix" field in objects, not a "te_xpos" as before: */
633
634 #define PD_USE_TE_XPIX
635
636
637 #ifdef __i386__
638 /* a test for NANs and denormals.  Should only be necessary on i386. */
639 #define PD_BADFLOAT(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \
640     (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000))
641 /* more stringent test: anything not between 1e-19 and 1e19 in absolute val */
642 #define PD_BIGORSMALL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \
643     (((*(unsigned int*)&(f))&0x60000000)==0x60000000))
644 #else
645 #define PD_BADFLOAT(f) 0
646 #define PD_BIGORSMALL(f) 0
647 #endif
648
649 #if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
650 }
651 #endif
652
653 #define __m_pd_h_
654 #endif /* __m_pd_h_ */