50#if FLEXT_SYS == FLEXT_SYS_PD
55#if FLEXT_SYS == FLEXT_SYS_MAX
113 virtual ~FLEXT_CLASSDEF(flext_obj)();
118 static void InitProblem() { init_ok =
false; }
130 virtual bool Finalize();
144 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;
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) \
363typedef NEW_CLASS thisType; \
364typedef PARENT_CLASS thisParent; \
365static FLEXT_TEMPINST(FLEXT_CLASSDEF(flext_obj)) *__init__(int argc,t_atom *argv); \
366static void __free__(flext_hdr *hdr) { delete hdr->data; } \
367static void __setup__(flext_obj::t_classid classid) { thisParent::__setup__(classid); }
370#define FLEXT_REALHDR_S(NEW_CLASS, PARENT_CLASS,SETUPFUN) \
372typedef NEW_CLASS thisType; \
373typedef PARENT_CLASS thisParent; \
374static FLEXT_TEMPINST(FLEXT_CLASSDEF(flext_obj)) *__init__(int argc,t_atom *argv); \
375static void __free__(flext_hdr *hdr) { delete hdr->data; } \
376static void __setup__(flext_obj::t_classid classid) { \
377 thisParent::__setup__(classid); \
378 thisType::SETUPFUN(classid); \
381#define FLEXT_REALHDR_T(NEW_CLASS, PARENT_CLASS) \
383typedef NEW_CLASS thisType; \
384typedef PARENT_CLASS thisParent; \
385typedef typename thisParent::t_classid t_classid; \
386static FLEXT_TEMPINST(FLEXT_CLASSDEF(flext_obj)) *__init__(int argc,t_atom *argv); \
387static void __free__(flext_hdr *hdr) { delete hdr->data; } \
388static void __setup__(flext_obj::t_classid classid) { thisParent::__setup__(classid); }
391#define FLEXT_REALHDR_TS(NEW_CLASS, PARENT_CLASS,SETUPFUN) \
393typedef NEW_CLASS thisType; \
394typedef PARENT_CLASS thisParent; \
395typedef typename thisParent::t_classid t_classid; \
396static FLEXT_TEMPINST(FLEXT_CLASSDEF(flext_obj)) *__init__(int argc,t_atom *argv); \
397static void __free__(flext_hdr *hdr) { delete hdr->data; } \
398static 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) \
545flext_obj *NEW_CLASS::__init__(int ,t_atom *) \
547 return new NEW_CLASS; \
549FLEXT_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); \
553FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB)
555#define REAL_NEW_V(NAME,NEW_CLASS,DSP,NOI,LIB) \
556flext_obj *NEW_CLASS::__init__(int argc,t_atom *argv) \
558 return new NEW_CLASS(argc,argv); \
560FLEXT_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); \
564FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB)
566#define REAL_NEW_1(NAME,NEW_CLASS,DSP,NOI,LIB, TYPE1) \
567flext_obj *NEW_CLASS::__init__(int,t_atom *argv) \
569 return new NEW_CLASS(ARGCAST(argv[0],TYPE1)); \
571FLEXT_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); \
575FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB)
577#define REAL_NEW_2(NAME,NEW_CLASS,DSP,NOI,LIB, TYPE1,TYPE2) \
578flext_obj *NEW_CLASS::__init__(int,t_atom *argv) \
580 return new NEW_CLASS(ARGCAST(argv[0],TYPE1),ARGCAST(argv[1],TYPE2)); \
582FLEXT_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); \
586FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB)
588#define REAL_NEW_3(NAME,NEW_CLASS,DSP,NOI,LIB, TYPE1, TYPE2, TYPE3) \
589flext_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)); \
593FLEXT_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); \
597FLEXT_OBJ_SETUP(NEW_CLASS,DSP,LIB)
599#define REAL_NEW_4(NAME,NEW_CLASS,DSP,NOI,LIB, TYPE1,TYPE2, TYPE3, TYPE4) \
600flext_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)); \
604FLEXT_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); \
608FLEXT_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:140
Definition: fllib.cpp:118
std::map< const t_symbol *, FLEXT_TEMPINST(flext_class) * > LibMap
Definition: flbase.h:70
FLEXT_TEMPLATE class FLEXT_SHARE FLEXT_CLASSDEF(flext_obj)
typedef FLEXT_TEMPINST(FLEXT_CLASSDEF(flext_obj)) flext_obj
#define FLEXT_SHARE
Definition: flprefix.h:425
#define FLEXT_TEMPLATE
Definition: flprefix.h:462
Definitions to unite Max/MSP and PD notions.
#define FLEXT_ASSERT(b)
Definition: flstdc.h:316
flext support functions and classes
t_sigobj obj
The obligatory object header.
Definition: flbase.h:48
FLEXT_TEMPINST(FLEXT_CLASSDEF(flext_obj)) *data
This points to the actual polymorphic C++ class.
The obligatory PD or Max/MSP object header.
Definition: flbase.h:39