Max 5 API Reference
00001 /* 00002 myob 00003 Copyright 2004 - Cycling '74 00004 jeremy bernstein - jeremy@bootsquad.com 00005 */ 00006 00007 #include "ext.h" 00008 #include "ext_common.h" 00009 #include "ext_obex.h" 00010 00011 typedef struct _myob 00012 { 00013 t_object ob; 00014 t_box *b; 00015 t_atom *argv; 00016 long argc; 00017 void *out; 00018 } t_myob; 00019 00020 void *myob_new(t_symbol *s, long argc, t_atom *argv); 00021 void myob_free(t_myob *x); 00022 void myob_assist(t_myob *x, void *b, long m, long a, char *s); 00023 void myob_anything(t_myob *x, t_symbol *s, long argc, t_atom *argv); 00024 void myob_bang(t_myob *x); 00025 void myob_output(t_myob *x); 00026 void myob_float(t_myob *x, double f); 00027 void myob_int(t_myob *x, long c); 00028 00029 // pattr support function prototypes 00030 t_max_err myob_getvalueof(t_myob *x, long *ac, t_atom **av); 00031 t_max_err myob_setvalueof(t_myob *x, long ac, t_atom *av); 00032 00033 void *myob_class; 00034 00035 void main(void) 00036 { 00037 setup((t_messlist **)&myob_class, (method)myob_new, (method)myob_free, (short)sizeof(t_myob), 00038 0L, A_GIMME, 0); 00039 00040 // initialize the common symbols, since we want to use them 00041 common_symbols_init(); 00042 00043 addbang((method)myob_bang); 00044 addfloat((method)myob_float); 00045 addint((method)myob_int); 00046 addmess((method)myob_anything, "list", A_GIMME,0); 00047 addmess((method)myob_anything, "set", A_GIMME,0); 00048 addmess((method)myob_anything, "anything", A_GIMME,0); 00049 addmess((method)myob_assist, "assist", A_CANT,0); 00050 00051 // these methods support the pattr set of objects 00052 addmess((method)myob_getvalueof, "getvalueof", A_CANT,0); 00053 addmess((method)myob_setvalueof, "setvalueof", A_CANT,0); 00054 } 00055 00056 void myob_bang(t_myob *x) 00057 { 00058 myob_output(x); 00059 } 00060 00061 void myob_output(t_myob *x) 00062 { 00063 if (x->argc && x->argv) { 00064 if (x->argc > 1) { 00065 if (x->argv->a_type != A_SYM) 00066 outlet_list(x->out, _sym_list, x->argc, x->argv); 00067 else 00068 outlet_anything(x->out, atom_getsym(x->argv), x->argc - 1, x->argv + 1); 00069 } 00070 else { 00071 switch (x->argv->a_type) { 00072 case A_LONG: outlet_int(x->out, atom_getlong(x->argv)); break; 00073 case A_FLOAT: outlet_float(x->out, atom_getfloat(x->argv)); break; 00074 case A_SYM: outlet_anything(x->out, atom_getsym(x->argv), 0, NULL); break; 00075 default: break; 00076 } 00077 } 00078 } 00079 } 00080 00081 00082 void myob_float(t_myob *x, double f) 00083 { 00084 t_atom a; 00085 00086 atom_setfloat(&a, f); 00087 myob_anything(x, _sym_float, 1, &a); 00088 } 00089 00090 void myob_int(t_myob *x, long c) 00091 { 00092 t_atom a; 00093 00094 atom_setlong(&a, c); 00095 myob_anything(x, _sym_int, 1, &a); 00096 } 00097 00098 void myob_anything(t_myob *x, t_symbol *s, long ac, t_atom *av) 00099 { 00100 if (x->argv) 00101 sysmem_freeptr(x->argv); 00102 00103 if (s == _sym_int || s == _sym_float || s == _sym_list || s == _sym_set || s == _sym_nothing) { 00104 x->argc = ac; 00105 x->argv = (t_atom *)sysmem_newptr(sizeof(t_atom) * x->argc); 00106 sysmem_copyptr(av, x->argv, sizeof(t_atom) * ac); 00107 } 00108 else { 00109 x->argc = ac + 1; 00110 x->argv = (t_atom *)sysmem_newptr(sizeof(t_atom) * x->argc); 00111 atom_setsym(x->argv, s); 00112 sysmem_copyptr(av, x->argv + 1, sizeof(t_atom) * ac); 00113 } 00114 00115 // we call object_notify on the box, not on the object, 00116 // because the box is the registered object. 00117 // if myob were a UI object, we would call object_notify on the object pointer, 00118 // which, in the case of a UI object, is also the box. 00119 object_notify(x->b, _sym_modified, NULL); 00120 00121 if (s != _sym_set) 00122 myob_output(x); 00123 } 00124 00125 t_max_err myob_getvalueof(t_myob *x, long *ac, t_atom **av) 00126 { 00127 if (ac && av) { 00128 if (*ac && *av) { 00129 // memory passed in; use it. 00130 } 00131 else { 00132 if (*av = (t_atom *)getbytes(sizeof(t_atom) * x->argc)) 00133 *ac = x->argc; 00134 else { 00135 *ac = 0; 00136 return MAX_ERR_OUT_OF_MEM; 00137 } 00138 } 00139 sysmem_copyptr(x->argv, *av, sizeof(t_atom) * (*ac)); 00140 } 00141 return MAX_ERR_NONE; 00142 } 00143 00144 t_max_err myob_setvalueof(t_myob *x, long ac, t_atom *av) 00145 { 00146 if (ac && av) { 00147 myob_anything(x, _sym_nothing, ac, av); 00148 } 00149 return MAX_ERR_NONE; 00150 } 00151 00152 void myob_assist(t_myob *x, void *b, long m, long a, char *s) 00153 { 00154 if (m == 1) { //input 00155 sprintf(s, "int, float, list, set, anything"); 00156 } 00157 else { //output 00158 sprintf(s, "anything out"); 00159 } 00160 } 00161 00162 void myob_free(t_myob *x) 00163 { 00164 if (x->argv) 00165 sysmem_freeptr(x->argv); 00166 } 00167 00168 void *myob_new(t_symbol *s, long argc, t_atom *argv) 00169 { 00170 t_myob *x; 00171 t_atom a; 00172 00173 if (x = (t_myob *)newobject(myob_class)) { 00174 // we need to save the object's box for the object_notify function 00175 x->b = (t_box *)gensym("#B")->s_thing; 00176 x->argv = 0; 00177 x->argc = 0; 00178 x->out = outlet_new(x, 0L); 00179 atom_setlong(&a, 0); 00180 myob_anything(x, _sym_set, 1, &a); 00181 } 00182 return (x); 00183 }
Copyright © 2008, Cycling '74