18 #include "jpatcher_api.h"
21 typedef struct extra {
27 #define EXTRA ((t_extra*)x->extra)
33 void WrapTTCueManagerClass(WrappedClassPtr c);
34 void WrappedCueManagerClass_new(
TTPtr self,
long argc, t_atom *argv);
35 void WrappedCueManageClass_free(
TTPtr self);
37 void cue_assist(
TTPtr self,
void *b,
long msg,
long arg,
char *dst);
39 void cue_return_value(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
40 void cue_return_names(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
42 void cue_get(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
43 void cue_set(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
45 void cue_read(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
46 void cue_doread(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
47 void cue_read_again(
TTPtr self);
48 void cue_doread_again(
TTPtr self);
50 void cue_write(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
51 void cue_dowrite(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
52 void cue_write_again(
TTPtr self);
53 void cue_dowrite_again(
TTPtr self);
55 void cue_dorecall(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv);
57 void cue_edit(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv);
58 void cue_edclose(
TTPtr self,
char **text,
long size);
59 void cue_doedit(
TTPtr self);
61 void cue_subscribe(
TTPtr self);
63 void cue_return_model_address(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv);
65 t_max_err cue_get_relative(
TTPtr self,
TTPtr attr,
long *ac, t_atom **av);
66 t_max_err cue_set_relative(
TTPtr self,
TTPtr attr,
long ac,
const t_atom *av);
70 ModularSpec *spec =
new ModularSpec;
71 spec->_wrap = &WrapTTCueManagerClass;
72 spec->_new = &WrappedCueManagerClass_new;
73 spec->_free = &WrappedCueManageClass_free;
79 void WrapTTCueManagerClass(WrappedClassPtr c)
81 class_addmethod(c->maxClass, (method)cue_assist,
"assist", A_CANT, 0L);
83 class_addmethod(c->maxClass, (method)cue_return_model_address,
"return_model_address", A_CANT, 0);
85 class_addmethod(c->maxClass, (method)cue_return_value,
"return_value", A_CANT, 0);
87 class_addmethod(c->maxClass, (method)cue_return_names,
"return_names", A_CANT, 0);
89 class_addmethod(c->maxClass, (method)cue_read,
"cue_read", A_CANT, 0);
90 class_addmethod(c->maxClass, (method)cue_write,
"cue_write", A_CANT, 0);
92 class_addmethod(c->maxClass, (method)cue_edit,
"dblclick", A_CANT, 0);
93 class_addmethod(c->maxClass, (method)cue_edclose,
"edclose", A_CANT, 0);
95 class_addmethod(c->maxClass, (method)cue_get,
"get", A_GIMME, 0);
96 class_addmethod(c->maxClass, (method)cue_set,
"set", A_GIMME, 0);
98 class_addmethod(c->maxClass, (method)cue_read,
"read", A_GIMME, 0);
99 class_addmethod(c->maxClass, (method)cue_write,
"write", A_GIMME, 0);
100 class_addmethod(c->maxClass, (method)cue_edit,
"edit", A_GIMME, 0);
102 class_addmethod(c->maxClass, (method)cue_read_again,
"read/again", 0);
103 class_addmethod(c->maxClass, (method)cue_write_again,
"write/again", 0);
106 CLASS_ATTR_ACCESSORS(c->maxClass,
"relative", cue_get_relative, cue_set_relative);
107 CLASS_ATTR_STYLE(c->maxClass,
"relative", 0,
"onoff");
110 void WrappedCueManagerClass_new(
TTPtr self,
long argc, t_atom *argv)
116 long attrstart = attr_args_offset(argc, argv);
122 if (attrstart && argv) {
124 if (atom_gettype(argv) == A_SYM) {
126 name = atom_getsym(argv);
130 object_error((t_object*)x,
"argument not expected");
134 x->
outlets = (TTHandle)sysmem_newptr(
sizeof(
TTPtr) * 1);
135 x->
outlets[line_out] = outlet_new(x, NULL);
141 aTextHandler =
TTObject(kTTSym_TextHandler);
148 EXTRA->cueName = kTTSymEmpty;
150 EXTRA->textEditor = NULL;
153 attr_args_process(x, argc, argv);
156 void WrappedCueManageClass_free(
TTPtr self)
160 delete EXTRA->toEdit;
165 TTObject empty, aTextHandler = o[0];
166 aTextHandler.
set(kTTSym_object, empty);
171 void cue_subscribe(
TTPtr self)
176 TTAddress absoluteAddress, returnedAddress;
188 contextAddress = v[0];
192 if (contextAddress != kTTAdrsEmpty) {
197 makeInternals_receiver(x, contextAddress,
TTSymbol(
"/model:address"), gensym(
"return_model_address"), anObject, YES);
213 defer_low((t_object*)x, (method)cue_subscribe, NULL, 0, 0);
217 void cue_return_model_address(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv)
231 void cue_assist(
TTPtr self,
void *b,
long msg,
long arg,
char *dst)
238 strcpy(dst,
"cue output");
241 strcpy(dst,
"dumpout");
247 void cue_return_value(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
252 if (msg == _sym_nothing)
253 outlet_atoms(x->
outlets[line_out], argc, argv);
255 outlet_anything(x->
outlets[line_out], msg, argc, argv);
258 void cue_return_names(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
261 outlet_anything(x->
outlets[dump_out], gensym(
"names"), argc, argv);
264 void cue_get(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
276 if (atom_gettype(argv) == A_SYM && atom_gettype(argv+1) == A_SYM) {
278 attribute =
TTSymbol((
char*)atom_getsym(argv)->s_name);
279 name =
TTSymbol((
char*)atom_getsym(argv+1)->s_name);
288 if (!allCues->
lookup(name, v)) {
291 if (!cue.
get(attribute, v)) {
296 object_obex_dumpout(
self, atom_getsym(argv), ac, av);
299 object_error((t_object*)x,
"%s attribute does'nt exist", atom_getsym(argv)->s_name);
302 object_error((t_object*)x,
"%s cue does'nt exist", atom_getsym(argv+1)->s_name);
308 void cue_set(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
318 if (atom_gettype(argv) == A_SYM && atom_gettype(argv+1) == A_SYM) {
320 attribute =
TTSymbol((
char*)atom_getsym(argv)->s_name);
321 name =
TTSymbol((
char*)atom_getsym(argv+1)->s_name);
330 if (!allCues->
lookup(name, v)) {
337 if (cue.
set(attribute, v))
338 object_error((t_object*)x,
"%s attribute does'nt exist", atom_getsym(argv)->s_name);
341 object_error((t_object*)x,
"%s cue does'nt exist", atom_getsym(argv+1)->s_name);
347 void cue_read(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
349 defer(
self, (method)cue_doread, msg, argc, argv);
352 void cue_doread(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
374 tterr = aTextHandler.
send(kTTSym_Read, v, none);
378 object_obex_dumpout(
self, _sym_read, argc, argv);
380 object_obex_dumpout(
self, _sym_error, 0, NULL);
385 void cue_read_again(
TTPtr self)
387 defer(
self, (method)cue_doread_again, NULL, 0, NULL);
390 void cue_doread_again(
TTPtr self)
408 tterr = aTextHandler.
send(kTTSym_ReadAgain, v, none);
412 object_obex_dumpout(
self, _sym_read, 0, NULL);
414 object_obex_dumpout(
self, _sym_error, 0, NULL);
419 void cue_write(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
421 defer(
self, (method)cue_dowrite, msg, argc, argv);
424 void cue_dowrite(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv)
427 char filename[MAX_FILENAME_CHARS];
436 snprintf(filename, MAX_FILENAME_CHARS,
"untitled.cues.txt");
449 tterr = aTextHandler.
send(kTTSym_Write, v, none);
453 object_obex_dumpout(
self, _sym_write, argc, argv);
455 object_obex_dumpout(
self, _sym_error, 0, NULL);
460 void cue_write_again(
TTPtr self)
462 defer(
self, (method)cue_dowrite_again, NULL, 0, NULL);
465 void cue_dowrite_again(
TTPtr self)
483 tterr = aTextHandler.
send(kTTSym_WriteAgain, v, none);
487 object_obex_dumpout(
self, _sym_write, 0, NULL);
489 object_obex_dumpout(
self, _sym_error, 0, NULL);
494 void cue_dorecall(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv)
503 if (atom_gettype(argv) == A_SYM) {
518 if (o.
name() == kTTSym_Container) {
520 o.
get(kTTSym_initialized, v);
531 void cue_edit(
TTPtr self, t_symbol *msg,
long argc,
const t_atom *argv)
535 char title[MAX_FILENAME_CHARS];
545 EXTRA->cueName = kTTSymEmpty;
549 if (atom_gettype(argv) == A_LONG)
551 TTUInt32 index = atom_getlong(argv);
556 if (index > 0 && index <= v.
size())
557 v.
get(index-1, name);
560 object_error((t_object*)x,
"%d does'nt exist", atom_getlong(argv));
564 else if (atom_gettype(argv) == A_SYM)
565 name =
TTSymbol(atom_getsym(argv)->s_name);
567 if (name != kTTSymEmpty)
576 if (!allCues->
lookup(name, v))
579 *EXTRA->toEdit = v[0];
580 EXTRA->cueName = name;
584 object_error((t_object*)x,
"%s does'nt exist", atom_getsym(argv)->s_name);
592 if (!EXTRA->textEditor) {
594 EXTRA->textEditor = (t_object*)object_new(_sym_nobox, _sym_jed, x, 0);
606 aTextHandler.
set(kTTSym_object, *EXTRA->toEdit);
607 tterr = aTextHandler.
send(kTTSym_Write, (
TTPtr)buffer, none);
612 object_method(EXTRA->textEditor, _sym_settext, buffer->
c_str(), _sym_utf_8);
613 object_attr_setchar(EXTRA->textEditor, gensym(
"scratch"), 1);
615 snprintf(title, MAX_FILENAME_CHARS,
"cuelist editor");
616 object_attr_setsym(EXTRA->textEditor, _sym_title, gensym(title));
619 atom_setsym(&a, gensym(
"opened"));
620 object_obex_dumpout(
self, gensym(
"editor"), 1, &a);
628 void cue_edclose(
TTPtr self,
char **text,
long size)
633 EXTRA->textEditor = NULL;
635 defer_low((t_object*)x, (method)cue_doedit, NULL, 0, NULL);
638 void cue_doedit(
TTPtr self)
654 tterr = aTextHandler.
send(kTTSym_Read, (
TTPtr)EXTRA->text, none);
658 atom_setsym(&a, gensym(
"closed"));
659 object_obex_dumpout(
self, gensym(
"editor"), 1, &a);
662 object_obex_dumpout(
self, _sym_error, 0, NULL);
667 EXTRA->textEditor = NULL;
669 EXTRA->cueName = kTTSymEmpty;
672 t_max_err cue_get_relative(
TTPtr self,
TTPtr attr,
long *ac, t_atom **av)
681 if (!(*av = (t_atom*)getbytes(
sizeof(t_atom)*(*ac)))) {
683 return MAX_ERR_OUT_OF_MEM;
687 atom_setlong(*av, x->
index);
692 t_max_err cue_set_relative(
TTPtr self,
TTPtr attr,
long ac,
const t_atom *av)
697 x->
index = atom_getlong(av);
703 defer_low((t_object*)x, (method)cue_subscribe, NULL, 0, 0);
TTAddress appendAddress(const TTAddress &toAppend)
Return a new TTAddress with the appended part.
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.
TTErr send(const TTSymbol aName)
Send a message to this object with no arguments.
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.
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 ...
TTAddress address
sometime external needs to store an address (e.g. send, receive, view, ...)
TTSymbol patcherClass
the patcher class in which the external is
const char * c_str() const
Return a pointer to the internal C-string.
The TTAddress class is used to represent a string and efficiently pass and compare that string...
Create and use Jamoma object instances.
TTObject & getObject()
Get the object binded by this node.
size_type size() const noexcept
Return the number of elements.
void * extra
used to keep very specific things
t_object * patcherPtr
the patcher in which the external is (ignoring subpatcher)
TTHashPtr internals
An hash table to store any internal TTObjectBases (like TTData, TTViewer, ...)
Maintain a collection of TTValue objects indexed by TTSymbol pointers.
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.
TTSymbol name() const
Return the name of this class.
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.
void get(const TTUInt16 index, T &returnedElementValue) const
DEPRECATED.
TTObject wrappedObject
The instance of the Jamoma object we are wrapping.
Data Structure for this object.
TTErr
Jamoma Error Codes Enumeration of error codes that might be returned by any of the TTBlue functions a...
Wraps Jamoma Core classes as objects for Max/MSP.
std::uint32_t TTUInt32
32 bit unsigned integer
TTSymbol patcherContext
the patcher context in which the external is (model, view)
TTSymbol patcherName
the patcher name in which the external is
The TTString class is used to represent a string.
long index
index of the inlet used
int C74_EXPORT main(void)
Set up this class as a Max external the first time an object of this kind is instantiated.
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]