10 #include "j.plug.out.h"
14 PlugOutPtr PlugOutNew(SymbolPtr msg, AtomCount argc, AtomPtr argv);
15 void PlugOutFree(PlugOutPtr
self);
16 MaxErr PlugOutNotify(PlugOutPtr
self, SymbolPtr s, SymbolPtr msg, ObjectPtr sender,
TTPtr data);
17 void PlugOutQFn(PlugOutPtr
self);
18 void PlugOutAttachToPatchlinesForPatcher(PlugOutPtr
self, ObjectPtr patcher);
19 void PlugOutAssist(PlugOutPtr
self,
void* b,
long msg,
long arg,
char* dst);
20 TTErr PlugOutSetup(PlugOutPtr
self);
21 void PlugOutIterateResetCallback(PlugOutPtr
self, ObjectPtr obj);
22 void PlugOutIterateSetupCallback(PlugOutPtr
self, ObjectPtr obj);
23 MaxErr PlugOutBuildAudioUnit(PlugOutPtr
self, SymbolPtr s, AtomCount argc, AtomPtr argv);
24 MaxErr PlugOutSetVersion(PlugOutPtr
self,
void* attr, AtomCount argc, AtomPtr argv);
28 static ClassPtr sPlugOutClass;
34 int TTCLASSWRAPPERMAX_EXPORT main(
void)
39 common_symbols_init();
41 c = class_new((
char*)
"j.plug.out=", (method)PlugOutNew, (method)PlugOutFree,
sizeof(PlugOut), (method)0L, A_GIMME, 0);
43 class_addmethod(c, (method)PlugOutNotify,
"notify", A_CANT, 0);
45 class_addmethod(c, (method)PlugOutSetup,
"audio.setup", A_CANT, 0);
49 class_addmethod(c, (method)PlugOutBuildAudioUnit,
"build.au", A_GIMME, 0);
50 class_addmethod(c, (method)PlugOutAssist,
"assist", A_CANT, 0);
51 class_addmethod(c, (method)object_obex_dumpout,
"dumpout", A_CANT, 0);
53 CLASS_ATTR_SYM(c,
"manufacturer", 0, PlugOut, pluginManufacturer);
54 CLASS_ATTR_SYM(c,
"manufacturerCode", 0, PlugOut, pluginManufacturerCode);
55 CLASS_ATTR_SYM(c,
"pluginIdCode", 0, PlugOut, pluginID);
56 CLASS_ATTR_SYM(c,
"pluginName", 0, PlugOut, pluginName);
57 CLASS_ATTR_SYM(c,
"pluginVersion", 0, PlugOut, pluginVersion);
58 CLASS_ATTR_ACCESSORS(c,
"pluginVersion", NULL, PlugOutSetVersion);
60 class_register(_sym_box, c);
69 PlugOutPtr PlugOutNew(SymbolPtr msg, AtomCount argc, AtomPtr argv)
71 PlugOutPtr
self = PlugOutPtr(object_alloc(sPlugOutClass));
77 v.
set(0,
TT(
"plugtastic.output"));
81 v =
TTPtr(self->audioGraphObject);
83 object_obex_store((
void*)
self, _sym_dumpout, (
object*)outlet_new(
self, NULL));
84 self->audioGraphOutlet = outlet_new(
self,
"audio.connect");
85 self->qelem = qelem_new(
self, (method)PlugOutQFn);
87 object_obex_lookup(
self, GENSYM(
"#P"), &self->patcher);
88 self->pluginName = object_attr_getsym(self->patcher, _sym_name);
89 self->pluginVersion = GENSYM(
"1.0");
90 self->pluginVersionHex = GENSYM(
"0x00010000");
91 self->pluginManufacturer = GENSYM(
"Plugtastic");
92 self->pluginManufacturerCode = GENSYM(
"74Ob");
93 self->pluginID = GENSYM(
"ftmp");
95 attr_args_process(
self, argc, argv);
101 void PlugOutFree(PlugOutPtr
self)
103 if (self->patcherview) {
104 object_detach_byptr(
self, self->patcherview);
105 self->patcherview = NULL;
108 qelem_free(self->qelem);
109 delete self->buildThread;
116 MaxErr PlugOutNotify(PlugOutPtr
self, SymbolPtr s, SymbolPtr msg, ObjectPtr sender,
TTPtr data)
118 if (sender == self->patcherview) {
119 if (msg == _sym_attr_modified) {
120 SymbolPtr name = (SymbolPtr)object_method((ObjectPtr)data, _sym_getname);
121 if (name == _sym_dirty) {
122 qelem_set(self->qelem);
125 else if (msg == _sym_free)
126 self->patcherview = NULL;
129 if (msg == _sym_free) {
131 ObjectPtr sourceObject;
134 ObjectPtr destObject;
137 if (self->patcherview)
140 #ifdef DEBUG_NOTIFICATIONS
141 object_post(SELF,
"patch line deleted");
142 #endif // DEBUG_NOTIFICATIONS
145 sourceBox = jpatchline_get_box1(sender);
148 sourceObject = jbox_get_object(sourceBox);
149 sourceOutlet = jpatchline_get_outletnum(sender);
150 destBox = jpatchline_get_box2(sender);
153 destObject = jbox_get_object(destBox);
154 destInlet = jpatchline_get_inletnum(sender);
157 if ( zgetfn(sourceObject, GENSYM(
"audio.object")) && zgetfn(destObject, GENSYM(
"audio.object")) ) {
158 #ifdef DEBUG_NOTIFICATIONS
159 object_post(SELF,
"deleting audio graph patchline!");
160 #endif // DEBUG_NOTIFICATIONS
162 object_method(destObject, GENSYM(
"audio.drop"), destInlet, sourceObject, sourceOutlet);
173 void PlugOutQFn(PlugOutPtr
self)
177 #ifdef DEBUG_NOTIFICATIONS
178 object_post(SELF,
"patcher dirtied");
179 #endif // DEBUG_NOTIFICATIONS
181 object_method(self->patcher, GENSYM(
"iterate"), (method)PlugOutIterateSetupCallback,
self, PI_DEEP, &result);
185 PlugOutAttachToPatchlinesForPatcher(
self, self->patcher);
189 void PlugOutAttachToPatchlinesForPatcher(PlugOutPtr
self, ObjectPtr patcher)
191 ObjectPtr patchline = object_attr_getobj(patcher, _sym_firstline);
192 ObjectPtr box = jpatcher_get_firstobject(patcher);
195 object_attach_byptr_register(
self, patchline, _sym_nobox);
196 patchline = object_attr_getobj(patchline, _sym_nextline);
200 SymbolPtr classname = jbox_get_maxclass(box);
202 if (classname == _sym_jpatcher) {
203 ObjectPtr subpatcher = jbox_get_object(box);
205 PlugOutAttachToPatchlinesForPatcher(
self, subpatcher);
207 box = jbox_get_nextobject(box);
213 void PlugOutAssist(PlugOutPtr
self,
void* b,
long msg,
long arg,
char* dst)
216 strcpy(dst,
"multichannel audio connection and control messages");
219 strcpy(dst,
"stats on DSP graph");
221 strcpy(dst,
"dumpout");
227 TTErr PlugOutSetup(PlugOutPtr
self)
231 atom_setobj(a+0, ObjectPtr(self->audioGraphObject));
232 atom_setlong(a+1, 0);
233 outlet_anything(self->audioGraphOutlet, GENSYM(
"audio.connect"), 2, a);
238 void PlugOutIterateResetCallback(PlugOutPtr
self, ObjectPtr obj)
241 method audioResetMethod = zgetfn(obj, GENSYM(
"audio.reset"));
243 if (audioResetMethod) {
244 self->audioGraphObject->getUnitGenerator()->getAttributeValue(
TT(
"vectorSize"), vectorSize);
245 audioResetMethod(obj, vectorSize);
250 void PlugOutIterateSetupCallback(PlugOutPtr
self, ObjectPtr obj)
252 method audioSetupMethod = zgetfn(obj, GENSYM(
"audio.setup"));
254 if (audioSetupMethod)
255 audioSetupMethod(obj);
259 TTErr PlugOutBuildGraph(PlugOutPtr
self)
262 ObjectPtr patcher = NULL;
263 ObjectPtr parent = NULL;
266 err = object_obex_lookup(
self, GENSYM(
"#P"), &patcher);
269 err = object_obex_lookup(
self, GENSYM(
"#P"), &patcher);
273 parent = object_attr_getobj(patcher, _sym_parentpatcher);
277 object_method(patcher, GENSYM(
"iterate"), (method)PlugOutIterateSetupCallback,
self, PI_DEEP, &result);
283 MaxErr PlugOutDoBuildAudioUnit(PlugOutPtr
self, SymbolPtr s, AtomCount argc, AtomPtr argv)
285 if (self->progressWindow) {
286 object_error(SELF,
"Already building a plug-in. Please wait until the process is complete and try again.");
287 return MAX_ERR_GENERIC;
290 open_progress_window(
self);
291 PlugOutBuildGraph(
self);
292 self->buildThread =
new TTThread((TTThreadCallbackType)PlugOutDoBuildAudioUnit_Export,
self);
297 MaxErr PlugOutBuildAudioUnit(PlugOutPtr
self, SymbolPtr s, AtomCount argc, AtomPtr argv)
299 defer(
self, (method)PlugOutDoBuildAudioUnit, s, argc, argv);
304 MaxErr PlugOutSetVersion(PlugOutPtr
self,
void* attr, AtomCount argc, AtomPtr argv)
312 self->pluginVersion = atom_getsym(argv);
313 sscanf(self->pluginVersion->s_name,
"%i.%i.%i", &major, &minor, &revision);
314 snprintf(str, 16,
"0x00%02i%02i%02i", major, minor, revision);
315 self->pluginVersionHex = GENSYM(str);
TTErr TTObjectBaseRelease(TTObjectBasePtr *anObject)
DEPRECATED.
TTErr MaxAudioGraphReset(t_object *x, long vectorSize)
Clear the list of source objects from which this object will try to pull audio.
Base class for all first-class Jamoma objects.
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.
void * TTPtr
A generic pointer.
void setSize(const TTUInt16 arg)
DEPRECATED.
TTErr TTObjectBaseInstantiate(const TTSymbol className, TTObjectBasePtr *returnedObjectPtr, const TTValue arguments)
DEPRECATED.
TTErr MaxAudioGraphObject(t_object *x, TTAudioGraphObjectBasePtr *returnedAudioGraphObject)
Returns a pointer to the Jamoma Audio Graph object that is wrapped by this Max object.
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
TTErr MaxAudioGraphDrop(t_object *x, long inletNumber, t_object *sourceMaxObject, long sourceOutletNumber)
Method called when a connection from an upstream node is dropped.
[doxygenAppendixC_copyExample]