m_pd.h 27.6 KB
Newer Older
Miller Puckette's avatar
Miller Puckette committed
1
2
3
4
5
6
7
8
9
10
/* Copyright (c) 1997-1999 Miller Puckette.
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.  */

#ifndef __m_pd_h_

#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
extern "C" {
#endif

11
12
#include <stdarg.h>

Miller Puckette's avatar
Miller Puckette committed
13
#define PD_MAJOR_VERSION 0
14
#define PD_MINOR_VERSION 42
15
#define PD_BUGFIX_VERSION 7
16
#define PD_TEST_VERSION "20140903"
17
#define PDL2ORK
Miller Puckette's avatar
Miller Puckette committed
18
19
20
21
22
23
24
25
26
27
28
29
30

/* old name for "MSW" flag -- we have to take it for the sake of many old
"nmakefiles" for externs, which will define NT and not MSW */
#if defined(NT) && !defined(MSW)
#define MSW
#endif

/* These pragmas are only used for MSVC, not MinGW or Cygwin <hans@at.or.at> */
#ifdef _MSC_VER
/* #pragma warning( disable : 4091 ) */
#pragma warning( disable : 4305 )  /* uncast const double to float */
#pragma warning( disable : 4244 )  /* uncast float/int conversion etc. */
#pragma warning( disable : 4101 )  /* unused automatic variables */
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
31
32
/* not using GNU C, __attribute__ means nothing */
#  define  __attribute__(x)
Miller Puckette's avatar
Miller Puckette committed
33
34
#endif /* _MSC_VER */

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
35

Miller Puckette's avatar
Miller Puckette committed
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    /* the external storage class is "extern" in UNIX; in MSW it's ugly. */
#ifdef MSW
#ifdef PD_INTERNAL
#define EXTERN __declspec(dllexport) extern
#else
#define EXTERN __declspec(dllimport) extern
#endif /* PD_INTERNAL */
#else
#define EXTERN extern
#endif /* MSW */

    /* and depending on the compiler, hidden data structures are
    declared differently: */
#if defined( __GNUC__) || defined( __BORLANDC__ ) || defined( __MWERKS__ )
#define EXTERN_STRUCT struct
#else
#define EXTERN_STRUCT extern struct
#endif

55
56
57
58
59
60
    /* Define some attributes, specific to the compiler */
#if defined(__GNUC__)
#define ATTRIBUTE_FORMAT_PRINTF(a, b) __attribute__ ((format (printf, a, b)))
#else
#define ATTRIBUTE_FORMAT_PRINTF(a, b)
#endif
Miller Puckette's avatar
Miller Puckette committed
61
62
63
64
65

#if !defined(_SIZE_T) && !defined(_SIZE_T_)
#include <stddef.h>     /* just for size_t -- how lame! */
#endif

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
66
#define MAXPDSTRING 1000        /* must be >= FILENAME_MAX */
Miller Puckette's avatar
Miller Puckette committed
67
68
69
#define MAXPDARG 5              /* max number of args we can typecheck today */

/* signed and unsigned integer types the size of a pointer:  */
70
71
72
73
74
75
76
77
78
#if !defined(PD_LONGINTTYPE)
#define PD_LONGINTTYPE long
#endif
#if !defined(PD_FLOATTYPE)
#define PD_FLOATTYPE float
#endif
typedef PD_LONGINTTYPE t_int;       /* pointer-size integer */
typedef PD_FLOATTYPE t_float;       /* a float type at most the same size */
typedef PD_FLOATTYPE t_floatarg;    /* float type for function calls */
Miller Puckette's avatar
Miller Puckette committed
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113

typedef struct _symbol
{
    char *s_name;
    struct _class **s_thing;
    struct _symbol *s_next;
} t_symbol;

EXTERN_STRUCT _array;
#define t_array struct _array       /* g_canvas.h */

/* pointers to glist and array elements go through a "stub" which sticks
around after the glist or array is freed.  The stub itself is deleted when
both the glist/array is gone and the refcount is zero, ensuring that no
gpointers are pointing here. */

#define GP_NONE 0       /* the stub points nowhere (has been cut off) */
#define GP_GLIST 1      /* the stub points to a glist element */
#define GP_ARRAY 2      /* ... or array */

typedef struct _gstub
{
    union
    {
        struct _glist *gs_glist;    /* glist we're in */
        struct _array *gs_array;    /* array we're in */
    } gs_un;
    int gs_which;                   /* GP_GLIST/GP_ARRAY */
    int gs_refcount;                /* number of gpointers pointing here */
} t_gstub;

typedef struct _gpointer           /* pointer to a gobj in a glist */
{
    union
    {   
114
115
        struct _gobj *gp_gobj;      /* header for the t_text or
                                       scalar we're in (if glist) */
Miller Puckette's avatar
Miller Puckette committed
116
117
118
119
120
121
        union word *gp_w;           /* raw data (if array) */
    } gp_un;
    int gp_valid;                   /* number which must match gpointee */
    t_gstub *gp_stub;               /* stub which points to glist/array */
} t_gpointer;

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
122
123
124
125
126
127
128
129
130
131
#define PD_BLOBS 1 /* MP20070211 Use this to test for blob capability */
/* MP20061223 blob type: */
typedef struct _blob /* pointer to a blob */
{
   unsigned long s_length; /* length of blob in bytes */
   unsigned char *s_data; /* pointer to 1st byte of blob */
} t_blob;
/* ...MP20061223 blob type */


Miller Puckette's avatar
Miller Puckette committed
132
133
134
135
136
137
138
139
typedef union word
{
    t_float w_float;
    t_symbol *w_symbol;
    t_gpointer *w_gpointer;
    t_array *w_array;
    struct _glist *w_list;
    int w_index;
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
140
    t_blob *w_blob; /* MP20061223 blob type */
Miller Puckette's avatar
Miller Puckette committed
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
} t_word;

typedef enum
{
    A_NULL,
    A_FLOAT,
    A_SYMBOL,
    A_POINTER,
    A_SEMI,
    A_COMMA,
    A_DEFFLOAT,
    A_DEFSYM,
    A_DOLLAR, 
    A_DOLLSYM,
    A_GIMME,
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
156
157
    A_CANT,
    A_BLOB /* MP20061223 blob type */
Miller Puckette's avatar
Miller Puckette committed
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
}  t_atomtype;

#define A_DEFSYMBOL A_DEFSYM    /* better name for this */

typedef struct _atom
{
    t_atomtype a_type;
    union word a_w;
} t_atom;

EXTERN_STRUCT _class;
#define t_class struct _class

EXTERN_STRUCT _outlet;
#define t_outlet struct _outlet

EXTERN_STRUCT _inlet;
#define t_inlet struct _inlet

EXTERN_STRUCT _binbuf;
#define t_binbuf struct _binbuf

EXTERN_STRUCT _clock;
#define t_clock struct _clock

EXTERN_STRUCT _outconnect;
#define t_outconnect struct _outconnect

EXTERN_STRUCT _glist;
#define t_glist struct _glist
#define t_canvas struct _glist  /* LATER lose this */

typedef t_class *t_pd;      /* pure datum: nothing but a class pointer */

typedef struct _gobj        /* a graphical object */
{
    t_pd g_pd;              /* pure datum header (class) */
    struct _gobj *g_next;   /* next in list */
} t_gobj;

typedef struct _scalar      /* a graphical object holding data */
{
    t_gobj sc_gobj;         /* header for graphical object */
    t_symbol *sc_template;  /* template name (LATER replace with pointer) */
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
    int sc_x1;              /* cached bbox... which is already in the */
    int sc_x2;              /* GUI. Doing this right would require me */
    int sc_y1;              /* to redesign the whole program. Instead */
    int sc_y2;              /* please enjoy the duplication of a bbox */
    int sc_bboxcache;       /* caching mechanism already in tkpath.   */
    t_glist *sc_selected;   /* I'm really sorry... I can't figure out
                               a non-stupid and non-hacky way to make
                               scalars in a gop patch displace right.
                               Pd Vanilla just redraws all of the gop
                               contents-- dumb. Here I keep the owner
                               glist handy so I can compare it to the
                               glist in scalar_displace_withtag. Then
                               if they don't match it's a gop, so the
                               x/y fields do not need to get updated.
                               That's dumb, too, but slightly less so
                               which is another way to say "progress" */
Miller Puckette's avatar
Miller Puckette committed
218
219
220
221
222
223
224
225
226
227
228
229
230
    t_word sc_vec[1];       /* indeterminate-length array of words */
} t_scalar;

typedef struct _text        /* patchable object - graphical, with text */
{
    t_gobj te_g;                /* header for graphical object */
    t_binbuf *te_binbuf;        /* holder for the text */
    t_outlet *te_outlet;        /* linked list of outlets */
    t_inlet *te_inlet;          /* linked list of inlets */
    short te_xpix;              /* x&y location (within the toplevel) */
    short te_ypix;
    short te_width;             /* requested width in chars, 0 if auto */
    unsigned int te_type:2;     /* from defs below */
231
	unsigned int te_iemgui:1;	/* if this is an iemgui (for nlets color) */
Miller Puckette's avatar
Miller Puckette committed
232
233
234
235
} t_text;

#define T_TEXT 0        /* just a textual comment */
#define T_OBJECT 1      /* a MAX style patchable object */
236
#define T_MESSAGE 2     /* a MAX style message */
Miller Puckette's avatar
Miller Puckette committed
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
#define T_ATOM 3        /* a cell to display a number or symbol */

#define te_pd te_g.g_pd

   /* t_object is synonym for t_text (LATER unify them) */

typedef struct _text t_object;

#define ob_outlet te_outlet
#define ob_inlet te_inlet
#define ob_binbuf te_binbuf
#define ob_pd te_g.g_pd
#define ob_g te_g

typedef void (*t_method)(void);
typedef void *(*t_newmethod)( void);
typedef void (*t_gotfn)(void *x, ...);

/* ---------------- pre-defined objects and symbols --------------*/
EXTERN t_pd pd_objectmaker;     /* factory for creating "object" boxes */
EXTERN t_pd pd_canvasmaker;     /* factory for creating canvases */
EXTERN t_symbol s_pointer;
EXTERN t_symbol s_float;
EXTERN t_symbol s_symbol;
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
261
EXTERN t_symbol s_blob;
Miller Puckette's avatar
Miller Puckette committed
262
263
264
265
266
267
268
269
270
271
272
273
274
EXTERN t_symbol s_bang;
EXTERN t_symbol s_list;
EXTERN t_symbol s_anything;
EXTERN t_symbol s_signal;
EXTERN t_symbol s__N;
EXTERN t_symbol s__X;
EXTERN t_symbol s_x;
EXTERN t_symbol s_y;
EXTERN t_symbol s_;

/* --------- prototypes from the central message system ----------- */
EXTERN void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv);
EXTERN void pd_forwardmess(t_pd *x, int argc, t_atom *argv);
Miller Puckette's avatar
Miller Puckette committed
275
EXTERN t_symbol *gensym(const char *s);
Miller Puckette's avatar
Miller Puckette committed
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
EXTERN t_gotfn getfn(t_pd *x, t_symbol *s);
EXTERN t_gotfn zgetfn(t_pd *x, t_symbol *s);
EXTERN void nullfn(void);
EXTERN void pd_vmess(t_pd *x, t_symbol *s, char *fmt, ...);
#define mess0(x, s) ((*getfn((x), (s)))((x)))
#define mess1(x, s, a) ((*getfn((x), (s)))((x), (a)))
#define mess2(x, s, a,b) ((*getfn((x), (s)))((x), (a),(b)))
#define mess3(x, s, a,b,c) ((*getfn((x), (s)))((x), (a),(b),(c)))
#define mess4(x, s, a,b,c,d) ((*getfn((x), (s)))((x), (a),(b),(c),(d)))
#define mess5(x, s, a,b,c,d,e) ((*getfn((x), (s)))((x), (a),(b),(c),(d),(e)))
EXTERN void obj_list(t_object *x, t_symbol *s, int argc, t_atom *argv);
EXTERN t_pd *pd_newest(void);

/* --------------- memory management -------------------- */
EXTERN void *getbytes(size_t nbytes);
EXTERN void *getzbytes(size_t nbytes);
EXTERN void *copybytes(void *src, size_t nbytes);
EXTERN void freebytes(void *x, size_t nbytes);
EXTERN void *resizebytes(void *x, size_t oldsize, size_t newsize);

/* -------------------- atoms ----------------------------- */

#define SETSEMI(atom) ((atom)->a_type = A_SEMI, (atom)->a_w.w_index = 0)
#define SETCOMMA(atom) ((atom)->a_type = A_COMMA, (atom)->a_w.w_index = 0)
#define SETPOINTER(atom, gp) ((atom)->a_type = A_POINTER, \
    (atom)->a_w.w_gpointer = (gp))
#define SETFLOAT(atom, f) ((atom)->a_type = A_FLOAT, (atom)->a_w.w_float = (f))
#define SETSYMBOL(atom, s) ((atom)->a_type = A_SYMBOL, \
    (atom)->a_w.w_symbol = (s))
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
305
#define SETBLOB(atom, st) ((atom)->a_type = A_BLOB, (atom)->a_w.w_blob = (st)) /* MP 20061226 blob type */
Miller Puckette's avatar
Miller Puckette committed
306
307
308
309
310
311
312
313
#define SETDOLLAR(atom, n) ((atom)->a_type = A_DOLLAR, \
    (atom)->a_w.w_index = (n))
#define SETDOLLSYM(atom, s) ((atom)->a_type = A_DOLLSYM, \
    (atom)->a_w.w_symbol= (s))

EXTERN t_float atom_getfloat(t_atom *a);
EXTERN t_int atom_getint(t_atom *a);
EXTERN t_symbol *atom_getsymbol(t_atom *a);
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
314
EXTERN t_blob *atom_getblob(t_atom *a);/* MP 20070108 blob type */
Miller Puckette's avatar
Miller Puckette committed
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
EXTERN t_symbol *atom_gensym(t_atom *a);
EXTERN t_float atom_getfloatarg(int which, int argc, t_atom *argv);
EXTERN t_int atom_getintarg(int which, int argc, t_atom *argv);
EXTERN t_symbol *atom_getsymbolarg(int which, int argc, t_atom *argv);

EXTERN void atom_string(t_atom *a, char *buf, unsigned int bufsize);

/* ------------------  binbufs --------------- */

EXTERN t_binbuf *binbuf_new(void);
EXTERN void binbuf_free(t_binbuf *x);
EXTERN t_binbuf *binbuf_duplicate(t_binbuf *y);

EXTERN void binbuf_text(t_binbuf *x, char *text, size_t size);
EXTERN void binbuf_gettext(t_binbuf *x, char **bufp, int *lengthp);
EXTERN void binbuf_clear(t_binbuf *x);
EXTERN void binbuf_add(t_binbuf *x, int argc, t_atom *argv);
EXTERN void binbuf_addv(t_binbuf *x, char *fmt, ...);
EXTERN void binbuf_addbinbuf(t_binbuf *x, t_binbuf *y);
EXTERN void binbuf_addsemi(t_binbuf *x);
EXTERN void binbuf_restore(t_binbuf *x, int argc, t_atom *argv);
EXTERN void binbuf_print(t_binbuf *x);
EXTERN int binbuf_getnatom(t_binbuf *x);
EXTERN t_atom *binbuf_getvec(t_binbuf *x);
EXTERN void binbuf_eval(t_binbuf *x, t_pd *target, int argc, t_atom *argv);
EXTERN int binbuf_read(t_binbuf *b, char *filename, char *dirname,
    int crflag);
EXTERN int binbuf_read_via_canvas(t_binbuf *b, char *filename, t_canvas *canvas,
    int crflag);
EXTERN int binbuf_read_via_path(t_binbuf *b, char *filename, char *dirname,
    int crflag);
EXTERN int binbuf_write(t_binbuf *x, char *filename, char *dir,
    int crflag);
EXTERN void binbuf_evalfile(t_symbol *name, t_symbol *dir);
EXTERN t_symbol *binbuf_realizedollsym(t_symbol *s, int ac, t_atom *av,
    int tonew);

/* ------------------  clocks --------------- */

EXTERN t_clock *clock_new(void *owner, t_method fn);
EXTERN void clock_set(t_clock *x, double systime);
EXTERN void clock_delay(t_clock *x, double delaytime);
EXTERN void clock_unset(t_clock *x);
EXTERN double clock_getlogicaltime(void);
EXTERN double clock_getsystime(void); /* OBSOLETE; use clock_getlogicaltime() */
EXTERN double clock_gettimesince(double prevsystime);
EXTERN double clock_getsystimeafter(double delaytime);
EXTERN void clock_free(t_clock *x);

/* ----------------- pure data ---------------- */
EXTERN t_pd *pd_new(t_class *cls);
EXTERN void pd_free(t_pd *x);
EXTERN void pd_bind(t_pd *x, t_symbol *s);
EXTERN void pd_unbind(t_pd *x, t_symbol *s);
EXTERN t_pd *pd_findbyclass(t_symbol *s, t_class *c);
EXTERN void pd_pushsym(t_pd *x);
EXTERN void pd_popsym(t_pd *x);
EXTERN t_symbol *pd_getfilename(void);
EXTERN t_symbol *pd_getdirname(void);
EXTERN void pd_bang(t_pd *x);
EXTERN void pd_pointer(t_pd *x, t_gpointer *gp);
EXTERN void pd_float(t_pd *x, t_float f);
EXTERN void pd_symbol(t_pd *x, t_symbol *s);
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
378
EXTERN void pd_blob(t_pd *x, t_blob *st); /* MP 20061226 blob type */
Miller Puckette's avatar
Miller Puckette committed
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
EXTERN void pd_list(t_pd *x, t_symbol *s, int argc, t_atom *argv);
EXTERN void pd_anything(t_pd *x, t_symbol *s, int argc, t_atom *argv);
#define pd_class(x) (*(x))

/* ----------------- pointers ---------------- */
EXTERN void gpointer_init(t_gpointer *gp);
EXTERN void gpointer_copy(const t_gpointer *gpfrom, t_gpointer *gpto);
EXTERN void gpointer_unset(t_gpointer *gp);
EXTERN int gpointer_check(const t_gpointer *gp, int headok);

/* ----------------- patchable "objects" -------------- */
EXTERN t_inlet *inlet_new(t_object *owner, t_pd *dest, t_symbol *s1,
    t_symbol *s2);
EXTERN t_inlet *pointerinlet_new(t_object *owner, t_gpointer *gp);
EXTERN t_inlet *floatinlet_new(t_object *owner, t_float *fp);
EXTERN t_inlet *symbolinlet_new(t_object *owner, t_symbol **sp);
EXTERN t_inlet *signalinlet_new(t_object *owner, t_float f);
EXTERN void inlet_free(t_inlet *x);

EXTERN t_outlet *outlet_new(t_object *owner, t_symbol *s);
EXTERN void outlet_bang(t_outlet *x);
EXTERN void outlet_pointer(t_outlet *x, t_gpointer *gp);
EXTERN void outlet_float(t_outlet *x, t_float f);
EXTERN void outlet_symbol(t_outlet *x, t_symbol *s);
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
403
EXTERN void outlet_blob(t_outlet *x, t_blob *st); /* MP 20061226 blob type */
Miller Puckette's avatar
Miller Puckette committed
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
EXTERN void outlet_list(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
EXTERN void outlet_anything(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
EXTERN t_symbol *outlet_getsymbol(t_outlet *x);
EXTERN void outlet_free(t_outlet *x);
EXTERN t_object *pd_checkobject(t_pd *x);


/* -------------------- canvases -------------- */

EXTERN void glob_setfilename(void *dummy, t_symbol *name, t_symbol *dir);

EXTERN void canvas_setargs(int argc, t_atom *argv);
EXTERN void canvas_getargs(int *argcp, t_atom **argvp);
EXTERN t_symbol *canvas_getcurrentdir(void);
EXTERN t_glist *canvas_getcurrent(void);
EXTERN void canvas_makefilename(t_glist *c, char *file,
    char *result,int resultsize);
EXTERN t_symbol *canvas_getdir(t_glist *x);
Miller Puckette's avatar
Miller Puckette committed
422
423
EXTERN char sys_font[]; /* default typeface set in s_main.c */
EXTERN char sys_fontweight[]; /* default font weight set in s_main.c */
Miller Puckette's avatar
Miller Puckette committed
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
EXTERN int sys_fontwidth(int fontsize);
EXTERN int sys_fontheight(int fontsize);
EXTERN void canvas_dataproperties(t_glist *x, t_scalar *sc, t_binbuf *b);
EXTERN int canvas_open(t_canvas *x, const char *name, const char *ext,
    char *dirresult, char **nameresult, unsigned int size, int bin);

/* ---------------- widget behaviors ---------------------- */

EXTERN_STRUCT _widgetbehavior;
#define t_widgetbehavior struct _widgetbehavior

EXTERN_STRUCT _parentwidgetbehavior;
#define t_parentwidgetbehavior struct _parentwidgetbehavior
EXTERN t_parentwidgetbehavior *pd_getparentwidget(t_pd *x);

/* -------------------- classes -------------- */

#define CLASS_DEFAULT 0         /* flags for new classes below */
#define CLASS_PD 1
#define CLASS_GOBJ 2
#define CLASS_PATCHABLE 3
#define CLASS_NOINLET 8

#define CLASS_TYPEMASK 3


EXTERN t_class *class_new(t_symbol *name, t_newmethod newmethod,
    t_method freemethod, size_t size, int flags, t_atomtype arg1, ...);
EXTERN void class_addcreator(t_newmethod newmethod, t_symbol *s, 
    t_atomtype type1, ...);
EXTERN void class_addmethod(t_class *c, t_method fn, t_symbol *sel,
    t_atomtype arg1, ...);
EXTERN void class_addbang(t_class *c, t_method fn);
EXTERN void class_addpointer(t_class *c, t_method fn);
EXTERN void class_doaddfloat(t_class *c, t_method fn);
EXTERN void class_addsymbol(t_class *c, t_method fn);
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
460
EXTERN void class_addblob(t_class *c, t_method fn);/* MP 20061226 blob type */
Miller Puckette's avatar
Miller Puckette committed
461
462
463
464
465
466
467
468
469
470
471
EXTERN void class_addlist(t_class *c, t_method fn);
EXTERN void class_addanything(t_class *c, t_method fn);
EXTERN void class_sethelpsymbol(t_class *c, t_symbol *s);
EXTERN void class_setwidget(t_class *c, t_widgetbehavior *w);
EXTERN void class_setparentwidget(t_class *c, t_parentwidgetbehavior *w);
EXTERN t_parentwidgetbehavior *class_parentwidget(t_class *c);
EXTERN char *class_getname(t_class *c);
EXTERN char *class_gethelpname(t_class *c);
EXTERN void class_setdrawcommand(t_class *c);
EXTERN int class_isdrawcommand(t_class *c);
EXTERN void class_domainsignalin(t_class *c, int onset);
Miller Puckette's avatar
Miller Puckette committed
472
EXTERN void class_set_extern_dir(t_symbol *s);
Miller Puckette's avatar
Miller Puckette committed
473
474
475
#define CLASS_MAINSIGNALIN(c, type, field) \
    class_domainsignalin(c, (char *)(&((type *)0)->field) - (char *)0)

476
477
         /* classtable functions */
EXTERN t_class *classtable_findbyname(t_symbol *s);
478
479
EXTERN int classtable_size(void);
EXTERN void classtable_tovec(int size, t_atom *vec);
480

Miller Puckette's avatar
Miller Puckette committed
481
482
483
484
485
486
487
488
489
490
491
492
493
494
         /* prototype for functions to save Pd's to a binbuf */
typedef void (*t_savefn)(t_gobj *x, t_binbuf *b);
EXTERN void class_setsavefn(t_class *c, t_savefn f);
EXTERN t_savefn class_getsavefn(t_class *c);
        /* prototype for functions to open properties dialogs */
typedef void (*t_propertiesfn)(t_gobj *x, struct _glist *glist);
EXTERN void class_setpropertiesfn(t_class *c, t_propertiesfn f);
EXTERN t_propertiesfn class_getpropertiesfn(t_class *c);

#ifndef PD_CLASS_DEF
#define class_addbang(x, y) class_addbang((x), (t_method)(y))
#define class_addpointer(x, y) class_addpointer((x), (t_method)(y))
#define class_addfloat(x, y) class_doaddfloat((x), (t_method)(y))
#define class_addsymbol(x, y) class_addsymbol((x), (t_method)(y))
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
495
#define class_addblob(x, y) class_addblob((x), (t_method)(y)) /* MP20061226 blob type */
Miller Puckette's avatar
Miller Puckette committed
496
497
498
499
500
501
502
503
#define class_addlist(x, y) class_addlist((x), (t_method)(y))
#define class_addanything(x, y) class_addanything((x), (t_method)(y))
#endif

/* ------------   printing --------------------------------- */
EXTERN void post(const char *fmt, ...);
EXTERN void startpost(const char *fmt, ...);
EXTERN void poststring(const char *s);
504
EXTERN void postfloat(t_floatarg f);
Miller Puckette's avatar
Miller Puckette committed
505
506
EXTERN void postatom(int argc, t_atom *argv);
EXTERN void endpost(void);
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
507
508
509
510
EXTERN void error(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
EXTERN void verbose(int level, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
EXTERN void bug(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
EXTERN void pd_error(void *object, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
511
512
EXTERN void logpost(const void *object, const int level, const char *fmt, ...)
    ATTRIBUTE_FORMAT_PRINTF(3, 4);
Miller Puckette's avatar
Miller Puckette committed
513
514
515
516
517
518
519
EXTERN void sys_logerror(const char *object, const char *s);
EXTERN void sys_unixerror(const char *object);
EXTERN void sys_ouch(void);


/* ------------  system interface routines ------------------- */
EXTERN int sys_isreadablefile(const char *name);
520
EXTERN int sys_isabsolutepath(const char *dir);
Miller Puckette's avatar
Miller Puckette committed
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
EXTERN void sys_bashfilename(const char *from, char *to);
EXTERN void sys_unbashfilename(const char *from, char *to);
EXTERN int open_via_path(const char *name, const char *ext, const char *dir,
    char *dirresult, char **nameresult, unsigned int size, int bin);
EXTERN int sched_geteventno(void);
EXTERN double sys_getrealtime(void);
EXTERN int (*sys_idlehook)(void);   /* hook to add idle time computation */


/* ------------  threading ------------------- */ 
EXTERN void sys_lock(void);
EXTERN void sys_unlock(void);
EXTERN int sys_trylock(void);


/* --------------- signals ----------------------------------- */

538
typedef PD_FLOATTYPE t_sample;
Miller Puckette's avatar
Miller Puckette committed
539
540
541
542
543
544
545
#define MAXLOGSIG 32
#define MAXSIGSIZE (1 << MAXLOGSIG)

typedef struct _signal
{
    int s_n;            /* number of points in the array */
    t_sample *s_vec;    /* the array */
546
    t_float s_sr;         /* sample rate */
Miller Puckette's avatar
Miller Puckette committed
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
    int s_refcount;     /* number of times used */
    int s_isborrowed;   /* whether we're going to borrow our array */
    struct _signal *s_borrowedfrom;     /* signal to borrow it from */
    struct _signal *s_nextfree;         /* next in freelist */
    struct _signal *s_nextused;         /* next in used list */
    int s_vecsize;      /* allocated size of array in points */
} t_signal;

typedef t_int *(*t_perfroutine)(t_int *args);

EXTERN t_int *plus_perform(t_int *args);
EXTERN t_int *zero_perform(t_int *args);
EXTERN t_int *copy_perform(t_int *args);

EXTERN void dsp_add_plus(t_sample *in1, t_sample *in2, t_sample *out, int n);
EXTERN void dsp_add_copy(t_sample *in, t_sample *out, int n);
563
EXTERN void dsp_add_scalarcopy(t_float *in, t_sample *out, int n);
Miller Puckette's avatar
Miller Puckette committed
564
565
566
EXTERN void dsp_add_zero(t_sample *out, int n);

EXTERN int sys_getblksize(void);
567
EXTERN t_float sys_getsr(void);
Miller Puckette's avatar
Miller Puckette committed
568
569
570
571
572
EXTERN int sys_get_inchannels(void);
EXTERN int sys_get_outchannels(void);

EXTERN void dsp_add(t_perfroutine f, int n, ...);
EXTERN void dsp_addv(t_perfroutine f, int n, t_int *vec);
573
EXTERN void pd_fft(t_float *buf, int npoints, int inverse);
Miller Puckette's avatar
Miller Puckette committed
574
575
EXTERN int ilog2(int n);

576
577
578
579
580
EXTERN void mayer_fht(t_sample *fz, int n);
EXTERN void mayer_fft(int n, t_sample *real, t_sample *imag);
EXTERN void mayer_ifft(int n, t_sample *real, t_sample *imag);
EXTERN void mayer_realfft(int n, t_sample *real);
EXTERN void mayer_realifft(int n, t_sample *real);
Miller Puckette's avatar
Miller Puckette committed
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598

EXTERN float *cos_table;
#define LOGCOSTABSIZE 9
#define COSTABSIZE (1<<LOGCOSTABSIZE)

EXTERN int canvas_suspend_dsp(void);
EXTERN void canvas_resume_dsp(int oldstate);
EXTERN void canvas_update_dsp(void);
EXTERN int canvas_dspstate;

/*   up/downsampling */
typedef struct _resample
{
  int method;       /* up/downsampling method ID */

  t_int downsample; /* downsampling factor */
  t_int upsample;   /* upsampling factor */

599
  t_sample *s_vec;   /* here we hold the resampled data */
Miller Puckette's avatar
Miller Puckette committed
600
601
  int      s_n;

602
  t_sample *coeffs;  /* coefficients for filtering... */
Miller Puckette's avatar
Miller Puckette committed
603
604
  int      coefsize;

605
  t_sample *buffer;  /* buffer for filtering */
Miller Puckette's avatar
Miller Puckette committed
606
607
608
609
610
611
612
613
614
615
616
  int      bufsize;
} t_resample;

EXTERN void resample_init(t_resample *x);
EXTERN void resample_free(t_resample *x);

EXTERN void resample_dsp(t_resample *x, t_sample *in, int insize, t_sample *out, int outsize, int method);
EXTERN void resamplefrom_dsp(t_resample *x, t_sample *in, int insize, int outsize, int method);
EXTERN void resampleto_dsp(t_resample *x, t_sample *out, int insize, int outsize, int method);

/* ----------------------- utility functions for signals -------------- */
617
618
619
620
621
622
623
624
625
EXTERN t_float mtof(t_float);
EXTERN t_float ftom(t_float);
EXTERN t_float rmstodb(t_float);
EXTERN t_float powtodb(t_float);
EXTERN t_float dbtorms(t_float);
EXTERN t_float dbtopow(t_float);

EXTERN t_float q8_sqrt(t_float);
EXTERN t_float q8_rsqrt(t_float);
Miller Puckette's avatar
Miller Puckette committed
626
#ifndef N32     
627
628
EXTERN t_float qsqrt(t_float);  /* old names kept for extern compatibility */
EXTERN t_float qrsqrt(t_float);
Miller Puckette's avatar
Miller Puckette committed
629
630
631
632
633
634
635
636
637
638
#endif
/* --------------------- data --------------------------------- */

    /* graphical arrays */
EXTERN_STRUCT _garray;
#define t_garray struct _garray

EXTERN t_class *garray_class;
EXTERN int garray_getfloatarray(t_garray *x, int *size, t_float **vec);
EXTERN int garray_getfloatwords(t_garray *x, int *size, t_word **vec);
639
EXTERN t_float garray_get(t_garray *x, t_symbol *s, t_int indx);
Miller Puckette's avatar
Miller Puckette committed
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
EXTERN void garray_redraw(t_garray *x);
EXTERN int garray_npoints(t_garray *x);
EXTERN char *garray_vec(t_garray *x);
EXTERN void garray_resize(t_garray *x, t_floatarg f);
EXTERN void garray_usedindsp(t_garray *x);
EXTERN void garray_setsaveit(t_garray *x, int saveit);
EXTERN t_class *scalar_class;

EXTERN t_float *value_get(t_symbol *s);
EXTERN void value_release(t_symbol *s);
EXTERN int value_getfloat(t_symbol *s, t_float *f);
EXTERN int value_setfloat(t_symbol *s, t_float f);

/* ------- GUI interface - functions to send strings to TK --------- */
typedef void (*t_guicallbackfn)(t_gobj *client, t_glist *glist);

656
657
658
659
660
#ifdef CHECK_VGUI_ARGS
EXTERN void sys_vgui(const char *fmt, ...)
    __attribute__((format(printf,1,2)));
EXTERN void sys_vguid(const char *file, int line, const char *fmt, ...)
    __attribute__((format(printf,3,4)));
661
EXTERN void sys_vvguid(const char *file, int line, const char *fmt, va_list);
662
663
664
665
666
667
668
#else
EXTERN void sys_vgui(const char *fmt, ...);
EXTERN void sys_vguid(const char *file, int line, const char *fmt, ...);
EXTERN void sys_vvguid(const char *file, int line, const char *fmt, va_list);
#endif
EXTERN void sys_gui(const char *s);
#define sys_vgui(args...) sys_vguid(__FILE__,__LINE__,args)
669
#define sys_gui(s)        sys_vguid(__FILE__,__LINE__,"%s",s)
Jonathan Wilkes's avatar
Jonathan Wilkes committed
670
671
672
673
EXTERN void gui_vmess(const char *sel, char *fmt, ...);
/* some more gui interfaces for building incremental messages */
EXTERN void gui_start_vmess(const char *sel, char *fmt, ...);
EXTERN void gui_start_array(void);
674
675
676
EXTERN void gui_f(t_float f); /* send a float element in an array */
EXTERN void gui_i(int i);     /* send an int element in an array */
EXTERN void gui_s(const char *s); /* send a string element in an array */
Jonathan Wilkes's avatar
Jonathan Wilkes committed
677
678
EXTERN void gui_end_array(void);
EXTERN void gui_end_vmess(void);
679

Miller Puckette's avatar
Miller Puckette committed
680
681
682
683
684
EXTERN void sys_pretendguibytes(int n);
EXTERN void sys_queuegui(void *client, t_glist *glist, t_guicallbackfn f);
EXTERN void sys_unqueuegui(void *client);
    /* dialog window creation and destruction */
EXTERN void gfxstub_new(t_pd *owner, void *key, const char *cmd);
685
EXTERN char *gfxstub_new2(t_pd *owner, void *key);
Miller Puckette's avatar
Miller Puckette committed
686
687
688
689
690
691
692
693
694
695
696
EXTERN void gfxstub_deleteforkey(void *key);

extern t_class *glob_pdobject;  /* object to send "pd" messages */

/*-------------  Max 0.26 compatibility --------------------*/

/* the following reflects the new way classes are laid out, with the class
   pointing to the messlist and not vice versa. Externs shouldn't feel it. */
typedef t_class *t_externclass;

EXTERN void c_extern(t_externclass *cls, t_newmethod newroutine,
697
    t_method freeroutine, t_symbol *name, size_t size, int tiny,
Miller Puckette's avatar
Miller Puckette committed
698
699
700
701
702
703
704
705
706
    t_atomtype arg1, ...);
EXTERN void c_addmess(t_method fn, t_symbol *sel, t_atomtype arg1, ...);

#define t_getbytes getbytes
#define t_freebytes freebytes
#define t_resizebytes resizebytes
#define typedmess pd_typedmess
#define vmess pd_vmess

707
708
709
710
711
712
713
714
// jsarlo
EXTERN char sys_signal_line_color[8];
EXTERN char sys_control_line_color[8];
EXTERN char sys_iolet_select_color[8];
EXTERN int sys_iolet_select_width;
EXTERN int sys_dropshadow;
// end jsarlo

Miller Puckette's avatar
Miller Puckette committed
715
716
717
718
719
/* A definition to help gui objects straddle 0.34-0.35 changes.  If this is
defined, there is a "te_xpix" field in objects, not a "te_xpos" as before: */

#define PD_USE_TE_XPIX

720
#if defined(__i386__) || defined(__x86_64__)
Miller Puckette's avatar
Miller Puckette committed
721
722
723
724
725
726
727
728
729
730
731
/* a test for NANs and denormals.  Should only be necessary on i386. */
#define PD_BADFLOAT(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \
    (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000))
/* more stringent test: anything not between 1e-19 and 1e19 in absolute val */
#define PD_BIGORSMALL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \
    (((*(unsigned int*)&(f))&0x60000000)==0x60000000))
#else
#define PD_BADFLOAT(f) 0
#define PD_BIGORSMALL(f) 0
#endif

Miller Puckette's avatar
test7    
Miller Puckette committed
732
733
734
    /* get version number at run time */
EXTERN void sys_getversion(int *major, int *minor, int *bugfix);

Miller Puckette's avatar
Miller Puckette committed
735
736
737
738
739
740
#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
}
#endif

#define __m_pd_h_
#endif /* __m_pd_h_ */