16 typedef struct PlugParameter {
19 TTPtr graphOutlets[16];
22 ObjectPtr patcherview;
30 typedef PlugParameter* PlugParameterPtr;
34 PlugParameterPtr PlugParameterNew (SymbolPtr msg, AtomCount argc, AtomPtr argv);
35 void PlugParameterFree (PlugParameterPtr
self);
36 void PlugParameterStartTracking (PlugParameterPtr
self);
37 MaxErr PlugParameterNotify (PlugParameterPtr
self, SymbolPtr s, SymbolPtr msg, ObjectPtr sender,
TTPtr data);
38 void PlugParameterQFn (PlugParameterPtr
self);
39 void PlugParameterAssist (PlugParameterPtr
self,
void* b,
long msg,
long arg,
char* dst);
40 void PlugParameterInt (PlugParameterPtr
self,
long value);
41 void PlugParameterFloat (PlugParameterPtr
self,
double value);
42 MaxErr PlugParameterSetName(PlugParameterPtr
self,
void* attr, AtomCount argc, AtomPtr argv);
43 MaxErr PlugParameterSetRange(PlugParameterPtr
self,
void* attr, AtomCount argc, AtomPtr argv);
44 MaxErr PlugParameterSetStyle(PlugParameterPtr
self,
void* attr, AtomCount argc, AtomPtr argv);
45 MaxErr PlugParameterSetDefault(PlugParameterPtr
self,
void* attr, AtomCount argc, AtomPtr argv);
49 static ClassPtr sPlugParameterClass;
55 int TTCLASSWRAPPERMAX_EXPORT main(
void)
60 common_symbols_init();
62 c = class_new((
char*)
"j.plug.parameter-", (method)PlugParameterNew, (method)PlugParameterFree,
sizeof(PlugParameter), (method)0L, A_GIMME, 0);
64 class_addmethod(c, (method)PlugParameterInt,
"int", A_LONG, 0);
65 class_addmethod(c, (method)PlugParameterFloat,
"float", A_LONG, 0);
69 class_addmethod(c, (method)MaxGraphReset,
"graph.reset", A_CANT, 0);
70 class_addmethod(c, (method)MaxGraphSetup,
"graph.setup", A_CANT, 0);
71 class_addmethod(c, (method)MaxGraphDrop,
"graph.drop", A_CANT, 0);
72 class_addmethod(c, (method)MaxGraphObject,
"graph.object", A_CANT, 0);
74 class_addmethod(c, (method)PlugParameterNotify,
"notify", A_CANT, 0);
75 class_addmethod(c, (method)PlugParameterAssist,
"assist", A_CANT, 0);
76 class_addmethod(c, (method)object_obex_dumpout,
"dumpout", A_CANT, 0);
78 CLASS_ATTR_SYM(c,
"name", 0, PlugParameter, name);
79 CLASS_ATTR_ACCESSORS(c,
"name", NULL, PlugParameterSetName);
81 CLASS_ATTR_DOUBLE_ARRAY(c,
"range", 0, PlugParameter, range, 2);
82 CLASS_ATTR_ACCESSORS(c,
"range", NULL, PlugParameterSetRange);
84 CLASS_ATTR_SYM(c,
"style", 0, PlugParameter, style);
85 CLASS_ATTR_ACCESSORS(c,
"style", NULL, PlugParameterSetStyle);
87 CLASS_ATTR_DOUBLE(c,
"default", 0, PlugParameter, defaultValue);
88 CLASS_ATTR_ACCESSORS(c,
"default", NULL, PlugParameterSetDefault);
90 class_register(_sym_box, c);
91 sPlugParameterClass = c;
99 PlugParameterPtr PlugParameterNew(SymbolPtr msg, AtomCount argc, AtomPtr argv)
101 PlugParameterPtr
self = PlugParameterPtr(object_alloc(sPlugParameterClass));
104 long attrStart = attr_args_offset(argc, argv);
107 object_obex_store((
void*)
self, _sym_dumpout, (ObjectPtr)outlet_new(
self, NULL));
108 self->graphOutlets[0] = outlet_new(
self,
"graph.connect");
111 v.
set(0,
TT(
"parameter"));
114 ((
TTGraphInput*)self->graphObject->mKernel)->setOwner(self->graphObject);
116 if (!self->graphObject->mKernel) {
117 object_error(SELF,
"cannot load Jamoma object");
123 self->graphDictionary->append(
TT(
"outlet"), 0);
125 self->range[0] = 0.0;
126 self->range[1] = 1.0;
127 self->style = GENSYM(
"generic");
128 attr_args_process(
self, argc, argv);
132 object_attr_setsym(
self, _sym_name, atom_getsym(argv));
134 object_attr_setsym(
self, _sym_name, GENSYM(
"A parameter"));
137 self->qelem = qelem_new(
self, (method)PlugParameterQFn);
140 defer_low(
self, (method)PlugParameterStartTracking, NULL, 0, NULL);
146 void PlugParameterFree(PlugParameterPtr
self)
149 qelem_free(self->qelem);
155 MaxErr PlugParameterNotify(PlugParameterPtr
self, SymbolPtr s, SymbolPtr msg, ObjectPtr sender,
TTPtr data)
157 if (sender == self->patcherview) {
158 if (msg == _sym_attr_modified) {
159 SymbolPtr name = (SymbolPtr)object_method((ObjectPtr)data, _sym_getname);
160 if (name == _sym_dirty) {
161 qelem_set(self->qelem);
164 else if (msg == _sym_free)
165 self->patcherview = NULL;
168 if (msg == _sym_free) {
170 ObjectPtr sourceObject;
173 ObjectPtr destObject;
176 #ifdef DEBUG_NOTIFICATIONS
177 object_post(SELF,
"patch line deleted");
178 #endif // DEBUG_NOTIFICATIONS
181 sourceBox = jpatchline_get_box1(sender);
185 sourceObject = jbox_get_object(sourceBox);
186 sourceOutlet = jpatchline_get_outletnum(sender);
187 destBox = jpatchline_get_box2(sender);
190 destObject = jbox_get_object(destBox);
191 destInlet = jpatchline_get_inletnum(sender);
194 if ( zgetfn(sourceObject, GENSYM(
"graph.object")) && zgetfn(destObject, GENSYM(
"graph.object")) ) {
195 #ifdef DEBUG_NOTIFICATIONS
196 object_post(SELF,
"deleting graph patchline!");
197 #endif // DEBUG_NOTIFICATIONS
199 object_method(destObject, GENSYM(
"graph.drop"), destInlet, sourceObject, sourceOutlet);
209 void PlugParameterIterateResetCallback(PlugParameterPtr
self, ObjectPtr obj)
211 MaxErr err = MAX_ERR_NONE;
212 method graphResetMethod = zgetfn(obj, GENSYM(
"graph.reset"));
214 if (graphResetMethod)
215 err = (MaxErr)graphResetMethod(obj);
219 void PlugParameterIterateSetupCallback(PlugParameterPtr
self, ObjectPtr obj)
221 MaxErr err = MAX_ERR_NONE;
222 method graphSetupMethod = zgetfn(obj, GENSYM(
"graph.setup"));
224 if (graphSetupMethod)
225 err = (MaxErr)graphSetupMethod(obj);
229 void PlugParameterAttachToPatchlinesForPatcher(PlugParameterPtr
self, ObjectPtr patcher)
231 ObjectPtr patchline = object_attr_getobj(patcher, _sym_firstline);
232 ObjectPtr box = jpatcher_get_firstobject(patcher);
235 object_attach_byptr_register(
self, patchline, _sym_nobox);
236 patchline = object_attr_getobj(patchline, _sym_nextline);
240 SymbolPtr classname = jbox_get_maxclass(box);
242 if (classname == _sym_jpatcher) {
243 ObjectPtr subpatcher = jbox_get_object(box);
245 PlugParameterAttachToPatchlinesForPatcher(
self, subpatcher);
247 box = jbox_get_nextobject(box);
253 void PlugParameterQFn(PlugParameterPtr
self)
257 #ifdef DEBUG_NOTIFICATIONS
258 object_post(SELF,
"patcher dirtied");
259 #endif // DEBUG_NOTIFICATIONS
261 object_method(self->patcher, GENSYM(
"iterate"), (method)PlugParameterIterateSetupCallback,
self, PI_DEEP, &result);
265 PlugParameterAttachToPatchlinesForPatcher(
self, self->patcher);
270 void PlugParameterStartTracking(PlugParameterPtr
self)
272 ObjectPtr patcher = NULL;
273 ObjectPtr parent = NULL;
274 ObjectPtr patcherview = NULL;
279 err = object_obex_lookup(
self, GENSYM(
"#P"), &patcher);
283 parent = object_attr_getobj(patcher, _sym_parentpatcher);
287 object_method(patcher, GENSYM(
"iterate"), (method)PlugParameterIterateResetCallback,
self, PI_DEEP, &result);
288 object_method(patcher, GENSYM(
"iterate"), (method)PlugParameterIterateSetupCallback,
self, PI_DEEP, &result);
293 if (!self->patcherview) {
294 patcherview = jpatcher_get_firstview(patcher);
295 self->patcherview = patcherview;
296 self->patcher = patcher;
297 object_attach_byptr_register(
self, patcherview, _sym_nobox);
302 PlugParameterAttachToPatchlinesForPatcher(
self, self->patcher);
310 void PlugParameterAssist(PlugParameterPtr
self,
void* b,
long msg,
long arg,
char* dst)
313 strcpy(dst,
"multichannel audio connection and control messages");
316 strcpy(dst,
"multichannel audio connection");
318 strcpy(dst,
"dumpout");
323 void PlugParameterInt(PlugParameterPtr
self,
long value)
332 self->graphDictionary->setSchema(
TT(
"attribute"));
333 self->graphDictionary->append(
TT(
"name"),
TT(self->name->s_name));
334 self->graphDictionary->setValue(v);
335 ((
TTGraphInput*)self->graphObject->mKernel)->push(*self->graphDictionary);
339 void PlugParameterFloat(PlugParameterPtr
self,
double value)
343 self->graphDictionary->setSchema(
TT(
"attribute"));
344 self->graphDictionary->
append(
TT(
"name"),
TT(self->name->s_name));
345 self->graphDictionary->setValue(v);
346 ((
TTGraphInput*)self->graphObject->mKernel)->push(*self->graphDictionary);
350 MaxErr PlugParameterSetName(PlugParameterPtr
self,
void* attr, AtomCount argc, AtomPtr argv)
353 self->name = atom_getsym(argv);
354 self->graphObject->mKernel->setAttributeValue(
TT(
"name"),
TT(self->name->s_name));
360 MaxErr PlugParameterSetRange(PlugParameterPtr
self,
void* attr, AtomCount argc, AtomPtr argv)
363 self->range[0] = atom_getfloat(argv+0);
364 self->range[1] = atom_getfloat(argv+1);
365 self->graphObject->mKernel->setAttributeValue(
TT(
"rangeBottom"), self->range[0]);
366 self->graphObject->mKernel->setAttributeValue(
TT(
"rangeTop"), self->range[1]);
372 MaxErr PlugParameterSetStyle(PlugParameterPtr
self,
void* attr, AtomCount argc, AtomPtr argv)
375 self->style = atom_getsym(argv);
376 self->graphObject->mKernel->setAttributeValue(
TT(
"style"),
TT(self->style->s_name));
382 MaxErr PlugParameterSetDefault(PlugParameterPtr
self,
void* attr, AtomCount argc, AtomPtr argv)
385 self->defaultValue = atom_getfloat(argv);
386 self->graphObject->mKernel->setAttributeValue(
TT(
"default"), self->defaultValue);
The TTGraphObjectBase wraps a TTDSP object such that it is possible to build a dynamic graph of audio...
TTErr TTObjectBaseRelease(TTObjectBasePtr *anObject)
DEPRECATED.
Provides all necessary definitions for AudioGraph API.
Base class for all first-class Jamoma objects.
#define TT
This macro is defined as a shortcut for doing a lookup in the symbol table.
A type that represents the key as a C-String and the value as a pointer to the matching TTSymbol obje...
void append(const T &anElementValueToAppend)
Insert a single TTElement at the end.
void * TTPtr
A generic pointer.
void setSize(const TTUInt16 arg)
DEPRECATED.
TTErr TTObjectBaseInstantiate(const TTSymbol className, TTObjectBasePtr *returnedObjectPtr, const TTValue arguments)
DEPRECATED.
TTErr setSchema(const TTSymbol aSchemaName)
TODO: Add documentation schemaName TODO: Add documentation.
void set(const TTUInt16 index, const T &anElementValue)
DEPRECATED.
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]