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
135
136
137
138
139
140
141
142
143
144
145
146
|
/*
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();
protected:
const t_symbol *bufname;
buffer *buf;
// bind object
void m_bind(const t_symbol *s);
// unbind object
void m_unbind(const t_symbol *s);
// bind method
void m_bindmethod(const t_symbol *s);
// unbind method
void m_unbindmethod(const t_symbol *s);
// forward message
void m_forward(const t_symbol *s,int argc,const t_atom *argv);
// method for symbol-bound messages
void m_bound(const t_symbol *sym,int argc,const t_atom *argv,void *data);
// method for binding test
void m_test(float value);
private:
static void setup(t_classid c);
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)
void bind1::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
}
bind1::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
}
void bind1::m_bind(const t_symbol *s)
{
if(!Bind(s)) {
post("%s (%s) - Binding failed",thisName(),GetString(thisTag()));
}
}
void bind1::m_unbind(const t_symbol *s)
{
if(!Unbind(s)) {
post("%s (%s) - Binding failed",thisName(),GetString(thisTag()));
}
}
void bind1::m_bindmethod(const t_symbol *s)
{
if(!FLEXT_BINDMETHOD(s,m_bound,NULL)) {
post("%s (%s) - Binding failed",thisName(),GetString(thisTag()));
}
}
void bind1::m_unbindmethod(const t_symbol *s)
{
if(!FLEXT_UNBINDMETHOD(s)) {
post("%s (%s) - Binding failed",thisName(),GetString(thisTag()));
}
}
void bind1::m_forward(const t_symbol *s,int argc,const t_atom *argv)
{
Forward(s,argc,argv);
}
void bind1::m_bound(const t_symbol *sym,int argc,const t_atom *argv,void *data)
{
ToOutAnything(0,sym,argc,argv);
}
void bind1::m_test(float value)
{
post("%s - TEST METHOD: value %f",thisName(),value);
}
|