[PD-cvs] pd/src desire.c,1.1.2.39,1.1.2.40
Mathieu Bouchard
matju at users.sourceforge.net
Sat Oct 29 01:34:13 CEST 2005
Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4793
Modified Files:
Tag: devel_0_39
desire.c
Log Message:
added the update-queue and the update-manager
and the observer-notice-forwarder (gobj_changed3) and made toplevel canvases send to the queue.
Index: desire.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/desire.c,v
retrieving revision 1.1.2.39
retrieving revision 1.1.2.40
diff -C2 -d -r1.1.2.39 -r1.1.2.40
*** desire.c 28 Oct 2005 12:53:07 -0000 1.1.2.39
--- desire.c 28 Oct 2005 23:34:11 -0000 1.1.2.40
***************
*** 34,38 ****
//--------------------------------------------------------------------------
! // t_appendix: an extension to t_gobj written by Mathieu Bouchard so that
// all t_gobj's may have new fields without sacrificing binary compat with
// externals compiled for PureMSP.
--- 34,38 ----
//--------------------------------------------------------------------------
! // t_appendix: an extension to t_gobj made by matju so that
// all t_gobj's may have new fields without sacrificing binary compat with
// externals compiled for PureMSP.
***************
*** 71,75 ****
t_atom argv[1];
SETFLOAT(argv,(float)dirty);
! gobj_changed2(self,1,argv);
}
--- 71,75 ----
t_atom argv[1];
SETFLOAT(argv,(float)dirty);
! gobj_changed3(self,self,1,argv);
}
***************
*** 78,81 ****
--- 78,86 ----
void gobj_changed2 (void *self_, int argc, t_atom *argv) {
t_gobj *self = (t_gobj *)self_;
+ gobj_changed3(self,self,argc,argv);
+ }
+
+ void gobj_changed3 (void *self_, t_gobj *origin, int argc, t_atom *argv) {
+ t_gobj *self = (t_gobj *)self_;
t_appendix *d = self->g_adix;
int i;
***************
*** 83,87 ****
t_gobj *obs = d->obs[i];
t_notice ice = obs->g_pd->c_notice;
! if (ice) ice(obs,self,argc,argv);
else post("null func ptr for class %s",self->g_pd->c_name->s_name);
--- 88,92 ----
t_gobj *obs = d->obs[i];
t_notice ice = obs->g_pd->c_notice;
! if (ice) ice(obs,origin,argc,argv);
else post("null func ptr for class %s",self->g_pd->c_name->s_name);
***************
*** 90,95 ****
--- 95,165 ----
//--------------------------------------------------------------------------
+ // some simple ringbuffer-style queue
+ // when this becomes too small, use a bigger constant or a better impl.
+
+ #define QUEUE_SIZE 1024
+ typedef struct _queue {
+ int start,len;
+ void *o[QUEUE_SIZE];
+ } t_queue;
+
+ t_queue *queue_new (void) {
+ t_queue *self = (t_queue *)malloc(sizeof(t_queue));
+ self->start = self->len = 0;
+ return self;
+ }
+
+ void queue_put (t_queue *self, void *stuff) {
+ if (self->len==QUEUE_SIZE) {bug("queue full"); return;}
+ self->o[(self->start+self->len)%QUEUE_SIZE] = stuff;
+ self->len++;
+ }
+
+ void *queue_get (t_queue *self) {
+ void *r = self->o[self->start];
+ self->start = (self->start+1)%QUEUE_SIZE;
+ self->len--;
+ return r;
+ }
+
+ int queue_empty (t_queue *self) {return self->len==0;}
+ int queue_full (t_queue *self) {return self->len==QUEUE_SIZE;}
+
+ //--------------------------------------------------------------------------
// update manager:
+ typedef struct _manager {
+ t_queue *q;
+ t_clock *clock;
+ } t_manager;
+
+ t_manager *manager;
+
+ void manager_call (void *foo) {
+ t_manager *self = (t_manager *)foo;
+ while (!queue_empty(self->q)) {
+ t_gobj *o = (t_gobj *)queue_get(self->q);
+ if (!o->g_adix->dirtyc) continue;
+ pd_upload(o);
+ o->g_adix->dirtyc = 0;
+ }
+ clock_delay(self->clock,50);
+ }
+
+ void manager_notice (t_manager *self, t_gobj *origin, int argc, t_atom *argv) {
+ t_appendix *a = (t_appendix *)origin->g_adix;
+ if (!a->dirtyc) queue_put(self->q,origin);
+ a->dirtyc = 1;
+ SETFLOAT(a->dirtyv,-1); /* in the future this will contain real data */
+ }
+
+ t_manager *manager_new (void) {
+ t_manager *self = (t_manager *)malloc(sizeof(t_manager));
+ self->q = queue_new();
+ self->clock = clock_new(self,(t_method)manager_call);
+ clock_delay(self->clock,0);
+ return self;
+ }
+
//--------------------------------------------------------------------------
/* the "glist" class is also known as "canvas" (the two used
***************
*** 13336,13340 ****
--- 13406,13416 ----
void canvas_notice(t_gobj *x, struct _gobj *origin, int argc, t_atom *argv) {
+ t_canvas *self = (t_canvas *)x;
post("canvas_notice(%p,%p,%d,...)",x,origin,argc);
+ if (self->gl_havewindow) {
+ manager_notice(manager,origin,argc,argv);
+ } else {
+
+ }
}
***************
*** 13438,13441 ****
--- 13514,13518 ----
void desire_setup(void) {
+ manager = manager_new();
#define S(x) x##_setup();
S(vinlet) S(voutlet)
More information about the Pd-cvs
mailing list