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