37 typedef struct extra {
51 #define EXTRA ((t_extra*)x->extra)
59 void WrapTTViewerClass(WrappedClassPtr c);
60 void WrappedViewerClass_new(
TTPtr self,
long argc, t_atom *argv);
61 void WrappedViewerClass_free(
TTPtr self);
62 void WrappedViewerClass_anything(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
64 void remote_assist(
TTPtr self,
void *b,
long msg,
long arg,
char *dst);
66 void remote_return_value(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
67 void remote_return_model_address(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
68 void remote_return_description(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
70 void remote_bang(
TTPtr self);
71 void remote_float(
TTPtr self, t_float value);
72 TTErr remote_list(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
74 void remote_set(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
76 void remote_address(
TTPtr self, t_symbol *address);
77 void remote_loadbang(
TTPtr self);
79 void remote_attach(
TTPtr self,
int attach_output_id);
80 void remote_mousemove(
TTPtr self, t_object *patcherview, t_pt pt,
long modifiers);
81 void remote_mouseleave(
TTPtr self, t_object *patcherview, t_pt pt,
long modifiers);
82 void remote_mousedown(
TTPtr self, t_object *patcherview, t_pt pt,
long modifiers);
84 void remote_subscribe(
TTPtr self);
86 void remote_ui_queuefn(
TTPtr self);
88 extern "C" void JAMOMA_EXPORT_MAXOBJ setup_j0x2eremote(
void)
90 ModularSpec *spec =
new ModularSpec;
91 spec->_wrap = &WrapTTViewerClass;
92 spec->_new = &WrappedViewerClass_new;
93 spec->_free = &WrappedViewerClass_free;
94 spec->_any = &WrappedViewerClass_anything;
100 void WrapTTViewerClass(WrappedClassPtr c)
102 eclass_addmethod(c->pdClass, (method)remote_assist,
"assist", A_CANT, 0L);
108 eclass_addmethod(c->pdClass, (method)remote_return_value,
"return_value", A_CANT, 0);
109 eclass_addmethod(c->pdClass, (method)remote_return_model_address,
"return_model_address", A_CANT, 0);
110 eclass_addmethod(c->pdClass, (method)remote_return_description,
"return_description", A_CANT, 0);
112 eclass_addmethod(c->pdClass, (method)remote_bang,
"bang", A_NULL, 0L);
113 eclass_addmethod(c->pdClass, (method)remote_float,
"float", A_FLOAT, 0L);
114 eclass_addmethod(c->pdClass, (method)remote_list,
"list", A_GIMME, 0L);
116 eclass_addmethod(c->pdClass, (method)remote_set,
"set", A_GIMME, 0L);
118 eclass_addmethod(c->pdClass, (method)remote_address,
"address", A_SYM, 0);
119 eclass_addmethod(c->pdClass, (method)remote_loadbang,
"loadbang", A_NULL, 0);
122 void WrappedViewerClass_new(
TTPtr self,
long argc, t_atom *argv)
126 long attrstart = attr_args_offset(argc, argv);
129 if (attrstart > 0 && argv)
130 address = atom_getsym(argv);
132 address = _sym_nothing;
142 if (attrstart == 2 && argv)
143 EXTRA->name =
TTAddress(atom_getsym(argv+1)->s_name);
145 EXTRA->name = kTTAdrsEmpty;
147 EXTRA->connected = NULL;
150 EXTRA->color0 = (t_atom*)sysmem_newptr(
sizeof(t_atom) * 4);
151 atom_setfloat(EXTRA->color0, 0);
152 atom_setfloat(EXTRA->color0+1, 0.);
153 atom_setfloat(EXTRA->color0+2, 0.);
154 atom_setfloat(EXTRA->color0+3, 1.);
156 EXTRA->color1 = (t_atom*)sysmem_newptr(
sizeof(t_atom) * 4);
157 atom_setfloat(EXTRA->color1, 0.62);
158 atom_setfloat(EXTRA->color1+1, 0.);
159 atom_setfloat(EXTRA->color1+2, 0.36);
160 atom_setfloat(EXTRA->color1+3, 0.70);
167 x->
outlets = (TTHandle)sysmem_newptr(
sizeof(
TTPtr) * 3);
168 x->
outlets[set_out] = outlet_new((t_object*)x, NULL);
169 x->
outlets[value_out] = outlet_new((t_object*)x, NULL);
170 x->
outlets[attach_out] = outlet_new((t_object*)x, NULL);
174 EXTRA->ui_clock = clock_new(x,(t_method)remote_ui_queuefn);
181 attr_args_process(x, argc, argv);
191 void remote_assist(
TTPtr self,
void *b,
long msg,
long arg,
char *dst)
194 strcpy(dst,
"input");
198 strcpy(dst,
"set: connect to ui object");
201 strcpy(dst,
"value");
204 strcpy(dst,
"attach: connect this outlet to ui object if the set or the value outlets are not directly connected to it");
207 strcpy(dst,
"dumpout");
213 void WrappedViewerClass_free(
TTPtr self)
217 clock_unset(EXTRA->ui_clock);
218 clock_free(EXTRA->ui_clock);
225 void remote_subscribe(
TTPtr self)
231 TTAddress absoluteAddress, returnedAddress;
237 if (x->
address == kTTAdrsEmpty)
243 remote_attach(
self, set_out);
253 makeInternals_receiver(x, absoluteAddress,
TTSymbol(
":description"), gensym(
"return_description"), anObject, YES);
267 if (EXTRA->name == kTTAdrsEmpty)
308 contextAddress = v[0];
311 makeInternals_receiver(x, contextAddress,
TTSymbol(
"model:address"), gensym(
"return_model_address"), anObject, x->
patcherContext == kTTSym_view);
318 contextAddress = kTTAdrsRoot;
322 atom_setsym(a, gensym((
char*)absoluteAddress.
c_str()));
323 outlet_anything((t_outlet*)x->dumpOut, gensym(
"address"), 1, a);
328 makeInternals_receiver(x, absoluteAddress,
TTSymbol(
":description"), gensym(
"return_description"), anObject, YES);
348 if (x->
index > 100) {
349 pd_error((t_object*)x,
"couldn't bind to j.parameter %s", x->
address.
c_str());
350 outlet_anything((t_outlet*)x->dumpOut, gensym(
"error"), 0, NULL);
361 void remote_return_value(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
366 if (EXTRA->setting) {
372 if (msg == _sym_nothing)
373 outlet_anything((t_outlet*)x->
outlets[value_out], NULL, argc, argv);
375 outlet_anything((t_outlet*)x->
outlets[value_out], msg, argc, argv);
380 clock_set(EXTRA->ui_clock,10);
383 void remote_ui_queuefn(
TTPtr self)
387 if (x->argc && x->argv)
388 outlet_anything((t_outlet*)x->
outlets[set_out], _sym_set, x->argc, x->argv);
391 void remote_bang(
TTPtr self)
393 remote_list(
self, _sym_bang, 0, NULL);
396 void remote_float(
TTPtr self, t_float value)
400 atom_setfloat(&a, value);
401 remote_list(
self, _sym_float, 1, &a);
404 TTErr remote_list(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
411 void remote_set(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
415 EXTRA->setting = YES;
417 if (remote_list(
self, _sym_nothing, argc, argv))
422 void WrappedViewerClass_anything(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
430 void remote_return_model_address(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
449 makeInternals_receiver(x, absoluteAddress,
TTSymbol(
":description"), gensym(
"return_description"), anObject, YES);
456 atom_setsym(a, gensym((
char*)absoluteAddress.
c_str()));
457 outlet_anything((t_outlet*)x->dumpOut, gensym(
"address"), 1, a);
459 JamomaDebug logpost((t_object*)x,3,
"binds on %s", absoluteAddress.
c_str());
463 void remote_return_description(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
475 void remote_address(
TTPtr self, t_symbol *address)
485 remote_subscribe(
self);
488 void remote_loadbang(
TTPtr self)
491 remote_subscribe(
self);
494 void remote_attach(
TTPtr self,
int attach_output_id)
497 t_outlet *myoutlet = NULL;
498 t_dll *connecteds = NULL;
499 t_object *object, *box;
500 t_symbol *maxclass = NULL;
550 if (!connecteds || !
object || !maxclass) {
553 if (attach_output_id == set_out)
556 return remote_attach(
self, value_out);
559 else if (attach_output_id == value_out)
562 return remote_attach(
self, attach_out);
TTAddress appendAddress(const TTAddress &toAppend)
Return a new TTAddress with the appended part.
TTObject subscriberObject
The instance of a TTSubscriber object used to register the wrapped object in the tree structure...
bool TTBoolean
Boolean flag, same as Boolean on the Mac.
TTSymbol & getInstance()
Get the instance part.
TTAddress appendAttribute(TTSymbol anAttribute)
Return a new TTAddress with attribute part.
TTHandle outlets
an array of outlet
TTErr lookup(const TTSymbol key, TTValue &value)
Find the value for the given key.
We build a directory of TTNodes, and you can request a pointer for any TTNode, or add an observer to ...
TTAddress address
sometime external needs to store an address (e.g. send, receive, view, ...)
TTAddress getParent()
Get a pointer to the parent address.
TTSymbol patcherClass
the patcher class in which the external is
The TTAddress class is used to represent a string and efficiently pass and compare that string...
Create and use Jamoma object instances.
void * extra
used to keep very specific things
t_object * patcherPtr
the patcher in which the external is (ignoring subpatcher)
TTHashPtr internals
An hash table to store any internal TTObjectBases (like TTData, TTViewer, ...)
void * TTPtr
A generic pointer.
TTErr get(const TTSymbol aName, T &aReturnedValue) const
Get an attribute value for an object.
TTErr set(const TTSymbol aName, T aValue)
Set an attribute value for an object.
void copy_msg_argc_argv(TTPtr self, t_symbol *msg, long argc, const t_atom *argv)
tools to copy msg, argc and argv into the member msg, argc and argv of the WrappedModularInstance ...
The TTSymbol class is used to represent a string and efficiently pass and compare that string...
TTObject wrappedObject
The instance of the Jamoma object we are wrapping.
TTSymbol & getAttribute()
Get the attribute part.
this flag means that an address have a leading slash
const char * c_str() const
Return a pointer to the internal string as a C-string.
Wraps Jamoma Core classes as objects for PureData.
Data Structure for this object.
TTAddressType getType()
Get the type.
TTErr
Jamoma Error Codes Enumeration of error codes that might be returned by any of the TTBlue functions a...
TTSymbol patcherContext
the patcher context in which the external is (model, view)
TTSymbol patcherName
the patcher name in which the external is
long index
index of the inlet used
TTBoolean valid() const
Determine if the object contained by this TTObject is truly ready for use.
TTSymbol & getName()
Get the name part.
WrappedModularInstance * WrappedModularInstancePtr
Pointer to a wrapped instance of our object.
[doxygenAppendixC_copyExample]
TTErr wrapTTModularClassAsPdClass(TTSymbol &ttblueClassName, const char *pdClassName, WrappedClassPtr *c, ModularSpec *specificities)
Wrap a Jamoma class as a Pd class.