aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/dyn/dyn_api.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'externals/grill/dyn/dyn_api.cpp')
-rw-r--r--externals/grill/dyn/dyn_api.cpp269
1 files changed, 269 insertions, 0 deletions
diff --git a/externals/grill/dyn/dyn_api.cpp b/externals/grill/dyn/dyn_api.cpp
new file mode 100644
index 00000000..c1ecbf72
--- /dev/null
+++ b/externals/grill/dyn/dyn_api.cpp
@@ -0,0 +1,269 @@
+/*
+dyn - dynamical object management
+
+Copyright (c)2003-2004 Thomas Grill (gr@grrrr.org)
+For information on usage and redistribution, and for a DISCLAIMER OF ALL
+WARRANTIES, see the file, "license.txt," in this distribution.
+*/
+
+#include "dyn_proto.h"
+
+DYN_EXPORT int dyn_EnumObjects(dyn_id id,dyn_enumfun fun,void *data)
+{
+ dyn_patcher *p;
+ if(id && (p = id->Patcher())) {
+ p->Enumerate(fun,data);
+ return DYN_ERROR_NONE;
+ }
+ else
+ return DYN_ERROR_NOTFOUND;
+}
+
+DYN_EXPORT int dyn_NewPatcher(int sched,dyn_id *sid,dyn_callback cb,dyn_id psid /*,const char *name*/)
+{
+ try {
+ ASSERT(sid);
+ *sid = NewObject(DYN_TYPE_PATCHER,cb,psid,NULL);
+ return *sid?DYN_ERROR_NONE:DYN_ERROR_GENERAL;
+ }
+ catch(int err) { return err; }
+}
+
+DYN_EXPORT int dyn_NewObject(int sched,dyn_id *oid,dyn_callback cb,dyn_id sid,const t_symbol *obj,int argc,const t_atom *argv)
+{
+ try {
+ ASSERT(oid);
+ *oid = NewObject(DYN_TYPE_OBJECT,cb,sid,obj,argc,argv);
+ return *oid?DYN_ERROR_NONE:DYN_ERROR_GENERAL;
+ }
+ catch(int err) { return err; }
+}
+
+DYN_EXPORT int dyn_NewObjectStr(int sched,dyn_id *oid,dyn_callback cb,dyn_id sid,const char *args)
+{
+ t_binbuf *b = binbuf_new();
+ binbuf_text(b,(char *)args,strlen(args));
+ int argc = binbuf_getnatom(b);
+ t_atom *argv = binbuf_getvec(b);
+ int ret;
+ if(argc) {
+ t_symbol *sym;
+ if(argv->a_type == A_SYMBOL) { sym = atom_getsymbol(argv); argc--,argv++; }
+ else sym = &s_list;
+ ret = dyn_NewObject(sched,oid,cb,sid,sym,argc,argv);
+ }
+ else
+ ret = DYN_ERROR_PARAMS;
+ binbuf_free(b);
+ return ret;
+}
+
+DYN_EXPORT int dyn_NewMessage(int sched,dyn_id *oid,dyn_callback cb,dyn_id sid,int argc,t_atom *argv)
+{
+ try {
+ ASSERT(oid);
+ *oid = NewObject(DYN_TYPE_MESSAGE,cb,sid,NULL,argc,argv);
+ return *oid?DYN_ERROR_NONE:DYN_ERROR_GENERAL;
+ }
+ catch(int err) { return err; }
+}
+
+DYN_EXPORT int dyn_NewMessageStr(int sched,dyn_id *oid,dyn_callback cb,dyn_id sid,const char *msg)
+{
+ t_binbuf *b = binbuf_new();
+ binbuf_text(b,(char *)msg,strlen(msg));
+ int argc = binbuf_getnatom(b);
+ t_atom *argv = binbuf_getvec(b);
+ int ret = dyn_NewMessage(sched,oid,cb,sid,argc,argv);
+ binbuf_free(b);
+ return ret;
+}
+
+DYN_EXPORT int dyn_NewConnection(int sched,dyn_id *cid,dyn_callback cb,dyn_id soid,int outlet,dyn_id doid,int inlet)
+{
+ ASSERT(cid);
+ ASSERT(soid && inlet >= 0);
+ ASSERT(doid && outlet >= 0);
+
+ dyn_patchable *sobj = soid->Patchable();
+ dyn_patchable *dobj = doid->Patchable();
+
+ int ret = DYN_ERROR_NONE;
+ dyn_id conn = DYN_ID_NONE;
+
+ if(!sobj || !dobj) {
+ ret = DYN_ERROR_TYPEMISMATCH;
+ goto error;
+ }
+
+ if(sobj->owner != dobj->owner) {
+ ret = DYN_ERROR_CONN_PATCHER;
+ goto error;
+ }
+
+ {
+ dyn_patcher *patcher = sobj->owner;
+ ASSERT(patcher);
+
+ // sys_lock();
+
+ canvas_setcurrent(patcher->glist());
+ bool ok =
+ !canvas_isconnected(patcher->glist(),(t_text *)sobj->pdobj,outlet,(t_text *)dobj->pdobj,inlet) &&
+ obj_connect((t_object *)sobj->pdobj, outlet,(t_object *)dobj->pdobj,inlet);
+ canvas_unsetcurrent(patcher->glist());
+ // sys_unlock();
+
+ if(!ok) {
+ ret = DYN_ERROR_CONN_GENERAL;
+ goto error;
+ }
+ }
+
+ conn = new dyn_ident(DYN_TYPE_CONN,cb);
+ conn->Set(new dyn_conn(conn,soid,outlet,doid,inlet));
+
+ // add connection to object lists
+ sobj->AddOutlet(conn->Conn());
+ dobj->AddInlet(conn->Conn());
+
+ *cid = conn;
+ return ret;
+
+error:
+ if(conn != DYN_ID_NONE) delete conn;
+ return ret;
+}
+
+DYN_EXPORT int dyn_Free(int sched,dyn_id oid)
+{
+ try {
+ DelObject(oid);
+ return DYN_ERROR_NONE;
+ }
+ catch(int err) { return err; }
+}
+
+// NOT IMPLEMENTED
+DYN_EXPORT int dyn_Reset()
+{
+ return DYN_ERROR_GENERAL;
+}
+
+
+DYN_EXPORT int dyn_SetData(dyn_id oid,void *data)
+{
+ if(oid) {
+ oid->userdata = data;
+ return DYN_ERROR_NONE;
+ }
+ else
+ return DYN_ERROR_NOTFOUND;
+}
+
+DYN_EXPORT int dyn_GetData(dyn_id oid,void **data)
+{
+ ASSERT(data);
+ if(oid) {
+ *data = oid->userdata;
+ return DYN_ERROR_NONE;
+ }
+ else
+ return DYN_ERROR_NOTFOUND;
+}
+
+
+DYN_EXPORT int dyn_GetType(dyn_id oid)
+{
+ if(oid)
+ return oid->type;
+ else
+ return DYN_ERROR_NOTFOUND;
+}
+
+
+DYN_EXPORT int dyn_GetInletCount(dyn_id id)
+{
+ dyn_patchable *p;
+ if(id && (p = id->Patchable()))
+ return p->GetInletCount();
+ else
+ return DYN_ERROR_NOTFOUND;
+}
+
+DYN_EXPORT int dyn_GetOutletCount(dyn_id id)
+{
+ dyn_patchable *p;
+ if(id && (p = id->Patchable()))
+ return p->GetOutletCount();
+ else
+ return DYN_ERROR_NOTFOUND;
+}
+
+DYN_EXPORT int dyn_GetInletType(dyn_id id,int inlet)
+{
+ dyn_patchable *p;
+ if(id && (p = id->Patchable()))
+ return p->GetInletType(inlet);
+ else
+ return DYN_ERROR_NOTFOUND;
+}
+
+DYN_EXPORT int dyn_GetOutletType(dyn_id id,int outlet)
+{
+ dyn_patchable *p;
+ if(id && (p = id->Patchable()))
+ return p->GetOutletType(outlet);
+ else
+ return DYN_ERROR_NOTFOUND;
+}
+
+
+DYN_EXPORT int dyn_GetConnectionSource(dyn_id cid,dyn_id *soid,int *outlet)
+{
+ ASSERT(soid && outlet);
+ dyn_conn *c;
+ if(cid && (c = cid->Conn())) {
+ *soid = c->src;
+ *outlet = c->slet;
+ return DYN_ERROR_NONE;
+ }
+ else
+ return DYN_ERROR_NOTFOUND;
+}
+
+DYN_EXPORT int dyn_GetConnectionDrain(dyn_id cid,dyn_id *doid,int *inlet)
+{
+ ASSERT(doid && inlet);
+ dyn_conn *c;
+ if(cid && (c = cid->Conn())) {
+ *doid = c->dst;
+ *inlet = c->dlet;
+ return DYN_ERROR_NONE;
+ }
+ else
+ return DYN_ERROR_NOTFOUND;
+}
+
+
+DYN_EXPORT int dyn_EnumInletConnections(dyn_id id,int inlet,dyn_enumfun fun,void *data)
+{
+ dyn_patchable *p;
+ if(id && (p = id->Patchable())) {
+ p->EnumInlet(inlet,fun,data);
+ return DYN_ERROR_NONE;
+ }
+ else
+ return DYN_ERROR_NOTFOUND;
+}
+
+DYN_EXPORT int dyn_EnumOutletConnections(dyn_id id,int outlet,dyn_enumfun fun,void *data)
+{
+ dyn_patchable *p;
+ if(id && (p = id->Patchable())) {
+ p->EnumOutlet(outlet,fun,data);
+ return DYN_ERROR_NONE;
+ }
+ else
+ return DYN_ERROR_NOTFOUND;
+}