Update of /cvsroot/pure-data/externals/io/hidio In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14076
Modified Files: hidio.c Log Message: put reading in child thread
Index: hidio.c =================================================================== RCS file: /cvsroot/pure-data/externals/io/hidio/hidio.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** hidio.c 1 Dec 2006 16:27:39 -0000 1.6 --- hidio.c 1 Dec 2006 19:40:46 -0000 1.7 *************** *** 73,77 **** static void hidio_open(t_hidio *x, t_symbol *s, int argc, t_atom *argv); //static t_int hidio_close(t_hidio *x); ! //static t_int hidio_read(t_hidio *x,int fd); //static void hidio_float(t_hidio* x, t_floatarg f);
--- 73,77 ---- static void hidio_open(t_hidio *x, t_symbol *s, int argc, t_atom *argv); //static t_int hidio_close(t_hidio *x); ! //static t_int hidio_read(t_hidio *x); //static void hidio_float(t_hidio* x, t_floatarg f);
*************** *** 349,362 **** debug_print(LOG_DEBUG,"hidio_close");
! /* just to be safe, stop it first */ ! stop_poll(x); ! ! if(! hidio_close_device(x)) ! { ! debug_print(LOG_INFO,"[hidio] closed device %d",x->x_device_number); ! x->x_device_open = 0; ! return (0); ! } ! return (1); } --- 349,356 ---- debug_print(LOG_DEBUG,"hidio_close");
! pthread_mutex_lock(&x->x_mutex); ! x->x_requestcode = REQUEST_CLOSE; ! pthread_cond_signal(&x->x_requestcondition); ! pthread_mutex_unlock(&x->x_mutex); return (1); } *************** *** 381,385 **** { if( (device_number != x->x_device_number) && (x->x_device_open) ) ! hidio_close(x); if(! x->x_device_open) { --- 375,379 ---- { if( (device_number != x->x_device_number) && (x->x_device_open) ) ! hidio_close(x); /* LATER move this also to child thread */ if(! x->x_device_open) { *************** *** 394,398 ****
! t_int hidio_read(t_hidio *x, int fd) { // debug_print(LOG_DEBUG,"hidio_read"); --- 388,392 ----
! t_int hidio_read(t_hidio *x) { // debug_print(LOG_DEBUG,"hidio_read"); *************** *** 422,432 **** } } if (x->x_started) { clock_delay(x->x_clock, x->x_delay); } ! ! // TODO: why is this 1? ! return 1; }
--- 416,438 ---- } } + + // TODO: why is this 1? + return 1; + } + + static void *hidio_tick(t_hidio *x) + { + pthread_mutex_lock(&x->x_mutex); + if (x->x_requestcode == REQUEST_NOTHING) + { + x->x_requestcode = REQUEST_READ; + pthread_cond_signal(&x->x_requestcondition); + } if (x->x_started) { clock_delay(x->x_clock, x->x_delay); } ! pthread_mutex_unlock(&x->x_mutex); ! return NULL; }
*************** *** 510,513 **** --- 516,522 ---- else if (x->x_requestcode == REQUEST_READ) { + pthread_mutex_unlock(&x->x_mutex); + hidio_read(x); + pthread_mutex_lock(&x->x_mutex); if (x->x_requestcode == REQUEST_READ) x->x_requestcode = REQUEST_NOTHING; *************** *** 536,542 **** else if (x->x_requestcode == REQUEST_CLOSE) { pthread_mutex_unlock(&x->x_mutex); ! hidio_close(x); pthread_mutex_lock(&x->x_mutex); if (x->x_requestcode == REQUEST_CLOSE) x->x_requestcode = REQUEST_NOTHING; --- 545,558 ---- else if (x->x_requestcode == REQUEST_CLOSE) { + t_int ret; pthread_mutex_unlock(&x->x_mutex); ! stop_poll(x); ! ret = hidio_close_device(x); pthread_mutex_lock(&x->x_mutex); + if (!ret) + { + debug_print(LOG_INFO,"[hidio] closed device %d",x->x_device_number); + x->x_device_open = 0; + } if (x->x_requestcode == REQUEST_CLOSE) x->x_requestcode = REQUEST_NOTHING; *************** *** 546,550 **** { pthread_mutex_unlock(&x->x_mutex); ! hidio_close(x); pthread_mutex_lock(&x->x_mutex); x->x_requestcode = REQUEST_NOTHING; --- 562,567 ---- { pthread_mutex_unlock(&x->x_mutex); ! stop_poll(x); ! hidio_close_device(x); pthread_mutex_lock(&x->x_mutex); x->x_requestcode = REQUEST_NOTHING; *************** *** 626,630 **** for(i=0; i<MAX_DEVICES; ++i) last_execute_time[i] = 0;
! x->x_clock = clock_new(x, (t_method)hidio_read);
/* create anything outlet used for HID data */ --- 643,647 ---- for(i=0; i<MAX_DEVICES; ++i) last_execute_time[i] = 0;
! x->x_clock = clock_new(x, (t_method)hidio_tick);
/* create anything outlet used for HID data */ *************** *** 643,647 **** for(i=0; i<MAX_DEVICES; ++i) last_execute_time[i] = 0;
! x->x_clock = clock_new(x, (method)hidio_read);
/* create anything outlet used for HID data */ --- 660,664 ---- for(i=0; i<MAX_DEVICES; ++i) last_execute_time[i] = 0;
! x->x_clock = clock_new(x, (method)hidio_tick);
/* create anything outlet used for HID data */ *************** *** 677,681 **** /* add inlet datatype methods */ class_addfloat(hidio_class,(t_method) hidio_float); ! class_addbang(hidio_class,(t_method) hidio_read); /* class_addanything(hidio_class,(t_method) hidio_anything); */ --- 694,698 ---- /* add inlet datatype methods */ class_addfloat(hidio_class,(t_method) hidio_float); ! class_addbang(hidio_class,(t_method) hidio_tick); /* class_addanything(hidio_class,(t_method) hidio_anything); */ *************** *** 760,764 **** class_addmethod(c, (method)hidio_int, "int", A_LONG, 0); class_addmethod(c, (method)hidio_float, "float", A_FLOAT, 0); ! class_addmethod(c, (method)hidio_read, "bang", A_GIMME, 0); /* add inlet message methods */ --- 777,781 ---- class_addmethod(c, (method)hidio_int, "int", A_LONG, 0); class_addmethod(c, (method)hidio_float, "float", A_FLOAT, 0); ! class_addmethod(c, (method)hidio_tick, "bang", A_GIMME, 0); /* add inlet message methods */