20 #ifdef JCOM_SEND_TILDE
22 #define info_numChannels 0
23 #define info_vectorSize 1
70 #ifdef JCOM_SEND_TILDE
73 t_int* send_perform(t_int *w);
76 void send_dsp(
TTPtr self, t_signal **sp,
short *count);
79 void send_perform64(
TTPtr self, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam);
82 void send_dsp64(
TTPtr self, t_object *dsp64,
short *count,
double samplerate,
long maxvectorsize,
long flags);
113 void send_list(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
145 extern "C" void JAMOMA_EXPORT_MAXOBJ setup_j0x2esend(
void)
147 ModularSpec *spec =
new ModularSpec;
151 #ifdef JCOM_SEND_TILDE
157 #ifdef JCOM_SEND_TILDE
166 eclass_addmethod(c->pdClass, (method)
send_assist,
"assist", A_CANT, 0L);
170 #ifdef JCOM_SEND_TILDE
171 eclass_addmethod(c->pdClass, (method)send_dsp,
"dsp", A_CANT, 0L);
172 eclass_addmethod(c->pdClass, (method)send_dsp64,
"dsp64", A_CANT, 0);
174 eclass_addmethod(c->pdClass, (method)
send_bang,
"bang", A_NULL, 0L);
175 eclass_addmethod(c->pdClass, (method)
send_int,
"int", A_LONG, 0L);
176 eclass_addmethod(c->pdClass, (method)
send_float,
"float", A_FLOAT, 0L);
177 eclass_addmethod(c->pdClass, (method)
send_list,
"list", A_GIMME, 0L);
181 eclass_addmethod(c->pdClass, (method)
send_address,
"address", A_SYM, 0L);
183 eclass_addmethod(c->pdClass, (method)
send_subscribe,
"loadbang", A_NULL, 0);
188 #pragma mark Object life
194 long attrstart = attr_args_offset(argc, argv);
198 if (attrstart && argv)
199 address = atom_getsym(argv);
201 address = _sym_nothing;
212 #ifdef JCOM_SEND_TILDE
217 dsp_setup((t_pxobject *)x, 1);
218 x->
obj.z_misc = Z_NO_INPLACE | Z_PUT_FIRST;
224 x->dumpOut = outlet_new((t_object*)x,NULL);
226 attr_args_process(x, argc, argv);
234 outlet_anything((t_outlet*)x->dumpOut, gensym(
"address"), 1, a);
251 #ifdef JCOM_SEND_TILDE
254 dsp_free((t_pxobject *)x);
259 #pragma mark NodeLib association
267 TTAddress absoluteAddress, returnedAddress;
272 if (x->
address == kTTAdrsEmpty)
283 contextAddress = v[0];
291 makeInternals_receiver(x, contextAddress,
TTSymbol(
"/model:address"), gensym(
"return_model_address"), anObject, x->
patcherContext == kTTSym_view);
303 contextAddress = kTTAdrsRoot;
307 atom_setsym(a, gensym((
char*)absoluteAddress.
c_str()));
308 outlet_anything((t_outlet*)x->dumpOut, gensym(
"address"), 1, a);
323 pd_error((t_object*)x,
"j.send : tries to bind too many times on %s", x->
address.
c_str());
324 outlet_anything((t_outlet*)x->dumpOut, gensym(
"error"), 0, NULL);
348 atom_setsym(a, gensym((
char*)absoluteAddress.
c_str()));
349 outlet_anything((t_outlet*)x->dumpOut, gensym(
"address"), 1, a);
351 JamomaDebug logpost((t_object*)x, 3,
"binds on %s", absoluteAddress.
c_str());
356 #pragma mark Methods bound to input/inlets
365 strcpy(dst,
"dumpout");
371 #ifndef JCOM_SEND_TILDE
382 atom_setlong(&a, value);
390 atom_setfloat(&a, value);
399 if (x->
address == kTTAdrsEmpty) {
411 newMsg = _sym_nothing;
414 else if (atom_gettype(argv) == A_LONG)
416 else if (atom_gettype(argv) == A_FLOAT)
418 else if (atom_gettype(argv) == A_SYM)
419 newMsg = _sym_symbol;
454 aReceiver.
set(kTTSym_address, kTTAdrsEmpty);
469 outlet_anything((t_outlet*)x->dumpOut, gensym(
"address"), 1, a);
471 JamomaDebug logpost((t_object*)x, 3,
"binds on %s", x->
address.
c_str());
480 #pragma mark Methods relating to audio processing
482 #ifdef JCOM_SEND_TILDE
485 t_int *send_perform(t_int *w)
489 TTListPtr objectCache = NULL;
497 if (x->
obj.z_disabled)
505 objectCache = TTListPtr((
TTPtr)v[0]);
510 aSender->
mSignal.
get(kTTSym_vectorSize, vectorSize);
516 envelope = (t_float *)(w[3]);
522 mean = sum / vectorSize;
526 for (objectCache->begin(); objectCache->end(); objectCache->next()) {
528 anObject = objectCache->current()[0];
530 if (anObject.
valid()) {
533 if (anObject.
name() == kTTSym_InputAudio)
534 TTInputPtr(anObject.
instance())->mSignalCache.appendUnique(aSender->
mSignal);
537 else if (anObject.
name() == kTTSym_Data)
538 anObject.
send(kTTSym_Command, v, none);
551 void send_perform64(
TTPtr self, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam)
555 TTListPtr objectCache = NULL;
563 if (x->
obj.z_disabled)
571 objectCache = TTListPtr((
TTPtr)v[0]);
576 aSender->
mSignal.
get(kTTSym_vectorSize, vectorSize);
588 mean = sum / vectorSize;
592 for (objectCache->begin(); objectCache->end(); objectCache->next()) {
594 anObject = objectCache->current()[0];
596 if (anObject.
valid()) {
599 if (anObject.
name() == kTTSym_InputAudio)
600 TTInputPtr(anObject.
instance())->mSignalCache.appendUnique(aSender->
mSignal);
603 else if (anObject.
name() == kTTSym_Data)
604 anObject.
send(kTTSym_Command, v, none);
613 void send_dsp(
TTPtr self, t_signal **sp,
short *count)
617 void** audioVectors = NULL;
622 audioVectors = (
void**)sysmem_newptr(
sizeof(
void*) * 3);
625 if (count[0] || count[1]) {
626 if (sp[0]->s_n > vectorSize)
627 vectorSize = sp[0]->s_n;
629 audioVectors[1] = sp[0]->s_vec;
630 audioVectors[2] = sp[1]->s_vec;
635 aSender->
mSignal.
set(kTTSym_vectorSize, vectorSize);
637 dsp_addv(send_perform, 3, audioVectors);
638 sysmem_freeptr(audioVectors);
643 void send_dsp64(
TTPtr self, t_object *dsp64,
short *count,
double samplerate,
long maxvectorsize,
long flags)
655 object_method(dsp64, gensym(
"dsp_add64"), x, send_perform64, 0, NULL);
void WrappedSenderClass_anything(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
anything else handler for j.send
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...
std::uint16_t TTUInt16
16 bit unsigned integer
void send_float(TTPtr self, t_float value)
float handler for j.send
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.
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
TTObject mSignal
any data structure to send complex signal
The TTAddress class is used to represent a string and efficiently pass and compare that string...
Create and use Jamoma object instances.
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
void WrappedSenderClass_new(TTPtr self, long argc, t_atom *argv)
Wrapper for the j.send constructor class, called when an instance is created.
void WrapTTSenderClass(WrappedClassPtr c)
Wrap the j.send class as a Max object.
TTHashPtr internals
An hash table to store any internal TTObjectBases (like TTData, TTViewer, ...)
void send_assist(TTPtr self, void *b, long msg, long arg, char *dst)
Assistance Method.
void * TTPtr
A generic pointer.
TTErr get(const TTSymbol aName, T &aReturnedValue) const
Get an attribute value for an object.
void send_int(TTPtr self, long value)
int handler for j.send
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 send_return_model_address(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
Internal method called when the model:address parameter changed.
float TTFloat32
32 bit floating point number
TTObject wrappedObject
The instance of the Jamoma object we are wrapping.
void send_subscribe(TTPtr self)
Associate j.send(~) with NodeLib.
The TTAudioSignal class represents N vectors of audio samples for M channels.
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 send_input(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
Internal method used to send data to a j.in.
void send_list(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
list handler for j.send
void send_address(TTPtr self, t_symbol *address)
address message handler for j.send.
Wraps Jamoma Core classes as objects for PureData.
Data Structure for this object.
void send_bang(TTPtr self)
bang handler for j.send
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...
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.
TTBoolean valid() const
Determine if the object contained by this TTObject is truly ready for use.
TTSymbol & getName()
Get the name part.
void WrappedSenderClass_free(TTPtr self)
Wrapper for the j.send deconstructor class, called when an instance is destroyed. ...
WrappedModularInstance * WrappedModularInstancePtr
Pointer to a wrapped instance of our object.
TTFloat64 TTSampleValue
A value representing a single audio sample.
[doxygenAppendixC_copyExample]
TTErr wrapTTModularClassAsPdClass(TTSymbol &ttblueClassName, const char *pdClassName, WrappedClassPtr *c, ModularSpec *specificities)
Wrap a Jamoma class as a Pd class.