26 typedef struct extra {
29 TTListPtr objectsSorted;
32 #define EXTRA ((t_extra*)x->extra)
36 void WrapTTDataArrayClass(WrappedClassPtr c);
37 void WrappedDataArrayClass_new(
TTPtr self,
long argc, t_atom *argv);
38 void WrappedDataArrayClass_free(
TTPtr self);
42 void data_array_build(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
44 void data_address(
TTPtr self, t_symbol *name);
46 void data_array_return_value(
const TTValue& baton,
const TTValue& v);
49 void WrappedDataArrayClass_anything(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
52 void data_list(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv);
54 void data_array(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv);
56 void data_inc(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv);
57 void data_dec(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv);
59 #if defined(JMOD_RETURN)
60 extern "C" void JAMOMA_EXPORT_MAXOBJ setup_j0x2ereturn_array(
void)
61 #elif defined(JMOD_MESSAGE)
62 extern "C" void JAMOMA_EXPORT_MAXOBJ setup_j0x2emessage_array(
void)
64 extern "C" void JAMOMA_EXPORT_MAXOBJ setup_j0x2eparameter_array(
void)
67 ModularSpec *spec =
new ModularSpec;
68 spec->_wrap = &WrapTTDataArrayClass;
69 spec->_new = &WrappedDataArrayClass_new;
70 spec->_free = &WrappedDataArrayClass_free;
71 spec->_any = &WrappedDataArrayClass_anything;
74 #if defined(JMOD_MESSAGE)
76 #elif defined(JMOD_RETURN)
83 void WrapTTDataArrayClass(WrappedClassPtr c)
85 eclass_addmethod(c->pdClass, (method)data_assist,
"assist", A_CANT, 0L);
87 eclass_addmethod(c->pdClass, (method)data_bang,
"bang", A_NULL, 0L);
88 eclass_addmethod(c->pdClass, (method)data_float,
"float", A_FLOAT, 0);
89 eclass_addmethod(c->pdClass, (method)data_list,
"list", A_GIMME, 0);
91 eclass_addmethod(c->pdClass, (method)data_array,
"array", A_GIMME, 0);
93 eclass_addmethod(c->pdClass, (method)data_inc,
"+", A_GIMME, 0);
94 eclass_addmethod(c->pdClass, (method)data_dec,
"-", A_GIMME, 0);
96 eclass_addmethod(c->pdClass, (method)data_address,
"address", A_SYM,0);
101 void WrappedDataArrayClass_new(
TTPtr self,
long argc, t_atom *argv)
104 t_symbol *relativeAddress;
105 long attrstart = attr_args_offset(argc, argv);
109 relativeAddress = _sym_nothing;
110 if (attrstart && argv)
111 if (atom_gettype(argv) == A_SYM)
112 relativeAddress = atom_getsym(argv);
114 if (relativeAddress == _sym_nothing) {
115 pd_error((t_object*)x,
"j.parameter|j.message need a name as first argument" );
121 x->
inlets = (TTHandle)sysmem_newptr(
sizeof(
TTPtr) * 1);
123 x->
inlets[0] = eobj_proxynew(x);
130 x->
outlets = (TTHandle)sysmem_newptr(
sizeof(
TTPtr) * 2);
131 x->
outlets[index_out] = outlet_new((t_object*)x, NULL);
132 x->
outlets[data_out] = outlet_new((t_object*)x, NULL);
139 x->arrayAddress = kTTAdrsEmpty;
141 x->arrayAttrFormat = gensym(
"single");
146 EXTRA->changingAddress = NO;
147 EXTRA->objectsSorted =
new TTList();
153 attr_args_process(x, argc, argv);
161 x->arrayAddress = relativeAddress->s_name;
164 x->arrayAddress = kTTAdrsEmpty;
165 pd_error((t_object*)x,
"can't register because %s is not a relative address", relativeAddress->s_name);
169 atom_setlong(&number,
jamoma_parse_bracket(relativeAddress, x->arrayFormatInteger, x->arrayFormatString));
178 void WrappedDataArrayClass_free(
TTPtr self)
184 delete EXTRA->objectsSorted;
189 void data_array_build(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
193 t_symbol *instanceAddress;
196 TTUInt32 newSize = atom_getlong(argv);
199 if (newSize > MAX_ARRAY_SIZE)
201 pd_error((t_object*)x,
"the size is greater than the maximum array size (%d)", MAX_ARRAY_SIZE);
205 x->arraySize = newSize;
212 if (newSize > lastSize)
214 for (
TTUInt32 i = lastSize + 1; i <= newSize; i++)
219 #if defined(JMOD_MESSAGE)
220 data_array_build_index(
self, anObject, kTTSym_message, i);
221 #elif defined(JMOD_RETURN)
222 data_array_build_index(
self, anObject, kTTSym_return, i);
224 data_array_build_index(
self, anObject, kTTSym_parameter, i);
228 cache.append(
TTSymbol(instanceAddress->s_name));
233 EXTRA->objectsSorted->insert(0, anObject);
240 for (
TTUInt32 i = lastSize; i > newSize; i--)
252 EXTRA->objectsSorted->getIndex(0, cache);
253 EXTRA->objectsSorted->remove(cache);
257 pd_error((t_object*)x,
"there are still unreleased reference of a %s wrappedObject(refcount = %d)", instanceAddress->s_name, anObject.
instance()->
getReferenceCount() - 1);
270 attr_args_process(x, ac, av);
280 for (
TTUInt32 i = lastSize + 1; i <= newSize; i++)
297 if (aSubscriber.
valid())
302 cache.
append(aSubscriber);
308 anObject.
send(
"Init");
316 if (x->arraySize > 0)
317 wrappedModularClass_ArraySelect(
self, gensym(
"*"), 0, NULL);
326 returnedData =
TTObject(kTTSym_Data, service);
331 returnedData.
set(kTTSym_baton, baton);
332 returnedData.
set(kTTSym_function,
TTPtr(&data_array_return_value));
335 void data_address(
TTPtr self, t_symbol *address)
340 if (!EXTRA->changingAddress)
342 EXTRA->changingAddress = YES;
345 if (!(x->arrayAddress ==
TTAddress(address->s_name)))
350 x->arrayAddress = address->s_name;
353 x->arrayAddress = kTTAdrsEmpty;
354 pd_error((t_object*)x,
"can't register because %s is not a relative address", address->s_name);
360 atom_setlong(&number,
jamoma_parse_bracket(address, newArrayFormatInteger, newArrayFormatString));
363 if (newArrayFormatInteger != x->arrayFormatInteger &&
364 newArrayFormatString != x->arrayFormatString &&
369 atom_setlong(&zero, 0);
370 data_array_build(
self, _sym_nothing, 1, &zero);
374 x->arrayFormatInteger = newArrayFormatInteger;
375 x->arrayFormatString = newArrayFormatString;
378 data_array_build(
self, _sym_nothing, 1, &number);
382 if (x->arrayAttrFormat == gensym(
"array"))
390 data_edit_array(
self, array);
395 if (msg == _sym_nothing)
396 outlet_anything((t_outlet*)x->
outlets[data_out], NULL, argc, argv);
398 outlet_anything((t_outlet*)x->
outlets[data_out], msg, argc, argv);
402 sysmem_freeptr(argv);
407 EXTRA->changingAddress = NO;
411 pd_error((t_object*)x,
"can't change to %s address. Please defer low", address->s_name);
420 strcpy(dst,
"set the value of the selected instance(s)");
423 strcpy(dst,
"index (use * to bind all instances)");
430 strcpy(dst,
"direct: values");
433 strcpy(dst,
"index");
436 strcpy(dst,
"dumpout");
450 pd_error((t_object*)x,
"bang : the array is empty");
459 atom_setfloat(&a, value);
463 pd_error((t_object*)x,
"float : the array is empty");
466 void data_list(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv)
474 if (x->arrayIndex == 0) {
495 pd_error((t_object*)x,
"list : the array is empty");
498 void WrappedDataArrayClass_anything(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
504 wrappedModularClass_ArraySelect(
self, msg, argc, argv);
509 void data_array(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv)
513 t_symbol *instanceAddress;
520 d = argc / x->arraySize;
521 if ((d * x->arraySize) == argc) {
525 for (i = 1; i <= (
TTInt32) x->arraySize; i++) {
536 pd_error((t_object*)x,
"array : the array message size have to be a multiple of the array size");
540 pd_error((t_object*)x,
"array : the array is empty");
543 void data_inc(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv)
549 selectedObject->sendMessage(
TTSymbol(
"Inc"), v, none);
552 void data_dec(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv)
558 selectedObject->sendMessage(
TTSymbol(
"Dec"), v, none);
561 void data_array_return_value(
const TTValue& baton,
const TTValue& v)
576 if (x->arrayIndex == 0)
579 outlet_int((t_outlet*)x->
outlets[index_out], i);
583 if (x->arrayAttrFormat == gensym(
"array")) {
586 if (EXTRA->changingAddress)
589 data_edit_array(x, array);
598 if (msg == _sym_nothing)
599 outlet_anything((t_outlet*)x->
outlets[data_out], NULL, argc, argv);
601 outlet_anything((t_outlet*)x->
outlets[data_out], msg, argc, argv);
605 sysmem_freeptr(argv);
616 for (EXTRA->objectsSorted->begin();
617 EXTRA->objectsSorted->end();
618 EXTRA->objectsSorted->next()) {
620 aData = EXTRA->objectsSorted->current()[0];
623 if (aData.
get(kTTSym_value, grab))
624 aData.
get(kTTSym_valueDefault, grab);
627 if (grab.
size() == 0) {
629 aData.
get(kTTSym_type, t);
633 if (type == kTTSym_string)
643 t_max_err data_get_format(
TTPtr self,
TTPtr attr,
long *ac, t_atom **av)
652 if (!(*av = (t_atom*)getbytes(
sizeof(t_atom)*(*ac)))) {
658 atom_setsym(*av, x->arrayAttrFormat);
663 t_max_err data_set_format(
TTPtr self,
TTPtr attr,
long ac, t_atom *av)
668 x->arrayAttrFormat = atom_getsym(av);
671 x->arrayAttrFormat = gensym(
"single");
bool TTBoolean
Boolean flag, same as Boolean on the Mac.
TTErr send(const TTSymbol aName)
Send a message to this object with no arguments.
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 ...
The TTAddress class is used to represent a string and efficiently pass and compare that string...
Create and use Jamoma object instances.
size_type size() const noexcept
Return the number of elements.
void * extra
used to keep very specific things
this flag means that an address have no leading slash
TTErr getKeys(TTValue &hashKeys)
Get an array of all of the keys for the hash table.
TTHashPtr internals
An hash table to store any internal TTObjectBases (like TTData, TTViewer, ...)
void prepend(const TTValue &aValueToPrepend)
Insert another TTValue before the first element.
void append(const T &anElementValueToAppend)
Insert a single TTElement at the end.
void * TTPtr
A generic pointer.
TTErr get(const TTSymbol aName, T &aReturnedValue) const
Get an attribute value for an object.
void data_inc(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
Increase parameter value in steps.
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...
TTErr append(const TTSymbol key, const TTValue &value)
Insert an item into the hash table.
TTHandle inlets
an array of inlets
TTBoolean iterateInternals
The flag is true when an iteration is done on the internals.
TTBoolean isEmpty()
Return true if the hash has nothing stored in it.
void data_list(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
Process an incoming message containing a list.
std::int32_t TTInt32
32 bit signed integer
void data_bang(TTPtr self)
Process an incoming 'bang' message.
void clear()
Clear all values from the vector, leaving with size of 0.
Wraps Jamoma Core classes as objects for PureData.
Data Structure for this object.
TTErr remove(const TTSymbol key)
Remove an item from the hash table.
std::uint32_t TTUInt32
32 bit unsigned integer
TTBoolean useInternals
The hash table can be used as an array of wrappedObject.
void data_dec(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
Decrease parameter value in steps.
TTObjectBase * instance() const
Return a direct pointer to the internal instance.
The TTString class is used to represent a string.
long index
index of the inlet used
TTSymbol cursor
to select an entry in x->internals
void data_float(TTPtr self, double value)
Process an incoming float value.
void data_assist(TTPtr self, TTPtr b, long msg, long arg, char *dst)
Provide assistance on input and output while patching.
TTBoolean valid() const
Determine if the object contained by this TTObject is truly ready for use.
WrappedModularInstance * WrappedModularInstancePtr
Pointer to a wrapped instance of our object.
[doxygenAppendixC_copyExample]
TTUInt16 getReferenceCount()
Query an object to get its current reference count.
TTErr wrapTTModularClassAsPdClass(TTSymbol &ttblueClassName, const char *pdClassName, WrappedClassPtr *c, ModularSpec *specificities)
Wrap a Jamoma class as a Pd class.