15 #ifndef __FLEXT_BASE_H 16 #define __FLEXT_BASE_H 50 #if FLEXT_SYS == FLEXT_SYS_PD 55 #if FLEXT_SYS == FLEXT_SYS_MAX 70 typedef std::map<const t_symbol *,FLEXT_TEMPINST(flext_class) *>
LibMap;
118 static void InitProblem() { init_ok =
false; }
130 virtual bool Finalize();
143 t_canvas *thisCanvas()
const {
return m_canvas; }
147 t_sigobj *thisHdr() {
FLEXT_ASSERT(x_obj);
return &x_obj->obj; }
148 const t_sigobj *thisHdr()
const {
FLEXT_ASSERT(x_obj);
return &x_obj->obj; }
150 const char *thisName()
const {
return GetString(m_name); }
152 const t_symbol *thisNameSym()
const {
return m_name; }
154 t_class *thisClass()
const;
160 t_classid thisClassId()
const {
return clss; }
163 static t_class *getClass(t_classid
id);
165 static bool HasAttributes(t_classid
id);
166 static bool IsDSP(t_classid
id);
167 static bool HasDSPIn(t_classid
id);
168 static bool IsLib(t_classid
id);
170 bool HasAttributes()
const;
173 bool HasDSPIn()
const;
175 #if FLEXT_SYS == FLEXT_SYS_MAX 178 bool NeedDSP()
const;
193 static void DefineHelp(t_classid c,
const char *ref,
const char *dir = NULL,
bool addtilde =
false);
196 void DefineHelp(
const char *ref,
const char *dir = NULL,
bool addtilde =
false) { DefineHelp(thisClassId(),ref,dir,addtilde); }
218 #if FLEXT_SYS == FLEXT_SYS_MAX 220 void Lock() { critical_enter(lock); }
221 void Unlock() { critical_exit(lock); }
222 static void SysLock() { critical_enter(0); }
223 static void SysUnlock() { critical_exit(0); }
224 #elif FLEXT_SYS == FLEXT_SYS_PD 227 static void SysLock() {}
228 static void SysUnlock() {}
236 Locker(flext_obj *o = NULL): obj(o) {
if(obj) obj->Lock();
else SysLock(); }
238 ~Locker() {
if(obj) obj->Unlock();
else SysUnlock(); }
246 mutable t_canvas *m_canvas;
258 static void __setup__(t_classid);
267 static const t_symbol *m_holdname;
270 static int m_holdaargc;
271 static const t_atom *m_holdaargv;
276 const t_symbol *m_name;
281 static bool Initing() {
return initing; }
284 static bool Exiting() {
return exiting; }
287 static void lib_init(
const char *name,
void setupfun());
288 static void obj_add(
bool lib,
bool dsp,
bool noi,
bool attr,
const char *idname,
const char *names,
void setupfun(t_classid),
FLEXT_CLASSDEF(flext_obj) *(*newfun)(
int,t_atom *),
void (*freefun)(
flext_hdr *),
int argtp1,...);
290 #if FLEXT_SYS == FLEXT_SYS_MAX 291 static flext_hdr *obj_new(
const t_symbol *s,
short argc,t_atom *argv);
293 static flext_hdr *obj_new(
const t_symbol *s,
int argc,t_atom *argv);
298 static bool GetParamSym(t_atom &dst,
const t_symbol *s,t_canvas *c);
301 void GetCanvasArgs(AtomList &args)
const;
304 void GetCanvasDir(
char *buf,
size_t bufsz)
const;
312 static LibMap *libnames;
316 #if FLEXT_SYS == FLEXT_SYS_PD 317 static t_class *buf_class;
318 static void cb_buffer_dsp(
void *c,t_signal **sp);
321 #if FLEXT_SYS == FLEXT_SYS_MAX 322 static const t_symbol *sym__shP;
330 #define FLEXT_MAXNEWARGS 4 333 #define FLEXT_MAXMETHARGS 5 336 #define FLEXT_CALL_PRE(F) flext_c_##F 337 #define FLEXT_THR_PRE(F) flext_t_##F 338 #define FLEXT_GET_PRE(F) flext_g_##F 339 #define FLEXT_SET_PRE(F) flext_s_##F 342 #ifndef FLEXT_ATTRIBUTES 347 #define FLEXT_ATTRIBUTES \ 352 #elif FLEXT_ATTRIBUTES != 0 && FLEXT_ATTRIBUTES != 1 353 #error "FLEXT_ATTRIBUTES must be 0 or 1" 361 #define FLEXT_REALHDR(NEW_CLASS, PARENT_CLASS) \ 363 typedef NEW_CLASS thisType; \ 364 typedef PARENT_CLASS thisParent; \ 365 static FLEXT_CLASSDEF(flext_obj) *__init__(int argc,t_atom *argv); \ 366 static void __free__(flext_hdr *hdr) { delete hdr->data; } \ 367 static void __setup__(flext_obj::t_classid classid) { thisParent::__setup__(classid); } 370 #define FLEXT_REALHDR_S(NEW_CLASS, PARENT_CLASS,SETUPFUN) \ 372 typedef NEW_CLASS thisType; \ 373 typedef PARENT_CLASS thisParent; \ 374 static FLEXT_CLASSDEF(flext_obj) *__init__(int argc,t_atom *argv); \ 375 static void __free__(flext_hdr *hdr) { delete hdr->data; } \ 376 static void __setup__(flext_obj::t_classid classid) { \ 377 thisParent::__setup__(classid); \ 378 thisType::SETUPFUN(classid); \ 381 #define FLEXT_REALHDR_T(NEW_CLASS, PARENT_CLASS) \ 383 typedef NEW_CLASS thisType; \ 384 typedef PARENT_CLASS thisParent; \ 385 typedef typename thisParent::t_classid t_classid; \ 386 static FLEXT_CLASSDEF(flext_obj) *__init__(int argc,t_atom *argv); \ 387 static void __free__(flext_hdr *hdr) { delete hdr->data; } \ 388 static void __setup__(flext_obj::t_classid classid) { thisParent::__setup__(classid); } 391 #define FLEXT_REALHDR_TS(NEW_CLASS, PARENT_CLASS,SETUPFUN) \ 393 typedef NEW_CLASS thisType; \ 394 typedef PARENT_CLASS thisParent; \ 395 typedef typename thisParent::t_classid t_classid; \ 396 static FLEXT_CLASSDEF(flext_obj) *__init__(int argc,t_atom *argv); \ 397 static void __free__(flext_hdr *hdr) { delete hdr->data; } \ 398 static void __setup__(flext_obj::t_classid classid) { \ 399 thisParent::__setup__(classid); \ 400 thisType::SETUPFUN(classid); \ 405 #if defined(FLEXT_USE_HEX_SETUP_NAME) && defined(FLEXT_SYS_PD) 406 #define FLEXT_STPF_0(NAME) setup_##NAME 407 #define FLEXT_STPF_1(NAME) setup_##NAME 408 #elif FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX 409 #define FLEXT_STPF_0(NAME) NAME##_setup 410 #define FLEXT_STPF_1(NAME) NAME##_tilde_setup 412 #error Platform not supported 415 #define FLEXT_STPF_(DSP) FLEXT_STPF_##DSP 416 #define FLEXT_STPF(NAME,DSP) FLEXT_STPF_(DSP)(NAME) 423 #define REAL_SETUP(cl,DSP) extern void FLEXT_STPF(cl,DSP)(); FLEXT_STPF(cl,DSP)(); 425 #ifdef FLEXT_USE_NAMESPACE 426 #define _FLEXT_REAL_SETUP_NAME(NAME) ::##NAME##_setup 428 #define _FLEXT_REAL_SETUP_NAME(NAME) NAME##_setup 432 #if FLEXT_SYS == FLEXT_SYS_PD 433 # define REAL_LIB_SETUP(NAME,SETUPFUN) extern "C" FLEXT_EXT void _FLEXT_REAL_SETUP_NAME(NAME)() { flext_obj::lib_init(#NAME,SETUPFUN); } 434 #elif FLEXT_SYS == FLEXT_SYS_MAX 435 # define REAL_LIB_SETUP(NAME,SETUPFUN) extern "C" FLEXT_EXT int main() { flext_obj::lib_init(#NAME,SETUPFUN); return 0; } 437 # error Platform not supported 444 #define FLEXT_EXP_0 extern "C" FLEXT_EXT 446 #define FLEXT_EXP(LIB) FLEXT_EXP_##LIB 448 #if FLEXT_SYS == FLEXT_SYS_PD 449 #define FLEXT_OBJ_SETUP_0(NEW_CLASS,DSP) 450 #elif FLEXT_SYS == FLEXT_SYS_MAX 451 #define FLEXT_OBJ_SETUP_0(NEW_CLASS,DSP) extern "C" FLEXT_EXT int main() { FLEXT_STPF(NEW_CLASS,DSP)(); return 0; } 453 #error not implemented 456 #define FLEXT_OBJ_SETUP_1(NEW_CLASS,DSP) 458 #define FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) FLEXT_OBJ_SETUP_##LIB(NEW_CLASS,DSP) 466 #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX 468 #define FLEXTTPN_NULL A_NULL 469 #if FLEXT_SYS == FLEXT_SYS_PD 470 #define FLEXTTPN_PTR A_POINTER 472 #define FLEXTTPN_INT A_INT 473 #define FLEXTTPN_DEFINT A_DEFINT 475 #define FLEXTTPN_FLOAT A_FLOAT 476 #define FLEXTTPN_DEFFLOAT A_DEFFLOAT 477 #define FLEXTTPN_SYM A_SYMBOL 478 #define FLEXTTPN_DEFSYM A_DEFSYMBOL 479 #define FLEXTTPN_VAR A_GIMME 481 #define FLEXTTPN_NULL 0 482 #define FLEXTTPN_PTR 1 483 #define FLEXTTPN_INT 2 484 #define FLEXTTPN_FLOAT 3 485 #define FLEXTTPN_SYM 4 486 #define FLEXTTPN_VAR 5 487 #define FLEXTTPN_DEFINT 6 488 #define FLEXTTPN_DEFFLOAT 7 489 #define FLEXTTPN_DEFSYM 8 493 #define FLEXTTYPE_void FLEXTTPN_NULL 494 #define CALLBTYPE_void void 495 #define FLEXTTYPE_float FLEXTTPN_FLOAT 496 #define FLEXTTYPE_float0 FLEXTTPN_DEFFLOAT 497 #define CALLBTYPE_float float 498 #define FLEXTTYPE_t_float FLEXTTPN_FLOAT 499 #define CALLBTYPE_t_float t_float 501 #if FLEXT_SYS == FLEXT_SYS_PD 502 #define FLEXTTYPE_int FLEXTTPN_FLOAT 503 #define FLEXTTYPE_int0 FLEXTTPN_DEFFLOAT 504 #define CALLBTYPE_int float 505 #define FLEXTTYPE_bool FLEXTTPN_FLOAT 506 #define FLEXTTYPE_bool0 FLEXTTPN_DEFFLOAT 507 #define CALLBTYPE_bool float 508 #elif FLEXT_SYS == FLEXT_SYS_MAX 509 #define FLEXTTYPE_int FLEXTTPN_INT 510 #define FLEXTTYPE_int0 FLEXTTPN_DEFINT 511 #define CALLBTYPE_int int 512 #define FLEXTTYPE_bool FLEXTTPN_INT 513 #define FLEXTTYPE_bool0 FLEXTTPN_DEFINT 514 #define CALLBTYPE_bool int 516 #error Platform not supported 519 #define FLEXTTYPE_t_symptr FLEXTTPN_SYM 520 #define FLEXTTYPE_t_symptr0 FLEXTTPN_DEFSYM 521 #define CALLBTYPE_t_symptr t_symptr 522 #define FLEXTTYPE_t_symtype FLEXTTYPE_t_symptr 523 #define FLEXTTYPE_t_symtype0 FLEXTTYPE_t_symptr0 524 #define CALLBTYPE_t_symtype t_symptr 525 #define FLEXTTYPE_t_ptrtype FLEXTTPN_PTR 526 #define CALLBTYPE_t_ptrtype t_ptrtype 528 #define FLEXTTP(TP) FLEXTTYPE_ ## TP 529 #define CALLBTP(TP) CALLBTYPE_ ## TP 532 #define ARGMEMBER_bool(a) GetBool(a) 533 #define ARGMEMBER_bool0(a) ARGMEMBER_bool(a) 534 #define ARGMEMBER_int(a) GetInt(a) 535 #define ARGMEMBER_int0(a) ARGMEMBER_int(a) 536 #define ARGMEMBER_float(a) GetFloat(a) 537 #define ARGMEMBER_float0(a) ARGMEMBER_float(a) 538 #define ARGMEMBER_t_symptr(a) GetSymbol(a) 539 #define ARGMEMBER_t_symptr0(a) ARGMEMBER_t_symptr(a) 540 #define ARGMEMBER_t_symtype(a) ARGMEMBER_t_symptr(a) 541 #define ARGMEMBER_t_symtype0(a) ARGMEMBER_t_symptr0(a) 542 #define ARGCAST(a,tp) ARGMEMBER_##tp(a) 544 #define REAL_NEW(NAME,NEW_CLASS,DSP,NOI,LIB) \ 545 flext_obj *NEW_CLASS::__init__(int ,t_atom *) \ 547 return new NEW_CLASS; \ 549 FLEXT_EXP(LIB) void FLEXT_STPF(NEW_CLASS,DSP)() \ 551 flext_obj::obj_add(LIB,DSP,NOI,FLEXT_ATTRIBUTES,#NEW_CLASS,NAME,NEW_CLASS::__setup__,NEW_CLASS::__init__,&NEW_CLASS::__free__,FLEXTTPN_NULL); \ 553 FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) 555 #define REAL_NEW_V(NAME,NEW_CLASS,DSP,NOI,LIB) \ 556 flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \ 558 return new NEW_CLASS(argc,argv); \ 560 FLEXT_EXP(LIB) void FLEXT_STPF(NEW_CLASS,DSP)() \ 562 flext_obj::obj_add(LIB,DSP,NOI,FLEXT_ATTRIBUTES,#NEW_CLASS,NAME,NEW_CLASS::__setup__,NEW_CLASS::__init__,&NEW_CLASS::__free__,FLEXTTPN_VAR,FLEXTTPN_NULL); \ 564 FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) 566 #define REAL_NEW_1(NAME,NEW_CLASS,DSP,NOI,LIB, TYPE1) \ 567 flext_obj *NEW_CLASS::__init__(int,t_atom *argv) \ 569 return new NEW_CLASS(ARGCAST(argv[0],TYPE1)); \ 571 FLEXT_EXP(LIB) void FLEXT_STPF(NEW_CLASS,DSP)() \ 573 flext_obj::obj_add(LIB,DSP,NOI,FLEXT_ATTRIBUTES,#NEW_CLASS,NAME,NEW_CLASS::__setup__,NEW_CLASS::__init__,NEW_CLASS::__free__,FLEXTTP(TYPE1),FLEXTTPN_NULL); \ 575 FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) 577 #define REAL_NEW_2(NAME,NEW_CLASS,DSP,NOI,LIB, TYPE1,TYPE2) \ 578 flext_obj *NEW_CLASS::__init__(int,t_atom *argv) \ 580 return new NEW_CLASS(ARGCAST(argv[0],TYPE1),ARGCAST(argv[1],TYPE2)); \ 582 FLEXT_EXP(LIB) void FLEXT_STPF(NEW_CLASS,DSP)() \ 584 flext_obj::obj_add(LIB,DSP,NOI,FLEXT_ATTRIBUTES,#NEW_CLASS,NAME,NEW_CLASS::__setup__,NEW_CLASS::__init__,NEW_CLASS::__free__,FLEXTTP(TYPE1),FLEXTTP(TYPE2),FLEXTTPN_NULL); \ 586 FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) 588 #define REAL_NEW_3(NAME,NEW_CLASS,DSP,NOI,LIB, TYPE1, TYPE2, TYPE3) \ 589 flext_obj *NEW_CLASS::__init__(int,t_atom *argv) \ 591 return new NEW_CLASS(ARGCAST(argv[0],TYPE1),ARGCAST(argv[1],TYPE2),ARGCAST(argv[2],TYPE3)); \ 593 FLEXT_EXP(LIB) void FLEXT_STPF(NEW_CLASS,DSP)() \ 595 flext_obj::obj_add(LIB,DSP,NOI,FLEXT_ATTRIBUTES,#NEW_CLASS,NAME,NEW_CLASS::__setup__,NEW_CLASS::__init__,NEW_CLASS::__free__,FLEXTTP(TYPE1),FLEXTTP(TYPE2),FLEXTTP(TYPE3),FLEXTTPN_NULL); \ 597 FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) 599 #define REAL_NEW_4(NAME,NEW_CLASS,DSP,NOI,LIB, TYPE1,TYPE2, TYPE3, TYPE4) \ 600 flext_obj *NEW_CLASS::__init__(int,t_atom *argv) \ 602 return new NEW_CLASS(ARGCAST(argv[0],TYPE1),ARGCAST(argv[1],TYPE2),ARGCAST(argv[2],TYPE3),ARGCAST(argv[3],TYPE4)); \ 604 FLEXT_EXP(LIB) void FLEXT_STPF(NEW_CLASS,DSP)() \ 606 flext_obj::obj_add(LIB,DSP,NOI,FLEXT_ATTRIBUTES,#NEW_CLASS,NAME,NEW_CLASS::__setup__,NEW_CLASS::__init__,NEW_CLASS::__free__,FLEXTTP(TYPE1),FLEXTTP(TYPE2),FLEXTTP(TYPE3),FLEXTTP(TYPE4),FLEXTTPN_NULL); \ 608 FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB) 612 #define FLEXTARG_float a_float 613 #define FLEXTARG_int a_int 614 #define FLEXTARG_bool a_int 615 #define FLEXTARG_t_float a_float 616 #define FLEXTARG_t_symtype a_symbol 617 #define FLEXTARG_t_symptr a_symbol 618 #define FLEXTARG_t_ptrtype a_pointer 620 #define FLEXTARG(TP) FLEXTARG_ ## TP Definition: fllib.cpp:117
flext support functions and classes
std::map< const t_symbol *, FLEXT_TEMPINST(flext_class) * > LibMap
Definition: flbase.h:68
typedef FLEXT_TEMPINST(FLEXT_CLASSDEF(flext_obj)) flext_obj
#define FLEXT_ASSERT(b)
Definition: flstdc.h:284
FLEXT_TEMPLATE class FLEXT_SHARE FLEXT_CLASSDEF(flext_obj)
#define FLEXT_TEMPLATE
Definition: flprefix.h:455
The obligatory PD or Max/MSP object header.
Definition: flbase.h:38
#define FLEXT_SHARE
Definition: flprefix.h:418
Definition: fllib.cpp:138
Definitions to unite Max/MSP and PD notions.
t_sigobj obj
The obligatory object header.
Definition: flbase.h:48