diff options
author | N.N. <matju@users.sourceforge.net> | 2010-01-05 22:49:36 +0000 |
---|---|---|
committer | N.N. <matju@users.sourceforge.net> | 2010-01-05 22:49:36 +0000 |
commit | 8dbec761cf858ea65900c8a094599857208d8c3a (patch) | |
tree | 3228c023f87f23a354da3b57fdc2afe5b7052032 /desiredata/src/m_pd.h | |
parent | 529e59635598e2d90a7a49f6b4c676f8366109ba (diff) |
svn path=/trunk/; revision=12907
Diffstat (limited to 'desiredata/src/m_pd.h')
-rw-r--r-- | desiredata/src/m_pd.h | 974 |
1 files changed, 0 insertions, 974 deletions
diff --git a/desiredata/src/m_pd.h b/desiredata/src/m_pd.h deleted file mode 100644 index 2a930757..00000000 --- a/desiredata/src/m_pd.h +++ /dev/null @@ -1,974 +0,0 @@ -/* $Id$ - This file is part of DesireData. - - Copyright (c) 2006,2007,2009 Mathieu Bouchard. - 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. -*/ -/* - PD_PLUSPLUS_FACE is not considered as part of the main interface for externals, - even though it has become the main interface for internals. please don't rely on - it outside of the desiredata source code (yet). -*/ - -#ifndef __m_pd_h_ - -#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus) -#include <iostream> - -#ifdef __cplusplus -template <class K, class V> class t_hash /* : t_pd */ { - struct entry { - K k; - V v; - struct entry *next; - }; - long capa; - long n; - entry **tab; -/* when iterating: */ - long i; - entry *m_next; -public: - t_hash(long capa_) : capa(capa_), n(0), i(0) { - tab = new entry *[capa]; - for (long j=0; j<capa; j++) tab[j]=0; - } - ~t_hash() { - for (long j=0; j<capa; j++) while (tab[j]) del(tab[j]->k); - delete[] tab; - } - size_t size() {return n;} - V get(K k) { - long h = hash(k); - for (entry *e=tab[h]; e; e=e->next) {if (e->k==k) return e->v;} - return 0; - } - void set(K k, V v) { - long h = hash(k); - for (entry *e=tab[h]; e; e=e->next) {if (e->k==k) {e->v=v; return;}} - entry *nu = new entry; nu->k=k; nu->v=v; nu->next=tab[h]; - n++; - tab[h] = nu; - } - V del(K k) { - long h = hash(k); - for (entry **ep=&tab[h]; *ep; ep=&(*ep)->next) { - if ((*ep)->k==k) { - V v=(*ep)->v; - entry *next=(*ep)->next; - delete *ep; n--; - *ep = next; - return v; - } - } - return 0; - } - int exists(K k) { - long h = hash(k); - for (entry *e=tab[h]; e; e=e->next) {if (e->k==k) return 1;} - return 0; - } - void start() {i=0; m_next=0;} - int next(K *kp, V *vp) { - while (!m_next && i<capa) m_next = tab[i++]; - if (m_next) { - *kp = m_next->k; - *vp = m_next->v; - m_next = m_next->next; - return 1; - } - return 0; - } - #define hash_foreach(k,v,h) for (h->start(); h->next(&k,&v); ) - long hash(K k) {return (((long)k*0x54321) & 0x7FFFFFFF)%capa;} -}; -#endif - -/* needed for all those strcmp.h in here */ -#include <string.h> - -extern "C" { -#endif - -#define DESIRE 1 -#define PD_MAJOR_VERSION 1 -#define PD_MINOR_VERSION 0 -#define PD_DEVEL_VERSION 0 -#define PD_TEST_VERSION "" - -/* 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(_WIN32) || defined(NT)) && !defined(MSW) -#define MSW -#endif - -#ifdef __CYGWIN__ -#define UNISTD -#endif - -#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 */ -#endif /* _MSC_VER */ - -/* the external storage class is "extern" on Linux and OSX; on Win32 it's ugly like this: */ -#if defined(MSW) && !defined (__GNUC__) -#ifdef PD_INTERNAL -#define EXTERN __declspec(dllexport) extern -#else -#define EXTERN __declspec(dllimport) extern -#endif /* PD_INTERNAL */ -#else -#define EXTERN extern -#endif /* MSW */ - -#if !defined(_SIZE_T) && !defined(_SIZE_T_) -#include <stddef.h> -#endif - -#include <stdarg.h> - -#define MAXPDSTRING 1000 /* use this for anything you want */ -#define MAXPDARG 5 /* max number of args we can typecheck today */ - -/* signed and unsigned integer types the size of a pointer: */ -/* GG: long is the size of a pointer */ -typedef long t_int; - -typedef float t_float; /* a floating-point number at most the same size */ -typedef float t_floatarg; /* floating-point type for function calls */ - -typedef struct _class t_class; -typedef struct _outlet t_outlet; -typedef struct _inlet t_inlet; -typedef struct _clock t_clock; -typedef struct _glist t_glist, t_canvas; -typedef struct _symbol t_symbol; -typedef struct _atom t_atom; - -#ifdef PD_PLUSPLUS_FACE -struct t_pd { - t_class *_class; -}; -#else -typedef t_class *t_pd; /* pure datum: nothing but a class pointer */ -#endif - -struct _symbol { - char *name; /* the const string that represents this symbol */ - t_pd *thing; /* pointer to the target of a receive-symbol or to the bindlist of several targets */ - struct _symbol *next; /* brochette of all symbols (only for permanent symbols) */ - size_t refcount; /* refcount<0 means that the symbol is permanent */ - size_t n; /* size of name (support for NUL characters) */ -#ifdef PD_PLUSPLUS_FACE - bool operator == (const char *s) const {return strcmp(this->name,s)==0;} - bool operator != (const char *s) const {return strcmp(this->name,s);} -#endif -}; -#define s_name name -#define s_thing thing -#define s_next next - -#ifdef PD_PLUSPLUS_FACE -typedef struct t_list : t_pd { -#else -typedef struct t_list { - t_pd *pd; -#endif - struct _atom *v; - size_t capa; - size_t refcount; - size_t n; -} t_list, t_binbuf; - -typedef struct _array t_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. */ - -#ifdef PD_PLUSPLUS_FACE -typedef struct _gpointer { - union { - struct _scalar *scalar; /* scalar we're in (if glist) */ - union word *w; /* raw data (if array) */ - }; - union { - struct _glist *canvas; - struct _array *array; - struct t_text *o; - }; - size_t dummy; - size_t refcount; -//#define gs_refcount refcount -#define gs_refcount canvas->refcount -} t_gpointer; -#else -typedef struct _gpointer { - union { - struct _scalar *gp_scalar; /* scalar we're in (if glist) */ - union word *gp_w; /* raw data (if array) */ - } gp_un; - union { - struct _glist *canvas; - struct _array *array; - struct _text *o; - } un; - size_t dummy; - size_t refcount; -//#define gs_refcount un.canvas->gl_obj.refcount -#define gs_refcount refcount -} t_gpointer; -#endif - -#define w_list w_canvas -typedef union word { - t_float w_float; /* A_FLOAT */ - t_symbol *w_symbol; /* A_SYMBOL or A_DOLLSYM */ - t_gpointer *w_gpointer; /* A_POINTER */ - t_array *w_array; /* DT_ARRAY */ - struct _glist *w_canvas; /* DT_LIST */ - t_int w_index; /* A_SEMI or A_COMMA or A_DOLLAR */ -} t_word; - -typedef enum { - A_NULL, /* non-type: represents end of typelist */ - A_FLOAT, A_SYMBOL, A_POINTER, /* stable elements */ - A_SEMI, A_COMMA, /* radioactive elements of the first kind */ - A_DEFFLOAT, A_DEFSYM, /* pseudo-types for optional (DEFault) arguments */ - A_DOLLAR, A_DOLLSYM, /* radioactive elements of the second kind */ - A_GIMME, /* non-type: represents varargs */ - A_CANT, /* bottom type: type constraint is impossible */ -/* regular pd stops here, before #12 */ - A_ATOM, /* top type: type constraint doesn't constrain */ - A_LIST, /* t_list *, the 4th stable element (future use) */ - A_GRID, /* reserved for GridFlow */ - A_GRIDOUT, /* reserved for GridFlow */ -} t_atomtype; - -#define A_DEFSYMBOL A_DEFSYM /* better name for this */ - -struct _atom { - t_atomtype a_type; - union word a_w; -#ifdef __cplusplus - operator float () {return a_w.w_float;} - operator t_symbol *() {return a_w.w_symbol;} - //bool operator == (_atom &o) {return a_type==o.a_type && a_w.w_index==o.a_w.w_index;} - //bool operator != (_atom &o) {return a_type!=o.a_type || a_w.w_index!=o.a_w.w_index;} -#endif -}; - -struct t_arglist {long c; t_atom v[0];}; - -typedef unsigned long long uint64; - -/* t_appendix is made of the things that logically ought to be in t_gobj but have been put in a - separate memory space because this allows most externals to work unmodified on both DesireData - and non-DesireData systems. The equivalent in the Tcl side is really part of every view object. */ -typedef struct t_appendix { - t_canvas *canvas; /* the holder of this object */ -/* actual observable */ - size_t nobs; /* number of spies */ - struct _gobj **obs; /* I spy with my little I */ -/* miscellaneous */ -#ifdef __cplusplus - t_hash<t_symbol *, t_arglist *> *visual; -#else - void *visual; -#endif - long index; /* index of an object within its canvas scope. */ - uint64 elapsed; -} t_appendix; -t_appendix *appendix_new (struct _gobj *master); -void appendix_free(struct _gobj *self); -void appendix_save(struct _gobj *master, t_binbuf *b); - -#ifdef PD_PLUSPLUS_FACE -#define g_pd _class -typedef struct _gobj : t_pd { -#else -typedef struct _gobj /* a graphical object */ -{ - t_pd g_pd; /* pure datum header (class) */ -#endif - t_appendix *dix; -#define g_adix dix -#ifdef PD_PLUSPLUS_FACE - _gobj *next(); -#endif -} t_gobj; - -#ifdef PD_PLUSPLUS_FACE -typedef struct _outconnect : _gobj { - struct _outconnect *next; - t_pd *oc_to; - struct t_text *from; - struct t_text *to; - short outlet, inlet; -} t_outconnect, t_wire; -#define oc_next next -#else -typedef struct _outconnect t_outconnect; -#endif - -#ifdef PD_PLUSPLUS_FACE -typedef struct _scalar : t_gobj { -#else -typedef struct _scalar /* a graphical object holding data */ -{ - t_gobj sc_gobj; /* header for graphical object */ -#endif - t_symbol *t; /* template name (LATER replace with pointer) */ - t_word v[1]; /* indeterminate-length array of words */ -} t_scalar; - -#define sc_template t -#define sc_vec v - -#ifdef PD_PLUSPLUS_FACE -typedef struct t_text : t_gobj { -#else -typedef struct _text /* patchable object - graphical, with text */ -{ - t_gobj te_g; /* header for graphical object */ -#endif - t_binbuf *binbuf; /* holder for the text */ - t_outlet *outlet; /* linked list of outlets */ - t_inlet *inlet; /* linked list of inlets */ - short x,y; /* x&y location (within the toplevel) */ - int refcount; /* there used to be a bitfield here, which may be a problem with ms-bitfields (?) */ -#ifdef PD_PLUSPLUS_FACE - t_inlet * in(int n); - t_outlet *out(int n); -#endif -} t_text, t_object; - -#define te_binbuf binbuf -#define te_outlet outlet -#define te_inlet inlet -#define te_xpix x -#define te_ypix y -#define te_width width -#define te_type type - -#define ob_outlet te_outlet -#define ob_inlet te_inlet -#define ob_binbuf te_binbuf -#ifdef PD_PLUSPLUS_FACE -#define te_pd g_pd -#define ob_pd g_pd -#else -#define te_pd te_g.g_pd -#define ob_pd te_g.g_pd -#endif -#define ob_g te_g - -/* don't take those three types for cash (on average). they're lying because the type system can't express what there is to be expressed. */ -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, s_float, s_symbol; -EXTERN t_symbol s_bang, s_list, s_anything, s_signal; -EXTERN t_symbol s__N, s__X, s_x, s_y, s_; - -/* --------- 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); -EXTERN t_symbol *gensym(const char *s); -EXTERN t_symbol *gensym2(const char *s, size_t n); -EXTERN t_symbol *symprintf(const char *s, ...); -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, const 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); /* multiclient race conditions? */ - -/* --------------- memory management -------------------- */ -EXTERN void *getbytes(size_t nbytes); /* deprecated, use malloc() */ -EXTERN void *copybytes(void *src, size_t nbytes); -EXTERN void freebytes(void *x, size_t nbytes); /* deprecated, use free() */ -EXTERN void *resizebytes(void *x, size_t oldsize, size_t newsize); /* deprecated, use realloc() */ - -/* T.Grill - functions for aligned memory (according to CPU SIMD architecture) */ -EXTERN void *getalignedbytes(size_t nbytes); -EXTERN void *copyalignedbytes(void *src, size_t nbytes); -EXTERN void freealignedbytes(void *x,size_t nbytes); -EXTERN void *resizealignedbytes(void *x,size_t oldsize, size_t newsize); -/* -------------------- atoms ----------------------------- */ - -#define atom_decref(atom) (void)42 -#define atom_incref(atom) (void)42 -#define SETATOM(atom,type,field,value) (atom_decref(atom), (atom)->a_type=type, (atom)->a_w.field=value, atom_incref(atom)) -#define SETSEMI(atom) SETATOM(atom,A_SEMI, w_index,0) -#define SETCOMMA(atom) SETATOM(atom,A_COMMA, w_index,0) -#define SETPOINTER(atom, gp) SETATOM(atom,A_POINTER,w_gpointer,(gp)) /* looks unsafe... */ -#define SETFLOAT(atom, f) SETATOM(atom,A_FLOAT, w_float,(f)) -#define SETSYMBOL(atom, s) SETATOM(atom,A_SYMBOL, w_symbol,(s)) -#define SETSTRING(atom, s) SETATOM(atom,A_SYMBOL, w_symbol,gensym(s)) -#define SETDOLLAR(atom, n) SETATOM(atom,A_DOLLAR, w_index,(n)) -#define SETDOLLSYM(atom, s) SETATOM(atom,A_DOLLSYM,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); /* this call causes a t_symbol to become æternal */ -EXTERN const char *atom_getstring(t_atom *a); /* the return value should be used only immediately */ -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 const char *atom_getstringarg(int which, int argc, t_atom *argv); /* see above */ - -EXTERN t_symbol *atom_gensym( t_atom *a); - -/* this function should produce a literal, whereas getstring gives the exact string */ -EXTERN void atom_string(t_atom *a, char *buf, unsigned int bufsize); -#ifdef __cplusplus -EXTERN void atom_ostream(t_atom *a, std::ostream &buf); -inline std::ostream &operator <<(std::ostream &buf, t_atom *a) {atom_ostream(a,buf); return buf;} -#endif - -/* goes with desiredata's CLASS_NEWATOM */ -EXTERN void atom_init(t_atom *a, size_t n); -EXTERN void atom_copy(t_atom *a, t_atom *b, size_t n); -EXTERN void atom_delete(t_atom *a, size_t n); - -/* ------------------ 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, const char *text, size_t size); -EXTERN void binbuf_gettext(t_binbuf *x, char **bufp, int *lengthp); -EXTERN char *binbuf_gettext2(t_binbuf *x); -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, const 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, const char *filename, const char *dirname, int flags); -EXTERN int binbuf_read_via_canvas(t_binbuf *b, const char *filename, t_canvas *canvas, int flags); -EXTERN int binbuf_read_via_path( t_binbuf *b, const char *filename, const char *dirname, int flags); -EXTERN int binbuf_write( t_binbuf *x, const char *filename, const char *dir, int flags); -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); -EXTERN void pd_string( t_pd *x, const char *s); /* makes a refcounted symbol (copying s) */ -EXTERN void pd_list( t_pd *x, t_symbol *s, int argc, t_atom *argv); -#define pd_anything pd_typedmess - -#ifdef PD_PLUSPLUS_FACE -#define pd_class(x) ((x)->_class) -#else -#define pd_class(x) (*(x)) -#endif - -EXTERN void gobj_subscribe (t_gobj *self, t_gobj *observer); -EXTERN void gobj_unsubscribe (t_gobj *self, t_gobj *observer); -EXTERN void gobj_changed (t_gobj *self, const char *k); -EXTERN void gobj_changed2 (t_gobj *self, int argc, t_atom *argv); -EXTERN void gobj_changed3 (t_gobj *self, t_gobj *origin, int argc, t_atom *argv); - -/* ----------------- 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 *stringinlet_new( t_object *owner, t_symbol **sp); /* for future use */ -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_float( t_outlet *x, t_float f); -EXTERN void outlet_symbol( t_outlet *x, t_symbol *s); -EXTERN void outlet_string( t_outlet *x, const char *s); /* makes a refcounted symbol (copying s) */ -EXTERN void outlet_pointer( t_outlet *x, t_gpointer *gp); -EXTERN void outlet_atom( t_outlet *x, t_atom *a); -EXTERN void outlet_list( t_outlet *x, t_symbol *s, int argc, t_atom *argv); /* ignores s, uses &s_list instead */ -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); - -struct _outlet { -#ifdef PD_PLUSPLUS_FACE - void send() {outlet_bang( this);} - void send(t_float v) {outlet_float( this,v);} - void send(t_symbol *v) {outlet_symbol( this,v);} - void send(const char *v) {outlet_string( this,v);} - void send(t_gpointer *v) {outlet_pointer(this,v);} - void send(t_atom *v) {outlet_atom( this,v);} - void send( int argc, t_atom *argv) {outlet_list( this,0,argc,argv);} - void send(t_symbol *s, int argc, t_atom *argv) {outlet_anything(this,s,argc,argv);} - //private: -#endif - t_object *owner; - struct _outlet *next; - t_outconnect *connections; - t_symbol *sym; -}; - - -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); -/* if result==0 then it will allocate a result and return it */ -EXTERN char *canvas_makefilename(t_glist *c, char *file, char *result, int resultsize); -EXTERN t_symbol *canvas_getdir(t_glist *x); -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); -EXTERN int canvas_open2(t_canvas *x, const char *name, const char *ext, char **dirresult, char **nameresult, int bin); - -// new abstracted calls -EXTERN t_gobj *canvas_first(t_canvas *x); -EXTERN t_gobj *gobj_next(t_gobj *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_NEWATOMS 16 -#define CLASS_TYPEMASK 3 - -#ifdef __cplusplus -typedef int t_atomtypearg; -#else -typedef t_atomtype t_atomtypearg; -#endif - -EXTERN t_class *class_find (t_symbol *s); -EXTERN t_class *class_new( t_symbol *name,t_newmethod nu,t_method freem,size_t size,int flags,t_atomtypearg arg1, ...); -EXTERN t_class *class_new2(const char *name,t_newmethod nu,t_method freem,size_t size,int flags,const char *sig); -EXTERN void class_addcreator( t_newmethod nu, t_symbol *sel, t_atomtypearg arg1, ...); -EXTERN void class_addcreator2(const char *name, t_newmethod nu, const char *sig); -EXTERN void class_addmethod( t_class *c, t_method fn, t_symbol *sel, t_atomtypearg arg1, ...); -EXTERN void class_addmethod2( t_class *c, t_method fn, const char *sel, const char *sig); -#define class_new2(NAME,NU,FREE,SIZE,FLAGS,SIG) class_new2(NAME,(t_newmethod)NU,(t_method)FREE,SIZE,FLAGS,SIG) -#define class_addcreator2(NAME,NU,SIG) class_addcreator2(NAME,(t_newmethod)NU,SIG) -#define class_addmethod2(NAME,METH,SEL,SIG) class_addmethod2(NAME,(t_method)METH,SEL,SIG) - -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); -EXTERN void class_addstring( t_class *c, t_method fn); /* for future use */ -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 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); -#define CLASS_MAINSIGNALIN(c, type, field) \ - class_domainsignalin(c, (char *)(&((type *)0xdead0000)->field) - (char *)0xdead0000) - -/* in "class" observer: observable calls this to notify of a change */ -typedef void (*t_notice)(t_gobj *x, t_gobj *origin, int argc, t_atom *argv); -EXTERN void class_setnotice(t_class *c, t_notice notice); - -/* in "class" observable: observable sends initial data to observer */ -/* this is called by gobj_subscribe to find out all the indirect subscriptions of aggregators. */ -/* every class that redefines this is an aggregator; every aggregator should redefine this. */ -/* "calling super" is done by calling gobj_onsubscribe with same args */ -typedef void (*t_onsubscribe)(t_gobj *x, t_gobj *observer); -EXTERN void class_setonsubscribe(t_class *c, t_onsubscribe onsubscribe); -EXTERN void gobj_onsubscribe(t_gobj *x, t_gobj *observer); /* default handler, that you may inherit from */ - -/* 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); - -#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)) -#define class_addstring( x,y) class_addstring( (x),(t_method)(y)) /* for future use */ -#define class_addlist( x,y) class_addlist( (x),(t_method)(y)) -#define class_addanything(x,y) class_addanything((x),(t_method)(y)) -#endif - -EXTERN void class_settip(t_class *x,t_symbol* s); -EXTERN void inlet_settip(t_inlet* i,t_symbol* s); -EXTERN void class_setfieldnames(t_class *x, const char *s); /* where s is split on spaces and tokenized */ -EXTERN int class_getfieldindex(t_class *x, const char *s); -typedef int (*t_loader)(t_canvas *canvas, char *classname); -EXTERN void sys_register_loader(t_loader loader); - -/* ------------ printing --------------------------------- */ -EXTERN void post(const char *fmt, ...) __attribute__((format(printf,1,2))); -EXTERN void startpost(const char *fmt, ...) __attribute__((format(printf,1,2))); -EXTERN void poststring(const char *s); -EXTERN void postfloat(float f); -EXTERN void postatom(int argc, t_atom *argv); -EXTERN void endpost(void); -EXTERN void error(const char *fmt, ...) __attribute__((format(printf,1,2))); -EXTERN void verror(const char *fmt, va_list args); -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))) /*__attribute__ ((deprecated))*/; -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); -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 open_via_path2(const char *dir, const char *name, const char *ext, char **dirresult, char **nameresult, int bin); - -EXTERN int sched_geteventno(void); -EXTERN double sys_getrealtime(void); - - -/* ------------ threading ------------------- */ -/* T.Grill - see m_sched.c */ -EXTERN void sys_lock(void); -EXTERN void sys_unlock(void); -EXTERN int sys_trylock(void); -EXTERN int sys_timedlock(int microsec); -/* tb: to be called at idle time */ -EXTERN void sys_callback(t_int (*callback) (t_int* argv), t_int* argv, t_int argc); - -/* --------------- signals ----------------------------------- */ - -typedef float t_sample; -#define MAXLOGSIG 32 -#define MAXSIGSIZE (1 << MAXLOGSIG) - -/* this doesn't really have to do with C++, just with getting rid of prefixes */ -#ifdef PD_PLUSPLUS_FACE -struct t_signal { - int n; - t_sample *v; - float sr; - int refcount; - int isborrowed; - t_signal *borrowedfrom; - t_signal *nextfree; - t_signal *nextused; - int vecsize; -}; -#else -typedef struct _signal { - int s_n; /* number of points in the array */ - t_sample *s_vec; /* the array */ - float s_sr; /* sample rate */ - 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; -#endif - -typedef t_int *(*t_perfroutine)(t_int *args); - -/* tb: exporting basic arithmetic dsp functions { - * for (n % 8) != 0 */ -EXTERN t_int *zero_perform(t_int *args); -EXTERN t_int *copy_perform(t_int *args); -EXTERN t_int *plus_perform( t_int *args); EXTERN t_int *scalarplus_perform( t_int *args); -EXTERN t_int *minus_perform(t_int *args); EXTERN t_int *scalarminus_perform(t_int *args); -EXTERN t_int *times_perform(t_int *args); EXTERN t_int *scalartimes_perform(t_int *args); -EXTERN t_int *over_perform( t_int *args); EXTERN t_int *scalarover_perform( t_int *args); -EXTERN t_int *max_perform( t_int *args); EXTERN t_int *scalarmax_perform( t_int *args); -EXTERN t_int *min_perform( t_int *args); EXTERN t_int *scalarmin_perform( t_int *args); -EXTERN t_int *sig_tilde_perform(t_int *args); -EXTERN t_int *clip_perform(t_int *args); - -/* for (n % 8) == 0 */ -EXTERN t_int *zero_perf8(t_int *args); -EXTERN t_int *copy_perf8(t_int *args); -EXTERN t_int *plus_perf8( t_int *args); EXTERN t_int *scalarplus_perf8( t_int *args); -EXTERN t_int *minus_perf8(t_int *args); EXTERN t_int *scalarminus_perf8(t_int *args); -EXTERN t_int *times_perf8(t_int *args); EXTERN t_int *scalartimes_perf8(t_int *args); -EXTERN t_int *over_perf8( t_int *args); EXTERN t_int *scalarover_perf8( t_int *args); -EXTERN t_int *max_perf8( t_int *args); EXTERN t_int *scalarmax_perf8( t_int *args); -EXTERN t_int *min_perf8( t_int *args); EXTERN t_int *scalarmin_perf8( t_int *args); -EXTERN t_int *sqr_perf8(t_int *args); -EXTERN t_int *sig_tilde_perf8(t_int *args); - -/* for (n % 8) == 0 && aligned signal vectors - * check with simd_checkX functions !!! */ -EXTERN t_int *zero_perf_simd(t_int *args); -EXTERN t_int *copy_perf_simd(t_int *args); -EXTERN t_int *plus_perf_simd( t_int *args); EXTERN t_int *scalarplus_perf_simd( t_int *args); -EXTERN t_int *minus_perf_simd(t_int *args); EXTERN t_int *scalarminus_perf_simd(t_int *args); -EXTERN t_int *times_perf_simd(t_int *args); EXTERN t_int *scalartimes_perf_simd(t_int *args); -EXTERN t_int *over_perf_simd( t_int *args); EXTERN t_int *scalarover_perf_simd( t_int *args); -EXTERN t_int *max_perf_simd( t_int *args); EXTERN t_int *scalarmax_perf_simd( t_int *args); -EXTERN t_int *min_perf_simd( t_int *args); EXTERN t_int *scalarmin_perf_simd( t_int *args); -EXTERN t_int *sqr_perf_simd(t_int *args); -EXTERN t_int *sig_tilde_perf_simd(t_int *args); -EXTERN t_int *clip_perf_simd(t_int *args); -/* } tb */ - -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); -EXTERN void dsp_add_scalarcopy(t_sample *in, t_sample *out, int n); -EXTERN void dsp_add_zero(t_sample *out, int n); - -EXTERN int sys_getblksize(void); -EXTERN float sys_getsr(void); -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); -EXTERN void pd_fft(float *buf, int npoints, int inverse); -EXTERN int ilog2(int n); - -EXTERN void mayer_fht(float *fz, int n); -EXTERN void mayer_fft(int n, float *real, float *imag); -EXTERN void mayer_ifft(int n, float *real, float *imag); -EXTERN void mayer_realfft(int n, float *real); -EXTERN void mayer_realifft(int n, float *real); - -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; - -/* IOhannes { (up/downsampling) */ -/* use zero-padding to generate samples inbetween */ -#define RESAMPLE_ZERO 0 -/* use sample-and-hold to generate samples inbetween */ -#define RESAMPLE_HOLD 1 -/* use linear interpolation to generate samples inbetween */ -#define RESAMPLE_LINEAR 2 -/* not a real up/downsampling: - * upsampling: copy the original vector to the first part of the upsampled vector; the rest is zero - * downsampling: take the first part of the original vector as the downsampled vector - * WHAT FOR: we often want to process only the first half of an FFT-signal (the rest is redundant) - */ -#define RESAMPLE_BLOCK 3 - -#define RESAMPLE_DEFAULT RESAMPLE_ZERO - -typedef struct _resample { - int method; /* up/downsampling method ID */ - t_int downsample; /* downsampling factor */ - t_int upsample; /* upsampling factor */ -#ifdef PD_PLUSPLUS_FACE - t_float *v; /* here we hold the resampled data */ - int n; -#else - t_float *vec; - int s_n; -#endif - t_float *coeffs; /* coefficients for filtering... */ - int coefsize; - t_float *buffer; /* buffer for filtering */ - 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); -/* } IOhannes */ - -/* tb: exporting basic simd coded dsp functions { */ - -/* vectorized, not simd functions*/ -EXTERN void zerovec_8(t_float *dst,int n); -EXTERN void setvec_8(t_float *dst,t_float v,int n); -EXTERN void copyvec_8(t_float *dst,const t_float *src,int n); -EXTERN void addvec_8(t_float *dst,const t_float *src,int n); -EXTERN void testcopyvec_8(t_float *dst,const t_float *src,int n); -EXTERN void testaddvec_8(t_float *dst,const t_float *src,int n); -/* EXTERN float sumvec_8(t_float* in, t_int n); */ - -/* vectorized, simd functions * - * dst and src are assumed to be aligned */ -EXTERN void zerovec_simd(t_float *dst,int n); -EXTERN void setvec_simd(t_float *dst,t_float v,int n); -EXTERN void copyvec_simd(t_float *dst,const t_float *src,int n); -EXTERN void addvec_simd(t_float *dst,const t_float *src,int n); -EXTERN void testcopyvec_simd(t_float *dst,const t_float *src,int n); -EXTERN void testaddvec_simd(t_float *dst,const t_float *src,int n); -/* EXTERN float sumvec_simd(t_float* in, t_int n); */ -EXTERN void copyvec_simd_unalignedsrc(t_float *dst,const t_float *src,int n); - -/* not vectorized, not simd functions */ -EXTERN void copyvec(t_float *dst,const t_float *src,int n); -EXTERN void addvec(t_float *dst,const t_float *src,int n); -EXTERN void zerovec(t_float *dst, int n); - -EXTERN int simd_runtime_check(void); -EXTERN int simd_check1(t_int n, t_float* ptr1); -EXTERN int simd_check2(t_int n, t_float* ptr1, t_float* ptr2); -EXTERN int simd_check3(t_int n, t_float* ptr1, t_float* ptr2, t_float* ptr3); - -/* } tb */ - - -/* ----------------------- utility functions for signals -------------- */ -EXTERN float mtof(float); -EXTERN float ftom(float); -EXTERN float rmstodb(float); -EXTERN float powtodb(float); -EXTERN float dbtorms(float); -EXTERN float dbtopow(float); - -EXTERN float q8_sqrt(float); -EXTERN float q8_rsqrt(float); -#ifndef N32 -EXTERN float qsqrt(float); /* old names kept for extern compatibility */ -EXTERN float qrsqrt(float); -#endif -/* --------------------- data --------------------------------- */ - -/* graphical arrays */ -typedef struct _garray t_garray; - -EXTERN t_class *garray_class; -EXTERN int garray_getfloatarray(t_garray *x, int *size, t_float **vec); -EXTERN float garray_get(t_garray *x, t_symbol *s, t_int indx); -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 double garray_updatetime(t_garray *x); - -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 --------- */ -EXTERN void sys_vgui(const char *fmt, ...); -EXTERN void sys_gui(const char *s); - -extern t_class *glob_pdobject; /* object to send "pd" messages */ - -/*------------- Max 0.26 compatibility --------------------*/ - -#define t_getbytes getbytes -#define t_freebytes freebytes -#define t_resizebytes resizebytes -#define typedmess pd_typedmess -#define vmess pd_vmess - -/* 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 - -#ifdef __i386__ -/* 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 - -/* tb: wrapper for PD_BIGORSMALL macro */ -EXTERN void testcopyvec(t_float *dst,const t_float *src,int n); -EXTERN void testaddvec(t_float *dst,const t_float *src,int n); - -/* tb's fifos */ -typedef struct _fifo t_fifo; -/* function prototypes */ -EXTERN t_fifo * fifo_init(void); -EXTERN void fifo_destroy(t_fifo*); -/* fifo_put() and fifo_get are the only threadsafe functions!!! */ -EXTERN void fifo_put(t_fifo*, void*); -EXTERN void* fifo_get(t_fifo*); - -#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus) -} -#endif - -#define __m_pd_h_ -#endif /* __m_pd_h_ */ - -/* removed functions: - sys_fontwidth, sys_fontheight, t_widgetbehavior, class_setproperties, - class_setwidget, class_setparentwidget, class_parentwidget, pd_getparentwidget, - sys_pretendguibytes, sys_queuegui, sys_unqueuegui, getzbytes, - gfxstub_new, gfxstub_deleteforkey - removed fields: te_width, te_type. - */ -/* externs that use g_next directly can't work with desiredata: gui/state, clone, dyn, dynext, toxy, cyclone */ |