12 #include "ext_hashtab.h"
16 typedef struct _wrappedInstance {
18 WrappedClassPtr wrappedClassDefinition;
19 TTAudioGraphObjectPtr audioGraphObject;
20 TTPtr audioGraphOutlets[16];
28 static t_hashtab* wrappedMaxClasses = NULL;
31 ObjectPtr wrappedClass_new(SymbolPtr name, AtomCount argc, AtomPtr argv)
33 WrappedClass* wrappedMaxClass = NULL;
39 long attrstart = attr_args_offset(argc, argv);
42 hashtab_lookup(wrappedMaxClasses, name, (ObjectPtr*)&wrappedMaxClass);
46 if (wrappedMaxClass) {
47 if (wrappedMaxClass->validityCheck)
48 err = wrappedMaxClass->validityCheck(wrappedMaxClass->validityCheckArgument);
59 if (wrappedMaxClass->options && !wrappedMaxClass->options->lookup(
TT(
"argumentDefinesNumInlets"), v)) {
60 long argumentOffsetToDefineTheNumberOfInlets = v;
61 if ((attrstart-argumentOffsetToDefineTheNumberOfInlets > 0) && argv+argumentOffsetToDefineTheNumberOfInlets)
62 numInputs = atom_getlong(argv+argumentOffsetToDefineTheNumberOfInlets);
64 for (
TTUInt16 i=numInputs-1; i>0; i--)
65 self->inlets[i-1] = proxy_new(
self, i, NULL);
67 object_obex_store((
void*)
self, _sym_dumpout, (
object*)outlet_new(
self, NULL));
68 if (wrappedMaxClass->options && !wrappedMaxClass->options->lookup(
TT(
"argumentDefinesNumOutlets"), v)) {
69 long argumentOffsetToDefineTheNumberOfOutlets = v;
70 if ((attrstart-argumentOffsetToDefineTheNumberOfOutlets > 0) && argv+argumentOffsetToDefineTheNumberOfOutlets)
71 numOutputs = atom_getlong(argv+argumentOffsetToDefineTheNumberOfOutlets);
73 for (
TTInt16 i=numOutputs-1; i>=0; i--)
74 self->audioGraphOutlets[i] = outlet_new(
self,
"audio.connect");
76 self->wrappedClassDefinition = wrappedMaxClass;
78 v.
set(0, wrappedMaxClass->ttClassName);
81 err = TTObjectInstantiate(
TT(
"audio.object"), (TTObjectPtr*)&self->audioGraphObject, v);
83 attr_args_process(
self, argc, argv);
85 return ObjectPtr(
self);
91 if (self->audioGraphObject)
92 TTObjectRelease((TTObjectPtr*)&self->audioGraphObject);
102 return self->audioGraphObject->reset();
111 atom_setobj(a+0, ObjectPtr(self->audioGraphObject));
112 while (self->audioGraphOutlets[i]) {
113 atom_setlong(a+1, i);
114 outlet_anything(self->audioGraphOutlets[i], gensym(
"audio.connect"), 2, a);
123 long inletNumber = proxy_getinlet(SELF);
124 return self->audioGraphObject->connect(audioSourceObject, sourceOutletNumber, inletNumber);
128 t_max_err wrappedClass_attrGet(
WrappedInstancePtr self, ObjectPtr attr, AtomCount* argc, AtomPtr* argv)
130 SymbolPtr attrName = (SymbolPtr)object_method(attr, _sym_getname);
133 TTSymbolPtr ttAttrName = NULL;
136 err = hashtab_lookup(self->wrappedClassDefinition->maxAttrNamesToTTAttrNames, attrName, (ObjectPtr*)&ttAttrName);
140 self->audioGraphObject->mUnitGenerator->getAttributeValue(ttAttrName, v);
144 *argv = (t_atom *)sysmem_newptr(
sizeof(t_atom) * v.
getSize());
146 for (i=0; i<v.
getSize(); i++) {
150 atom_setfloat(*argv+i, value);
153 TTSymbolPtr value = NULL;
155 atom_setsym(*argv+i, gensym((
char*)value->getCString()));
160 atom_setlong(*argv+i, value);
167 t_max_err wrappedClass_attrSet(
WrappedInstancePtr self, ObjectPtr attr, AtomCount argc, AtomPtr argv)
170 SymbolPtr attrName = (SymbolPtr)object_method(attr, _sym_getname);
173 TTSymbolPtr ttAttrName = NULL;
176 err = hashtab_lookup(self->wrappedClassDefinition->maxAttrNamesToTTAttrNames, attrName, (ObjectPtr*)&ttAttrName);
181 for (i=0; i<argc; i++) {
182 if(atom_gettype(argv+i) == A_LONG)
183 v.
set(i, AtomGetInt(argv+i));
184 else if(atom_gettype(argv+i) == A_FLOAT)
185 v.
set(i, atom_getfloat(argv+i));
186 else if(atom_gettype(argv+i) == A_SYM)
187 v.
set(i,
TT(atom_getsym(argv+i)->s_name));
189 object_error(SELF,
"bad type for attribute setter");
191 self->audioGraphObject->mUnitGenerator->setAttributeValue(ttAttrName, v);
194 return MAX_ERR_GENERIC;
198 void wrappedClass_anything(
WrappedInstancePtr self, SymbolPtr s, AtomCount argc, AtomPtr argv)
204 for (AtomCount i=0; i<argc; i++) {
205 if (atom_gettype(argv+i) == A_LONG)
206 v.
set(i, AtomGetInt(argv+i));
207 else if (atom_gettype(argv+i) == A_FLOAT)
208 v.
set(i, atom_getfloat(argv+i));
209 else if (atom_gettype(argv+i) == A_SYM)
210 v.
set(i,
TT(atom_getsym(argv+i)->s_name));
212 object_error(SELF,
"bad type for message arg");
214 self->audioGraphObject->mUnitGenerator->sendMessage(
TT(s->s_name), v);
221 AtomPtr av = (AtomPtr)malloc(
sizeof(Atom) * ac);
223 for (AtomCount i=0; i<ac; i++) {
225 TTSymbolPtr ttSym = NULL;
227 atom_setsym(av+i, gensym((
char*)ttSym->getCString()));
232 atom_setfloat(av+i, f);
237 atom_setfloat(av+i, l);
240 object_obex_dumpout(
self, s, ac, av);
245 self->audioGraphObject->mUnitGenerator->sendMessage(
TT(s->s_name));
250 void wrappedClass_assist(
WrappedInstancePtr self,
void *b,
long msg,
long arg,
char *dst)
253 strcpy(dst,
"multichannel input and control messages");
256 strcpy(dst,
"multichannel output");
258 strcpy(dst,
"dumpout");
272 TTErr wrapAsMaxAudioGraph(TTSymbolPtr ttClassName,
char* maxClassName, WrappedClassPtr* c, WrappedClassOptionsPtr options)
277 WrappedClass* wrappedMaxClass = NULL;
279 common_symbols_init();
282 if(!wrappedMaxClasses)
283 wrappedMaxClasses = hashtab_new(0);
285 wrappedMaxClass =
new WrappedClass;
286 wrappedMaxClass->maxClassName = gensym(maxClassName);
287 wrappedMaxClass->maxClass = class_new( maxClassName,
288 (method)wrappedClass_new,
289 (method)wrappedClass_free,
290 sizeof(WrappedInstance),
294 wrappedMaxClass->ttClassName = ttClassName;
295 wrappedMaxClass->validityCheck = NULL;
296 wrappedMaxClass->validityCheckArgument = NULL;
297 wrappedMaxClass->options = options;
298 wrappedMaxClass->maxAttrNamesToTTAttrNames = hashtab_new(0);
301 TTObjectInstantiate(ttClassName, &o, numChannels);
303 o->getMessageNames(v);
305 TTSymbolPtr name = NULL;
308 if(name ==
TT(
"updateMaxNumChannels") || name ==
TT(
"updateSr"))
311 class_addmethod(wrappedMaxClass->maxClass, (method)wrappedClass_anything, (
char*)name->getCString(), A_GIMME, 0);
314 o->getAttributeNames(v);
316 TTSymbolPtr name = NULL;
318 SymbolPtr maxType = _sym_long;
319 TTCString nameCString = NULL;
320 SymbolPtr nameMaxSymbol = NULL;
324 if(name ==
TT(
"maxNumChannels") || name ==
TT(
"processInPlace"))
327 o->findAttribute(name, &attr);
330 maxType = _sym_float32;
332 maxType = _sym_float64;
334 maxType = _sym_symbol;
337 nameSize = name->getString().length();
338 nameCString =
new char[nameSize+1];
339 strncpy_zero(nameCString, name->getCString(), nameSize+1);
340 if (nameCString[0]>64 && nameCString[0]<91)
341 nameCString[0] += 32;
342 nameMaxSymbol = gensym(nameCString);
344 hashtab_store(wrappedMaxClass->maxAttrNamesToTTAttrNames, nameMaxSymbol, ObjectPtr(name));
345 class_addattr(wrappedMaxClass->maxClass, attr_offset_new(nameCString, maxType, 0, (method)wrappedClass_attrGet, (method)wrappedClass_attrSet, NULL));
349 CLASS_ATTR_STYLE(wrappedMaxClass->maxClass, (
char*)name->getCString(), 0,
"onoff");
350 if (name ==
TT(
"fontFace"))
351 CLASS_ATTR_STYLE(wrappedMaxClass->maxClass,
"fontFace", 0,
"font");
356 class_addmethod(wrappedMaxClass->maxClass, (method)
MaxAudioGraphReset,
"audio.reset", A_CANT, 0);
357 class_addmethod(wrappedMaxClass->maxClass, (method)
MaxAudioGraphSetup,
"audio.setup", A_CANT, 0);
358 class_addmethod(wrappedMaxClass->maxClass, (method)
MaxAudioGraphConnect,
"audio.connect", A_OBJ, A_LONG, 0);
359 class_addmethod(wrappedMaxClass->maxClass, (method)object_obex_dumpout,
"dumpout", A_CANT, 0);
360 class_addmethod(wrappedMaxClass->maxClass, (method)wrappedClass_assist,
"assist", A_CANT, 0L);
361 class_addmethod(wrappedMaxClass->maxClass, (method)stdinletinfo,
"inletinfo", A_CANT, 0);
363 class_register(_sym_box, wrappedMaxClass->maxClass);
365 *c = wrappedMaxClass;
367 hashtab_store(wrappedMaxClasses, wrappedMaxClass->maxClassName, ObjectPtr(wrappedMaxClass));
377 (*c)->validityCheck = validityCheck;
378 (*c)->validityCheckArgument = (*c)->maxClass;
388 (*c)->validityCheck = validityCheck;
389 (*c)->validityCheckArgument = (*c)->maxClass;
400 (*c)->validityCheck = validityCheck;
401 (*c)->validityCheckArgument = validityCheckArgument;
411 (*c)->validityCheck = validityCheck;
412 (*c)->validityCheckArgument = validityCheckArgument;
423 return (
TTInt64)atom_getlong(a);
426 int AtomGetInt(AtomPtr a)
428 return (
int)atom_getlong(a);
std::uint16_t TTUInt16
16 bit unsigned integer
TTUInt16 getSize() const
DEPRECATED.
TTDataType type
The data type of the attribute value.
TTErr MaxAudioGraphSetup(t_object *x)
Set up fresh connections from this object to nodes that are connected downstream. ...
TTErr wrapAsMaxAudioGraph(TTSymbol ttClassName, char *maxClassName, MaxAudioGraphWrappedClassPtr *c)
Wrap an AudioGraph class as a Max class.
TTErr MaxAudioGraphReset(t_object *x, long vectorSize)
Clear the list of source objects from which this object will try to pull audio.
Create and use Jamoma object instances.
TTDataType getType(const TTUInt16 index=0) const
DEPRECATED.
This class represents a single attribute, as used by the TTObjectBase class.
double TTFloat64
64 bit floating point number
TTErr MaxAudioGraphConnect(t_object *x, TTAudioGraphObjectBasePtr audioSourceObject, TTUInt16 sourceOutletNumber)
Method called when an upstream node is connected to this node.
#define TT
This macro is defined as a shortcut for doing a lookup in the symbol table.
WrappedInstance * WrappedInstancePtr
Pointer to a wrapped instance of our object.
void * TTPtr
A generic pointer.
std::int64_t TTInt64
64 bit signed integer
void setSize(const TTUInt16 arg)
DEPRECATED.
std::int16_t TTInt16
16 bit signed integer
TTErr(* TTValidityCheckFunction)(const TTPtr data)
A type that can be used to store a pointer to a validity checking function.
void get(const TTUInt16 index, T &returnedElementValue) const
DEPRECATED.
Boolean (1/0) or (true/false) flag.
std::int32_t TTInt32
32 bit signed integer
A thin wrapper of Jamoma AudioGraph for use in the Cycling '74 Max/MSP environment.
void set(const TTUInt16 index, const T &anElementValue)
DEPRECATED.
Something went wrong, but what exactly is not known. Typically used for context-specific problems...
TTErr
Jamoma Error Codes Enumeration of error codes that might be returned by any of the TTBlue functions a...
std::uint32_t TTUInt32
32 bit unsigned integer
[doxygenAppendixC_copyExample]
unsigned char TTUInt8
8 bit unsigned integer (char)