A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 667 lines 23 kB view raw
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