21 ModularSpec *spec =
new ModularSpec;
27 TTModelInfo::registerClass();
38 class_addmethod(c->maxClass, (method)
model_assist,
"assist", A_CANT, 0L);
48 class_addmethod(c->maxClass, (method)
model_address,
"model_address", A_CANT, 0);
55 class_addmethod(c->maxClass, (method)
model_preset_read,
"preset_read", A_CANT, 0);
64 class_addmethod(c->maxClass, (method)model_preset_read,
"preset:read", A_GIMME, 0);
65 class_addmethod(c->maxClass, (method)model_preset_write,
"preset:write", A_GIMME, 0);
66 class_addmethod(c->maxClass, (method)model_preset_edit,
"preset:edit", A_GIMME, 0);
68 class_addmethod(c->maxClass, (method)model_preset_read_again,
"preset:read/again", 0);
69 class_addmethod(c->maxClass, (method)model_preset_write_again,
"preset:write/again", 0);
72 class_addmethod(c->maxClass, (method)model_signal_amenities,
"output_created", A_CANT, 0);
83 CLASS_ATTR_DEFAULT(c->maxClass,
"amenities", 0,
"all");
85 CLASS_ATTR_STYLE(c->maxClass,
"amenities", 0,
"text");
88 CLASS_ATTR_DEFAULT(c->maxClass,
"presets", 0,
"none");
90 CLASS_ATTR_STYLE(c->maxClass,
"presets", 0,
"text");
103 object_error((t_object*)x,
"can't have two models or views in the same patcher");
119 x->
outlets = (TTHandle)sysmem_newptr(
sizeof(
TTPtr) * 1);
120 x->
outlets[data_out] = outlet_new(x, NULL);
125 EXTRA->containerAddress = kTTAdrsEmpty;
126 EXTRA->argAddress = kTTAdrsEmpty;
128 EXTRA->textEditor = NULL;
129 EXTRA->presetManager =
new TTObject();
130 EXTRA->attr_presets = kTTSym_none;
131 EXTRA->filewatcher = NULL;
134 EXTRA->presetName = kTTSymEmpty;
135 EXTRA->attr_amenities =
new TTHash();
136 EXTRA->all_amenities = NO;
137 EXTRA->no_amenities = NO;
139 EXTRA->attr_amenities->append(
TTSymbol(
"all"), none);
142 attr_args_process(x, argc, argv);
159 if (EXTRA->modelInfo->valid()) {
161 modelAddress = EXTRA->containerAddress.appendAddress(
TTAddress(
"model"));
164 JamomaApplication.
send(
"ObjectUnregister", modelAddress, none);
166 delete EXTRA->modelInfo;
168 if (EXTRA->presetManager->valid()) {
170 presetAddress = EXTRA->containerAddress.appendAddress(
TTAddress(
"preset"));
173 JamomaApplication.
send(
"ObjectUnregister", presetAddress, none);
175 delete EXTRA->presetManager;
178 if (EXTRA->filewatcher) {
179 filewatcher_stop(EXTRA->filewatcher);
180 object_free(EXTRA->filewatcher);
183 delete EXTRA->toEdit;
217 EXTRA->containerAddress = returnedAddress;
222 atom_setsym(&a, gensym(description.
c_str()));
223 object_attr_setvalueof(jpatcher_get_box(x->
patcherPtr), _sym_annotation , 1, &a);
232 EXTRA->modelInfo->set(
"class", x->patcherClass);
236 args =
TTValue(adrs, *EXTRA->modelInfo, x->patcherPtr);
238 if (JamomaApplication.
send(
"ObjectRegister", args, none))
239 object_error((t_object*)x,
"can't subscribe model object");
242 if (x->patcherContext == kTTSym_model) {
244 EXTRA->modelInfo->set(kTTSym_address, returnedAddress);
247 TTModelInfoPtr(EXTRA->modelInfo->instance())->setAddressReadOnly(YES);
258 aPatcher = object_attr_getobj(x, _sym_parentpatcher);
263 isSubModel = atom_getsym(av) == _sym_p;
270 if (atom_getsym(av) == _sym_p || atom_getsym(av) == _sym_patcher) {
282 if (x->patcherContext == kTTSym_model) {
286 attr_args_process(x, ac, av);
289 aTextHandler =
TTObject(kTTSym_TextHandler);
290 x->internals->append(kTTSym_TextHandler, aTextHandler);
292 if (!EXTRA->attr_amenities->lookup(
TTSymbol(
"all"), v))
293 EXTRA->all_amenities = YES;
295 if (!EXTRA->attr_amenities->lookup(
TTSymbol(
"none"), v))
296 EXTRA->no_amenities = YES;
314 if (x->patcherContext == kTTSym_view)
319 x->subscriberObject.get(
"nodeAddress", v);
322 returnedAddress = v[0];
323 atom_setsym(&a, gensym((
char*)returnedAddress.
c_str()));
324 object_obex_dumpout(
self, gensym(
"address"), 1, &a);
340 TTList whereToSearch;
350 if (argc > 0 && atom_gettype(argv) == A_SYM) {
352 argAdrs =
TTAddress(atom_getsym(argv)->s_name);
355 if (hierarchy == gensym(
"poly"))
357 argAdrs = argAdrs.
appendInstance(EXTRA->containerAddress.getInstance());
363 EXTRA->modelInfo->set(kTTSym_address, argAdrs);
371 if (EXTRA->containerAddress.getParent() != kTTAdrsRoot) {
374 EXTRA->argAddress = argAdrs;
377 makeInternals_receiver(
self, EXTRA->containerAddress.getParent(),
TTAddress(
"model:address"), gensym(
"return_upper_view_model_address"), aReceiver, YES);
383 EXTRA->modelInfo->set(kTTSym_address, kTTAdrsRoot.
appendAddress(argAdrs));
406 EXTRA->modelInfo->set(kTTSym_address, modelAdrs);
420 EXTRA->modelInfo->get(kTTSym_address, v);
424 if (modelAdrs == kTTSymEmpty)
425 modelAdrs =
TTAddress(
"/no_model_address");
428 EXTRA->modelInfo->set(kTTSym_address, modelAdrs);
438 upperViewModelAddress = v[0];
441 if (upperViewModelAddress != kTTSymEmpty)
442 upperViewModelAddress = upperViewModelAddress.
appendAddress(EXTRA->argAddress);
444 upperViewModelAddress = kTTAdrsRoot.
appendAddress(EXTRA->argAddress);
447 EXTRA->modelInfo->set(kTTSym_address, upperViewModelAddress);
474 strcpy(dst,
"model feeback");
476 strcpy(dst,
"view feeback");
478 strcpy(dst,
"feeback");
481 strcpy(dst,
"dumpout");
490 patcherInfo->
clear();
532 outlet_anything(x->
outlets[data_out], x->msg, argc, argv);
543 char filename[MAX_FILENAME_CHARS];
552 snprintf(filename, MAX_FILENAME_CHARS, DocumentationFormat->data(), x->
patcherClass.
c_str());
564 aTextHandler.
send(kTTSym_Write, v, none);
577 if (atom_gettype(argv) == A_SYM) {
582 EXTRA->modelInfo->set(kTTSym_address, modelAdrs);
592 EXTRA->attr_amenities->getKeysSorted(keys);
600 if (!(*av = (t_atom*)getbytes(
sizeof(t_atom)*(*ac)))) {
602 return MAX_ERR_OUT_OF_MEM;
617 EXTRA->attr_amenities->clear();
626 EXTRA->attr_amenities->append(key, none);
630 EXTRA->attr_amenities->append(
TTSymbol(
"all"), none);
640 return !EXTRA->no_amenities && (EXTRA->all_amenities || !EXTRA->attr_amenities->lookup(name, v));
void model_signal_return_audio_mix(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
TTAddress appendAddress(const TTAddress &toAppend)
Return a new TTAddress with the appended part.
t_max_err model_preset_set_presets(TTPtr self, TTPtr attr, long ac, const t_atom *av)
TTObject subscriberObject
The instance of a TTSubscriber object used to register the wrapped object in the tree structure...
bool TTBoolean
Boolean flag, same as Boolean on the Mac.
void WrappedContainerClass_new(TTPtr self, long argc, t_atom *argv)
Constructor: Initiate the wrapped object instance.
TTErr send(const TTSymbol aName)
Send a message to this object with no arguments.
TTSymbol & getInstance()
Get the instance part.
TTHandle outlets
an array of outlet
TTErr wrapTTModularClassAsMaxClass(TTSymbol &ttblueClassName, const char *maxClassName, WrappedClassPtr *c, ModularSpec *specificities)
Wrap a Jamoma class as a Max class.
void model_return_address(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
void model_preset_return_names(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
TTErr lookup(const TTSymbol key, TTValue &value)
Find the value for the given key.
void model_signal_amenities(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
We build a directory of TTNodes, and you can request a pointer for any TTNode, or add an observer to ...
TTSymbol patcherClass
the patcher class in which the external is
TTPtr getContext()
Get a pointer to the context of this node.
void model_preset_amenities(TTPtr self)
The TTAddress class is used to represent a string and efficiently pass and compare that string...
Create and use Jamoma object instances.
void model_preset_edclose(TTPtr self, char **text, long size)
void model_reference_write(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
size_type size() const noexcept
Return the number of elements.
void model_address(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
void * extra
used to keep very specific things
TTAddress appendInstance(const TTSymbol anInstance)
Return a new TTAddress with a instance part.
t_object * patcherPtr
the patcher in which the external is (ignoring subpatcher)
void model_preset_edit(TTPtr self, t_symbol *msg, long argc, const t_atom *argv)
void model_signal_return_audio_mute(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
TTHashPtr internals
An hash table to store any internal TTObjectBases (like TTData, TTViewer, ...)
void WrappedContainerClass_anything(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
void model_share_patcher_node(TTPtr self, TTNodePtr *patcherNode)
Maintain a collection of TTValue objects indexed by TTSymbol pointers.
void model_subscribe(TTPtr self)
void model_signal_return_audio_gain(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
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 WrappedContainerClass_free(TTPtr self)
Deconstructor: Destroy the object and free memory assigned to it.
t_max_err model_set_amenities(TTPtr self, TTPtr attr, long ac, t_atom *av)
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 model_preset_write_again(TTPtr self)
TTObject wrappedObject
The instance of the Jamoma object we are wrapping.
void model_preset_read_again(TTPtr self)
this flag means that an address have a leading slash
void model_assist(TTPtr self, void *b, long msg, long arg, char *dst)
Display assist messages for inlets and outlets in Max.
void model_subscribe_view(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
const char * c_str() const
Return a pointer to the internal string as a C-string.
void WrapTTContainerClass(WrappedClassPtr c)
Set up what methods (Max messages) that the wrapped class is to respond to.
TTBoolean model_test_amenities(TTPtr self, TTSymbol name)
j.model / j.view - The main control center of Jamoma model and view patcher
void clear()
Clear all values from the vector, leaving with size of 0.
void model_preset_filechanged(TTPtr self, char *filename, short path)
t_max_err model_preset_get_presets(TTPtr self, TTPtr attr, long *ac, t_atom **av)
int C74_EXPORT main(void)
Set up this class as a Max external the first time an object of this kind is instantiated.
void model_preset_write(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
TTErr getAddress(TTAddress &returnedAddress, TTAddress from=kTTAdrsEmpty)
Get the address of the node.
Data Structure for this object.
TTAddressType getType()
Get the type.
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)
A base class for Jamoma models.
void model_init(TTPtr self)
void model_signal_return_data_active(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
TTSymbol patcherName
the patcher name in which the external is
void model_share_patcher_info(TTPtr self, TTValuePtr patcherInfo)
void model_signal_return_audio_bypass(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
void model_preset_read(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
void model_signal_return_data_bypass(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
void model_reference_dowrite(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
TTBoolean valid() const
Determine if the object contained by this TTObject is truly ready for use.
void model_return_upper_view_model_address(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
WrappedModularInstance * WrappedModularInstancePtr
Pointer to a wrapped instance of our object.
#define accessApplicationLocalDirectory
Access to the local application directory.
[doxygenAppendixC_copyExample]
t_max_err model_get_amenities(TTPtr self, TTPtr attr, long *ac, t_atom **av)
TTNodePtr getParent()
Get a pointer to the parent node of the node.
void model_return_value(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
unsigned char TTUInt8
8 bit unsigned integer (char)