1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
/*
flext tutorial - bind 1
Copyright (c) 2003 Thomas Grill (xovo@gmx.net)
For information on usage and redistribution, and for a DISCLAIMER OF ALL
WARRANTIES, see the file, "license.txt," in this distribution.
-------------------------------------------------------------------------
This is an example of a simple object demonstrating method to symbol binding and message forwarding
*/
// include flext header
#include <flext.h>
// check for appropriate flext version
#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 400)
#error You need at least flext version 0.4.0
#endif
// define the class that stands for a pd/Max object
class bind1:
// inherit from basic flext class
public flext_base
{
// obligatory flext header (class name,base class name) featuring a setup function
FLEXT_HEADER_S(bind1,flext_base,setup)
public:
// constructor with no arguments
bind1()
{
// define inlets:
// first inlet must always be of type anything (or signal for dsp objects)
AddInAnything("message inlet"); // add one inlet for any message
AddInAnything("forwarding inlet"); // add one inlet for any message
AddOutAnything("bound message"); // output received bound message
}
/*
no destructor necessary here:
flext frees all eventually remaining bound symbols when the object is destroyed
(but NOT the data that can be passed via the FLEXT_BINDMETHOD call!)
*/
protected:
const t_symbol *bufname;
buffer *buf;
// bind object
void m_bind(const t_symbol *s)
{
if(!Bind(s)) {
post("%s (%s) - Binding failed",thisName(),GetString(thisTag()));
}
}
// unbind object
void m_unbind(const t_symbol *s)
{
if(!Unbind(s)) {
post("%s (%s) - Binding failed",thisName(),GetString(thisTag()));
}
}
// bind method
void m_bindmethod(const t_symbol *s)
{
if(!FLEXT_BINDMETHOD(s,m_bound,NULL)) {
post("%s (%s) - Binding failed",thisName(),GetString(thisTag()));
}
}
// unbind method
void m_unbindmethod(const t_symbol *s)
{
if(!FLEXT_UNBINDMETHOD(s)) {
post("%s (%s) - Binding failed",thisName(),GetString(thisTag()));
}
}
// forward message
void m_forward(const t_symbol *s,int argc,const t_atom *argv)
{
Forward(s,argc,argv);
}
// method for symbol-bound messages
void m_bound(const t_symbol *sym,int argc,const t_atom *argv,void *data)
{
ToOutAnything(0,sym,argc,argv);
}
// method for binding test
void m_test(float value)
{
post("%s - TEST METHOD: value %f",thisName(),value);
}
private:
static void setup(t_classid c)
{
// register methods
FLEXT_CADDMETHOD_(c,0,"bind",m_bind); // register method "bind" for inlet 0
FLEXT_CADDMETHOD_(c,0,"unbind",m_unbind); // register method "unbind" for inlet 0
FLEXT_CADDMETHOD_(c,0,"bindmethod",m_bindmethod); // register method "bindmethod" for inlet 0
FLEXT_CADDMETHOD_(c,0,"unbindmethod",m_unbindmethod); // register method "unbindmethod" for inlet 0
FLEXT_CADDMETHOD_(c,0,"test",m_test); // register method m_test for inlet 0
FLEXT_CADDMETHOD(c,1,m_forward); // register method m_forward for inlet 1
}
FLEXT_CALLBACK_S(m_bind) // wrapper for method m_bind (with symbol argument)
FLEXT_CALLBACK_S(m_unbind) // wrapper for method m_unbind (with symbol argument)
FLEXT_CALLBACK_S(m_bindmethod) // wrapper for method m_bindmethod (with symbol argument)
FLEXT_CALLBACK_S(m_unbindmethod) // wrapper for method m_unbindmethod (with symbol argument)
FLEXT_CALLBACK_A(m_forward) // wrapper for method m_forward (with anything argument)
FLEXT_CALLBACK_AX(m_bound) // wrapper for method m_bound (anything+data arguments)
FLEXT_CALLBACK_F(m_test) // wrapper for method m_test (one float argument)
};
// instantiate the class
FLEXT_NEW("bind1",bind1)
|