57 void receive_return_model_address(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
59 #ifdef JCOM_RECEIVE_TILDE
62 t_int* receive_perform(t_int *w);
65 void receive_dsp(
TTPtr self, t_signal **sp,
short *count);
68 void receive_perform64(
TTPtr self, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam);
71 void receive_dsp64(
TTPtr self, t_object *dsp64,
short *count,
double samplerate,
long maxvectorsize,
long flags);
75 void receive_return_address(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
76 void receive_return_value(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
97 ModularSpec *spec =
new ModularSpec;
103 #ifdef JCOM_RECEIVE_TILDE
113 class_addmethod(c->maxClass, (method)
receive_assist,
"assist", A_CANT, 0L);
115 class_addmethod(c->maxClass, (method)receive_return_model_address,
"return_model_address", A_CANT, 0);
117 #ifdef JCOM_RECEIVE_TILDE
118 class_addmethod(c->maxClass, (method)receive_dsp,
"dsp", A_GIMME, 0);
119 class_addmethod(c->maxClass, (method)receive_dsp64,
"dsp64", A_CANT, 0);
121 class_addmethod(c->maxClass, (method)receive_return_address,
"return_address", A_CANT, 0);
122 class_addmethod(c->maxClass, (method)receive_return_value,
"return_value", A_CANT, 0);
124 class_addmethod(c->maxClass, (method)
receive_bang,
"bang", 0);
127 class_addmethod(c->maxClass, (method)
receive_address,
"address", A_SYM, 0);
131 #pragma mark Object life
137 long attrstart = attr_args_offset(argc, argv);
141 if (attrstart && argv)
142 address = atom_getsym(argv);
144 address = _sym_nothing;
155 x->
outlets = (TTHandle)sysmem_newptr(
sizeof(
TTPtr) * 2);
157 #ifdef JCOM_RECEIVE_TILDE
160 dsp_setup((t_pxobject *)x, 1);
161 x->
obj.z_misc = Z_NO_INPLACE | Z_PUT_FIRST;
163 x->
outlets[address_out] = outlet_new(x, NULL);
164 x->
outlets[data_out] = outlet_new((t_pxobject *)x,
"signal");
168 x->
outlets[address_out] = outlet_new(x, NULL);
169 x->
outlets[data_out] = outlet_new(x, NULL);
173 attr_args_process(x, argc, argv);
180 object_obex_dumpout((t_object*)x, gensym(
"address"), 1, a);
182 JamomaDebug object_post((t_object*)x,
"binds on %s", x->
address.
c_str());
199 #ifdef JCOM_RECEIVE_TILDE
202 dsp_free((t_pxobject *)x);
207 #pragma mark NodeLib association
215 TTAddress absoluteAddress, returnedAddress;
220 if (x->
address == kTTAdrsEmpty)
231 contextAddress = v[0];
242 object_obex_dumpout((t_object*)x, gensym(
"address"), 1, a);
251 makeInternals_receiver(x, contextAddress,
TTSymbol(
"/model:address"), gensym(
"return_model_address"), anObject, x->
patcherContext == kTTSym_view);
264 contextAddress = kTTAdrsRoot;
268 atom_setsym(a, gensym((
char*)absoluteAddress.
c_str()));
269 object_obex_dumpout((t_object*)x, gensym(
"address"), 1, a);
284 if (x->
index > 100) {
285 object_error((t_object*)x,
"tries to bind too many times on %s", x->
address.
c_str());
286 object_obex_dumpout((t_object*)x, gensym(
"error"), 0, NULL);
296 void receive_return_model_address(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
309 atom_setsym(a, gensym((
char*)absoluteAddress.
c_str()));
310 object_obex_dumpout((t_object*)x, gensym(
"address"), 1, a);
312 JamomaDebug object_post((t_object*)x,
"binds on %s", absoluteAddress.
c_str());
316 #ifndef JCOM_RECEIVE_TILDE
317 void receive_return_address(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
321 outlet_anything(x->
outlets[address_out], msg, argc, argv);
324 void receive_return_value(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
330 if (msg == _sym_nothing)
331 outlet_atoms(x->
outlets[data_out], argc, argv);
333 outlet_anything(x->
outlets[data_out], msg, argc, argv);
338 #pragma mark Methods bound to input/inlets
344 strcpy(dst,
"address of node");
348 #ifdef JCOM_RECEIVE_TILDE
349 strcpy(dst,
"(signal) node value");
351 strcpy(dst,
"node value");
355 strcpy(dst,
"address output");
358 strcpy(dst,
"dumpout");
364 #ifndef JCOM_RECEIVE_TILDE
372 object_obex_dumpout(
self, _sym_error, 0, NULL);
394 aReceiver.
set(kTTSym_address, kTTAdrsEmpty);
414 object_obex_dumpout((t_object*)x, gensym(
"address"), 1, a);
416 JamomaDebug object_post((t_object*)x,
"binds on %s", x->
address.
c_str());
425 #pragma mark Methods relating to audio processing
427 #ifdef JCOM_RECEIVE_TILDE
430 t_int *receive_perform(t_int *w)
434 TTListPtr objectCache = NULL;
444 if (x->
obj.z_disabled || !active)
450 aReceiver->
mSignal.
get(kTTSym_vectorSize, vectorSize);
456 if (!x->wrappedObject.get(kTTSym_objectCache, v)) {
458 objectCache = TTListPtr((
TTPtr)v[0]);
463 for (objectCache->begin(); objectCache->end(); objectCache->next()) {
465 anObject = objectCache->current()[0];
467 if (anObject.
valid()) {
470 if (anObject.
name() == kTTSym_OutputAudio) {
473 TTOutputPtr(anObject.
instance())->mSignalOut.
get(kTTSym_vectorSize, vectorSize);
480 else if (anObject.
name() == kTTSym_InputAudio) {
483 TTInputPtr(anObject.
instance())->mSignalOut.
get(kTTSym_vectorSize, vectorSize);
490 else if (anObject.
name() == kTTSym_Data) {
493 anObject.
get(kTTSym_value, v);
515 void receive_perform64(
TTPtr self, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam)
519 TTListPtr objectCache = NULL;
529 if (x->
obj.z_disabled || !active) {
534 aReceiver->
mSignal.
get(kTTSym_vectorSize, vectorSize);
546 aReceiver->
mSignal.
get(kTTSym_vectorSize, vectorSize);
554 objectCache = TTListPtr((
TTPtr)v[0]);
559 for (objectCache->begin(); objectCache->end(); objectCache->next()) {
561 anObject = objectCache->current()[0];
563 if (anObject.
valid()) {
566 if (anObject.
name() == kTTSym_OutputAudio) {
569 TTOutputPtr(anObject.
instance())->mSignalOut.
get(kTTSym_vectorSize, vectorSize);
576 else if (anObject.
name() == kTTSym_InputAudio) {
579 TTInputPtr(anObject.
instance())->mSignalOut.
get(kTTSym_vectorSize, vectorSize);
586 else if (anObject.
name() == kTTSym_Data) {
589 anObject.
get(kTTSym_value, v);
607 void receive_dsp(
TTPtr self, t_signal **sp,
short *count)
611 void** audioVectors = NULL;
616 audioVectors = (
void**)sysmem_newptr(
sizeof(
void*) * 3);
619 if (count[0] || count[1]) {
620 if (sp[0]->s_n > vectorSize)
621 vectorSize = sp[0]->s_n;
623 audioVectors[1] = sp[0]->s_vec;
624 audioVectors[2] = sp[1]->s_vec;
628 aReceiver->
mSignal.
set(kTTSym_numChannels, 1);
629 aReceiver->
mSignal.
set(kTTSym_vectorSize, vectorSize);
634 dsp_addv(receive_perform, 3, audioVectors);
635 sysmem_freeptr(audioVectors);
640 void receive_dsp64(
TTPtr self, t_object *dsp64,
short *count,
double samplerate,
long maxvectorsize,
long flags)
648 aReceiver->
mSignal.
set(kTTSym_numChannels, 1);
654 object_method(dsp64, gensym(
"dsp_add64"), x, receive_perform64, 0, NULL);
658 #endif // JCOM_RECEIVE_TILDE
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...
int C74_EXPORT main(void)
Set up this class as a Max external the first time an object of this kind is instantiated.
bool TTBoolean
Boolean flag, same as Boolean on the Mac.
std::uint16_t TTUInt16
16 bit unsigned integer
TTErr send(const TTSymbol aName)
Send a message to this object with no arguments.
TTAddress appendAttribute(TTSymbol anAttribute)
Return a new TTAddress with attribute part.
TTHandle outlets
an array of outlet
TTErr wrapTTModularClassAsMaxClass(TTSymbol &ttblueClassName, const char *maxClassName, WrappedClassPtr *c, ModularSpec *specificities)
Wrap a Jamoma class as a Max class.
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, ...)
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 receive_subscribe(TTPtr self)
Associate j.receive(~) with NodeLib.
TTErr getAttributeValue(const TTSymbol name, TTValue &value)
Get an attribute value for an object.
t_object * patcherPtr
the patcher in which the external is (ignoring subpatcher)
this flag means that an address have no leading slash
TTHashPtr internals
An hash table to store any internal TTObjectBases (like TTData, TTViewer, ...)
void WrappedReceiverClass_new(TTPtr self, long argc, t_atom *argv)
Wrapper for the j.receive constructor class, called when an instance is created.
void * TTPtr
A generic pointer.
TTErr get(const TTSymbol aName, T &aReturnedValue) const
Get an attribute value for an object.
void WrapTTReceiverClass(WrappedClassPtr c)
Wrap the j.receive class as a Max object.
TTSymbol name() const
Return the name of this class.
t_object obj
Max control object header.
TTErr set(const TTSymbol aName, T aValue)
Set an attribute value for an object.
The TTSymbol class is used to represent a string and efficiently pass and compare that string...
void receive_address(TTPtr self, t_symbol *address)
address message handler for j.receive.
float TTFloat32
32 bit floating point number
void receive_assist(TTPtr self, void *b, long msg, long arg, char *dst)
Assistance Method.
TTObject wrappedObject
The instance of the Jamoma object we are wrapping.
The TTAudioSignal class represents N vectors of audio samples for M channels.
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.
void WrappedReceiverClass_free(TTPtr self)
Wrapper for the j.receive deconstructor class, called when an instance is destroyed.
void receive_bang(TTPtr self)
bang handler for j.receive
Data Structure for this object.
TTAddressType getType()
Get the type.
TTErr remove(const TTSymbol key)
Remove an item from the hash table.
TTErr
Jamoma Error Codes Enumeration of error codes that might be returned by any of the TTBlue functions a...
Wraps Jamoma Core classes as objects for Max/MSP.
TTErr get(const TTSymbol aName, T &aReturnedValue)
Get an attribute value for an object This is the same as calling getAttributeValue().
TTSymbol patcherContext
the patcher context in which the external is (model, view)
TTSymbol patcherName
the patcher name in which the external is
TTObjectBase * instance() const
Return a direct pointer to the internal instance.
long index
index of the inlet used
TTObject mSignal
any data structure to receive complex signal
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]