[PD-cvs] externals/hcs/hid TODO, 1.21, 1.22 hid.c, 1.22, 1.23 hid.h, 1.20, 1.21 hid_darwin.c, 1.19, 1.20
Hans-Christoph Steiner
eighthave at users.sourceforge.net
Sat May 27 18:42:02 CEST 2006
Update of /cvsroot/pure-data/externals/hcs/hid
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16784
Modified Files:
TODO hid.c hid.h hid_darwin.c
Log Message:
new open-by methods seem to be working properly
Index: TODO
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/TODO,v
retrieving revision 1.21
retrieving revision 1.22
diff -C2 -d -r1.21 -r1.22
*** TODO 27 May 2006 00:57:15 -0000 1.21
--- TODO 27 May 2006 16:41:59 -0000 1.22
***************
*** 1,12 ****
! TODO: make open functions:
- device number
- vendor_id product_id
- Product String
==============================================================================
--- 1,19 ----
+ ==============================================================================
+ = output device data on open
! - Logical Min/Max i.e. [range -127 127(
! - open 1/0 i.e. [open 1(
! - vendor/product id i.e. [id 0x1234 0x4567(
! - device string [name Trackpad(
+ ==============================================================================
+ = open devices by name
+
+ i.e "Trackpad" a la Max's [hi]
+
==============================================================================
***************
*** 64,75 ****
CPU where it doesn't have to be
-
- ==============================================================================
- = device selection
-
- by # (1,2,...), generic name (mouse1, joystick2, tablet3...), or device name
- ("Trackpad", "Microsoft 5-button Mouse with IntelliEye(TM)", etc.)
-
-
==============================================================================
= Report available FF effects
--- 71,74 ----
***************
*** 79,100 ****
==============================================================================
- = device 0 gets events for all available devices
-
- - it might be useful to have device #0 open all available devices and output
- the events.
-
-
- ==============================================================================
- = figure out how to store device ID in obj struct
-
- (in SC_HID.c its locID and cookie)
-
- - it should probably just store the Pd arguments
-
- - this will have to be dealt with when the "mouse0", "joystick2" arguments are
- implemented
-
-
- ==============================================================================
= pollfn for mouse-like devices
--- 78,81 ----
***************
*** 116,131 ****
==============================================================================
- = control input messages
-
- - are [poll(, [start(, and [stop( needed? is 0/1/delay# enough?
-
-
- ==============================================================================
- = consistent console output
-
- void hid_post(const char *format, const char *);
-
-
- ==============================================================================
= event name changes
--- 97,100 ----
***************
*** 134,183 ****
==============================================================================
- = make [linuxhid] [darwinhid] and [windowshid]
-
- - so much info is lost in the translation to a common event scheme that it
- would be quite handy to have platform-specific objects. This would give
- access to the entire range of devices supported by HID Manager, Linux input
- events, etc.
-
- - these objects should follow the same conventions as [hid]
-
-
- ==============================================================================
- = figure out whole degree issue
-
- - should degree conversion also change rotation direction and 0 point? The
- degrees on a compass rotate the opposite direction of radians. The 0 point
- of a compass is due north, with radians, its right/due east.
-
- - [hid_polar] should take an argument (in degrees?) which specifies where the
- 0 is on the circle
-
-
- ==============================================================================
- = mapping object ideas
-
- [hid2midi] [midi2hid]
-
- midi value + bend <-> hid
- - use MIDI pitch and bend data for values in between MIDI notes?
-
- object for Fletcher-Munson Equal-loudness contours
-
- median average object
-
- [infinitepot] for use with a [knob] or any single axis that could be infinite.
-
- [hid_debounce]
-
- peak finder object
-
- "kalman filters"
-
- Curves!!
-
- http://www.2dcurves.com
-
- ==============================================================================
= check out using USB timestamp
--- 103,106 ----
***************
*** 209,222 ****
______________________________________________________________________________
- - BUG: on MacOS X, mouse axis data is limited by the screen dimensions
-
- - the axes data stops outputting when the mouse pointer reaches the edge of
- the screen. Hopefully the HID Manager API will allow raw mouse data
- access. It must since its used with games.
-
- - turn off/unlink mousepointer for that device?
-
-
- ______________________________________________________________________________
- BUG: getting events from the queue doesn't output a 0 value event when the
motion stops, so when the mouse stops, the sound keeps playing.
--- 132,135 ----
Index: hid_darwin.c
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid_darwin.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -d -r1.19 -r1.20
*** hid_darwin.c 27 May 2006 00:57:15 -0000 1.19
--- hid_darwin.c 27 May 2006 16:41:59 -0000 1.20
***************
*** 145,159 ****
/* temporary kludge until I feel like writing the translation table */
sprintf(linux_type, "led");
! sprintf(linux_code, "led_%ld", element->usage - 1);
break;
case kHIDPage_PID:
/* temporary kludge until I feel like writing the translation table */
sprintf(linux_type, "ff");
! sprintf(linux_code, "ff_%ld", element->usage - 1);
break;
default:
/* temporary kludge until I feel like writing the translation table */
sprintf(linux_type, "not_implemented");
! sprintf(linux_code, "notimp_%ld", element->usage - 1);
}
}
--- 145,159 ----
/* temporary kludge until I feel like writing the translation table */
sprintf(linux_type, "led");
! sprintf(linux_code, "led_%ld", element->usage);
break;
case kHIDPage_PID:
/* temporary kludge until I feel like writing the translation table */
sprintf(linux_type, "ff");
! sprintf(linux_code, "ff_%ld", element->usage);
break;
default:
/* temporary kludge until I feel like writing the translation table */
sprintf(linux_type, "not_implemented");
! sprintf(linux_code, "notimp_%ld", element->usage);
}
}
***************
*** 165,175 ****
* function converts the unique number to the Linux style axes.
*/
void hid_convert_hatswitch_values(IOHIDEventStruct event, char *linux_type, char *linux_code)
{
- /*
- * hmm, not sure how to implement this cleanly yet, so I left the code
- * inline in hid_get_events().
- */
}
/* ============================================================================== */
--- 165,176 ----
* function converts the unique number to the Linux style axes.
*/
+
+ /*
+ * hmm, not sure how to implement this cleanly yet, so I left the code
+ * inline in hid_get_events().
void hid_convert_hatswitch_values(IOHIDEventStruct event, char *linux_type, char *linux_code)
{
}
+ */
/* ============================================================================== */
***************
*** 203,209 ****
}
! t_int get_device_number_by_ids(unsigned short vendor_id, unsigned short product_id)
{
! return(1);
}
--- 204,211 ----
}
! t_int get_device_number_by_id(unsigned short vendor_id, unsigned short product_id)
{
! // TODO: implement! (check usbhid.c)
! return(-1);
}
***************
*** 221,224 ****
--- 223,229 ----
if( !HIDHaveDeviceList() ) hid_build_device_list();
+ /* TODO: check that this function doesn't return a number that is higher
+ * than the highest device of this type */
+
pCurrentHIDDevice = HIDGetFirstDevice();
while(pCurrentHIDDevice != NULL)
***************
*** 233,245 ****
i = total_devices;
device_count = HIDCountDevices();
- debug_print(LOG_DEBUG,"[hid] %d is less than %d",i,device_number);
pCurrentHIDDevice = HIDGetFirstDevice();
while( (pCurrentHIDDevice != NULL) && (i > device_number) )
{
- debug_print(LOG_DEBUG,"[hid] %d: %d == %d %d == %d",i,
- pCurrentHIDDevice->usagePage,
- usage_page,
- pCurrentHIDDevice->usage,
- usage);
device_count--;
if( (pCurrentHIDDevice->usagePage == usage_page) &&
--- 238,244 ----
***************
*** 250,266 ****
pCurrentHIDDevice->usage,
cstrDeviceName);
! debug_print(LOG_DEBUG,"[hid]: found a %s at %d: %s %s",cstrDeviceName,i,
! pCurrentHIDDevice->manufacturer,pCurrentHIDDevice->product);
}
pCurrentHIDDevice = HIDGetNextDevice(pCurrentHIDDevice);
! }
! return(device_count);
}
!
void hid_build_element_list(t_hid *x)
{
}
t_int hid_print_element_list(t_hid *x)
--- 249,272 ----
pCurrentHIDDevice->usage,
cstrDeviceName);
! debug_print(LOG_DEBUG,"[hid]: found a %s at %d: %s %s"
! ,cstrDeviceName,
! i,
! pCurrentHIDDevice->manufacturer,
! pCurrentHIDDevice->product);
}
pCurrentHIDDevice = HIDGetNextDevice(pCurrentHIDDevice);
! }
! if(device_count < total_devices)
! return(device_count);
! else
! return(-1);
}
! /*
void hid_build_element_list(t_hid *x)
{
}
+ */
t_int hid_print_element_list(t_hid *x)
***************
*** 380,383 ****
--- 386,402 ----
}
}
+ /* ==============================================================================
+ * STATUS/INFO OUTPUT
+ * ============================================================================== */
+
+ void hid_info(t_hid *x)
+ {
+ t_atom output_atoms[4];
+
+ SETSYMBOL(output_atoms,gensym("open"));
+ SETFLOAT(output_atoms + 1, x->x_device_open);
+ outlet_anything( x->x_device_name_outlet, gensym( device_name ),0,NULL );
+ }
+
void hid_output_device_name(t_hid *x, char *manufacturer, char *product)
***************
*** 698,707 ****
pCurrentHIDDevice = hid_get_device_by_number(device_number);
! if( ! HIDIsValidDevice(pCurrentHIDDevice) )
{
! error("[hid]: device %d is not a valid device\n",device_number);
return(1);
}
!
hid_output_device_name( x, pCurrentHIDDevice->manufacturer, pCurrentHIDDevice->product );
--- 717,730 ----
pCurrentHIDDevice = hid_get_device_by_number(device_number);
! if( HIDIsValidDevice(pCurrentHIDDevice) )
{
! x->x_device_number = device_number;
! }
! else
! {
! debug_error(x,"[hid]: device %d is not a valid device\n",device_number);
return(1);
}
!
hid_output_device_name( x, pCurrentHIDDevice->manufacturer, pCurrentHIDDevice->product );
***************
*** 709,718 ****
device_number, pCurrentHIDDevice->manufacturer, pCurrentHIDDevice->product);
! hid_build_element_list(x);
hidDevice = AllocateHIDObjectFromRecDevice( pCurrentHIDDevice );
if( FFIsForceFeedback(hidDevice) == FF_OK )
{
! post("\tdevice has Force Feedback support");
if( FFCreateDevice(hidDevice,&ffDeviceReference) == FF_OK )
{
--- 732,741 ----
device_number, pCurrentHIDDevice->manufacturer, pCurrentHIDDevice->product);
! //hid_build_element_list(x);
hidDevice = AllocateHIDObjectFromRecDevice( pCurrentHIDDevice );
if( FFIsForceFeedback(hidDevice) == FF_OK )
{
! debug_print(LOG_WARNING,"\tdevice has Force Feedback support");
if( FFCreateDevice(hidDevice,&ffDeviceReference) == FF_OK )
{
Index: hid.h
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** hid.h 27 May 2006 00:57:15 -0000 1.20
--- hid.h 27 May 2006 16:41:59 -0000 1.21
***************
*** 25,30 ****
t_object x_obj;
t_int x_fd;
! // unsigned short x_device_number;
! t_float x_device_number;
unsigned short vendor_id; // USB idVendor for current device
unsigned short product_id; // USB idProduct for current device
--- 25,29 ----
t_object x_obj;
t_int x_fd;
! t_int x_device_number;
unsigned short vendor_id; // USB idVendor for current device
unsigned short product_id; // USB idProduct for current device
***************
*** 75,81 ****
void hid_build_device_list(void);
t_int hid_get_events(t_hid *x);
! void hid_print(t_hid* x);
void hid_platform_specific_free(t_hid *x);
! t_int get_device_number_by_ids(unsigned short vendor_id, unsigned short product_id);
t_int get_device_number_from_usage_list(t_int device_number,
unsigned short usage_page, unsigned short usage);
--- 74,81 ----
void hid_build_device_list(void);
t_int hid_get_events(t_hid *x);
! void hid_info(t_hid* x); /* output device info on the status outlet */
! void hid_print(t_hid* x); /* print info to the console */
void hid_platform_specific_free(t_hid *x);
! t_int get_device_number_by_id(unsigned short vendor_id, unsigned short product_id);
t_int get_device_number_from_usage_list(t_int device_number,
unsigned short usage_page, unsigned short usage);
Index: hid.c
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -C2 -d -r1.22 -r1.23
*** hid.c 27 May 2006 00:57:15 -0000 1.22
--- hid.c 27 May 2006 16:41:59 -0000 1.23
***************
*** 47,55 ****
*/
! static void hid_poll(t_hid *x, t_float f);
! static t_int hid_open(t_hid *x, t_symbol *s, t_int argc, t_atom *argv);
! static t_int hid_close(t_hid *x);
! static t_int hid_read(t_hid *x,int fd);
! static void hid_float(t_hid* x, t_floatarg f);
--- 47,55 ----
*/
! //static void hid_poll(t_hid *x, t_float f);
! static void hid_open(t_hid *x, t_symbol *s, int argc, t_atom *argv);
! //static t_int hid_close(t_hid *x);
! //static t_int hid_read(t_hid *x,int fd);
! //static void hid_float(t_hid* x, t_floatarg f);
***************
*** 98,101 ****
--- 98,162 ----
}
+
+ static t_int get_device_number_from_arguments(int argc, t_atom *argv)
+ {
+ t_int device_number = -1;
+ unsigned short usage_number;
+ unsigned int usage;
+ unsigned short vendor_id;
+ unsigned short product_id;
+ char usage_string[MAXPDSTRING] = "";
+ t_symbol *first_argument;
+ t_symbol *second_argument;
+
+ if(argc == 1)
+ {
+ post("one arg");
+ first_argument = atom_getsymbolarg(0,argc,argv);
+ if(first_argument == &s_)
+ { // single float arg means device
+ device_number = (unsigned short) atom_getfloatarg(0,argc,argv);
+ if(device_number < 0) device_number = -1;
+ debug_print(LOG_DEBUG,"[hid] setting device# to %d",device_number);
+ }
+ else
+ { // single symbol arg means first instance of usage
+ debug_print(LOG_DEBUG,"[hid] setting device via usagepage/usage");
+ atom_string(argv, usage_string, MAXPDSTRING-1);
+ usage = name_to_usage(usage_string);
+ device_number = get_device_number_from_usage_list(0,
+ usage >> 16,
+ usage & 0xffff);
+ debug_print(LOG_INFO,"[hid] using 0x%04x 0x%04x for %s",
+ usage, usage >> 16, usage & 0xffff, usage_string);
+ }
+ }
+ else if(argc == 2)
+ {
+ post("two arg");
+ first_argument = atom_getsymbolarg(0,argc,argv);
+ second_argument = atom_getsymbolarg(1,argc,argv);
+ if( second_argument == &s_ )
+ { /* a symbol then a float means match on usage */
+ atom_string(argv, usage_string, MAXPDSTRING-1);
+ usage = name_to_usage(usage_string);
+ usage_number = atom_getfloatarg(1,argc,argv);
+ debug_print(LOG_DEBUG,"[hid] looking for %s at #%d",usage_string,usage_number);
+ device_number = get_device_number_from_usage_list(usage_number,
+ usage >> 16,
+ usage & 0xffff);
+ }
+ else
+ { /* two symbols means idVendor and idProduct in hex */
+ post("idVendor and idProduct");
+ vendor_id = (unsigned short) strtol(first_argument->s_name, NULL, 16);
+ product_id = (unsigned short) strtol(second_argument->s_name, NULL, 16);
+ device_number = get_device_number_by_id(vendor_id,product_id);
+ }
+ }
+ return(device_number);
+ }
+
+
void hid_output_event(t_hid *x, char *type, char *code, t_float value)
{
***************
*** 110,114 ****
/* stop polling the device */
! void stop_poll(t_hid* x)
{
debug_print(LOG_DEBUG,"stop_poll");
--- 171,175 ----
/* stop polling the device */
! static void stop_poll(t_hid* x)
{
debug_print(LOG_DEBUG,"stop_poll");
***************
*** 122,126 ****
}
! void hid_set_from_float(t_hid *x, t_floatarg f)
{
/* values greater than 1 set the polling delay time */
--- 183,211 ----
}
! /*------------------------------------------------------------------------------
! * METHODS FOR [hid]'s MESSAGES
! */
!
!
! void hid_poll(t_hid* x, t_float f)
! {
! debug_print(LOG_DEBUG,"hid_poll");
!
! /* if the user sets the delay less than one, ignore */
! if( f > 0 )
! x->x_delay = (t_int)f;
!
! if( (!x->x_device_open) && (x->x_device_number > -1) )
! hid_open(x,gensym("open"),0,NULL);
!
! if(!x->x_started)
! {
! clock_delay(x->x_clock, x->x_delay);
! debug_print(LOG_DEBUG,"[hid] polling started");
! x->x_started = 1;
! }
! }
!
! static void hid_set_from_float(t_hid *x, t_floatarg f)
{
/* values greater than 1 set the polling delay time */
***************
*** 142,150 ****
}
- /*------------------------------------------------------------------------------
- * METHODS FOR [hid]'s MESSAGES
- */
-
-
/* close the device */
t_int hid_close(t_hid *x)
--- 227,230 ----
***************
*** 174,257 ****
* open / different device close open
*/
!
! t_int hid_open(t_hid *x, t_symbol *s, t_int argc, t_atom *argv)
{
! debug_print(LOG_DEBUG,"hid_open");
! unsigned short i;
! unsigned short device_number = 0;
! unsigned short usage_number;
! unsigned int usage;
! char usage_string[MAXPDSTRING] = "";
!
! if(argc == 1)
! {
! if(atom_getsymbolarg(0,argc,argv) == &s_)
! { // single float arg means device
! debug_print(LOG_DEBUG,"[hid] setting device# to %d",device_number);
! device_number = (unsigned short) atom_getfloatarg(0,argc,argv);
! }
! else
! { // single symbol arg means usagepage/usage
! debug_print(LOG_DEBUG,"[hid] setting device via usagepage/usage");
! atom_string(argv, usage_string, MAXPDSTRING-1);
! i = strlen(usage_string);
! do {
! --i;
! } while(isdigit(usage_string[i]));
! usage_number = strtol(usage_string + i + 1,NULL,10);
! usage_string[i+1] = '\0';
! debug_print(LOG_DEBUG,"[hid] looking for %s #%d",usage_string,usage_number);
! usage = name_to_usage(usage_string);
! debug_print(LOG_DEBUG,"[hid] usage 0x%08x 0x%04x 0x%04x",usage, usage >> 16, usage & 0xffff);
! device_number = get_device_number_from_usage_list(usage_number,
! usage >> 16, usage & 0xffff);
! }
! }
! else if( (argc == 2) && (atom_getsymbolarg(0,argc,argv) != NULL)
! && (atom_getsymbolarg(1,argc,argv) != NULL) )
! { /* two symbols means idVendor and idProduct in hex */
! }
!
/* store running state to be restored after the device has been opened */
t_int started = x->x_started;
!
! /* only close the device if its different than the current and open */
! if( (device_number != x->x_device_number) && (x->x_device_open) )
! hid_close(x);
!
! if(device_number > 0)
! x->x_device_number = device_number;
! else
! x->x_device_number = 0;
!
! /* if device is open still, that means the same device is trying to be opened,
! * therefore ignore the redundant open request. To reopen the same device,
! * send a [close( msg, then an [open( msg. */
! if(! x->x_device_open)
{
! if(hid_open_device(x,x->x_device_number))
! {
! error("[hid] can not open device %d",x->x_device_number);
! return (1);
! }
! else
{
! x->x_device_open = 1;
}
}
-
-
/* restore the polling state so that when I [tgl] is used to start/stop [hid],
* the [tgl]'s state will continue to accurately reflect [hid]'s state */
if(started)
hid_set_from_float(x,x->x_delay);
-
debug_print(LOG_DEBUG,"[hid] done device# to %d",device_number);
-
- return (0);
}
! t_int hid_read(t_hid *x,int fd)
{
// debug_print(LOG_DEBUG,"hid_read");
--- 254,285 ----
* open / different device close open
*/
! static void hid_open(t_hid *x, t_symbol *s, int argc, t_atom *argv)
{
! debug_print(LOG_DEBUG,"hid_%s",s->s_name);
/* store running state to be restored after the device has been opened */
t_int started = x->x_started;
!
! int device_number = get_device_number_from_arguments(argc, argv);
! if(device_number > -1)
{
! if( (device_number != x->x_device_number) && (x->x_device_open) )
! hid_close(x);
! if(! x->x_device_open)
{
! if(hid_open_device(x,device_number))
! error("[hid] can not open device %d",device_number);
! else
! x->x_device_open = 1;
}
}
/* restore the polling state so that when I [tgl] is used to start/stop [hid],
* the [tgl]'s state will continue to accurately reflect [hid]'s state */
if(started)
hid_set_from_float(x,x->x_delay);
debug_print(LOG_DEBUG,"[hid] done device# to %d",device_number);
}
! t_int hid_read(t_hid *x, int fd)
{
// debug_print(LOG_DEBUG,"hid_read");
***************
*** 268,295 ****
}
! void hid_poll(t_hid* x, t_float f)
! {
! debug_print(LOG_DEBUG,"hid_poll");
!
! /* if the user sets the delay less than one, ignore */
! if( f > 0 )
! x->x_delay = (t_int)f;
!
! if(!x->x_device_open)
! hid_open(x,gensym("open"),0,NULL);
!
! if(!x->x_started)
! {
! clock_delay(x->x_clock, x->x_delay);
! debug_print(LOG_DEBUG,"[hid] polling started");
! x->x_started = 1;
! }
! }
!
static void hid_anything(t_hid *x, t_symbol *s, t_int argc, t_atom *argv)
{
int i;
t_symbol *my_symbol;
! char device_name[MAXPDSTRING];
startpost("ANYTHING! selector: %s data:");
--- 296,305 ----
}
! /* eventually, this will be used to open devices by long name
static void hid_anything(t_hid *x, t_symbol *s, t_int argc, t_atom *argv)
{
int i;
t_symbol *my_symbol;
! //char device_name[MAXPDSTRING];
startpost("ANYTHING! selector: %s data:");
***************
*** 303,307 ****
}
}
!
static void hid_float(t_hid* x, t_floatarg f)
--- 313,317 ----
}
}
! */
static void hid_float(t_hid* x, t_floatarg f)
***************
*** 333,341 ****
/* create a new instance of this class */
! static void *hid_new(t_float f)
{
! t_hid *x = (t_hid *)pd_new(hid_class);
! debug_print(LOG_DEBUG,"hid_new");
/* only display the version when the first instance is loaded */
--- 343,351 ----
/* create a new instance of this class */
! static void *hid_new(t_symbol *s, int argc, t_atom *argv)
{
! t_hid *x = (t_hid *)pd_new(hid_class);
! debug_print(LOG_DEBUG,"hid_%s",s->s_name);
/* only display the version when the first instance is loaded */
***************
*** 366,375 ****
x->x_device_name_outlet = outlet_new(&x->x_obj, 0);
! x->x_device_number = 0;
!
! if(f > 0)
! x->x_device_number = f;
! else
! x->x_device_number = 0;
hid_instance_count++;
--- 376,380 ----
x->x_device_name_outlet = outlet_new(&x->x_obj, 0);
! x->x_device_number = get_device_number_from_arguments(argc, argv);
hid_instance_count++;
***************
*** 386,395 ****
sizeof(t_hid),
CLASS_DEFAULT,
! A_DEFFLOAT,0);
/* add inlet datatype methods */
class_addfloat(hid_class,(t_method) hid_float);
class_addbang(hid_class,(t_method) hid_read);
! class_addanything(hid_class,(t_method) hid_anything);
/* add inlet message methods */
--- 391,400 ----
sizeof(t_hid),
CLASS_DEFAULT,
! A_GIMME,0);
/* add inlet datatype methods */
class_addfloat(hid_class,(t_method) hid_float);
class_addbang(hid_class,(t_method) hid_read);
! /* class_addanything(hid_class,(t_method) hid_anything); */
/* add inlet message methods */
***************
*** 397,400 ****
--- 402,406 ----
class_addmethod(hid_class,(t_method) hid_build_device_list,gensym("refresh"),0);
class_addmethod(hid_class,(t_method) hid_print,gensym("print"),0);
+ class_addmethod(hid_class,(t_method) hid_info,gensym("info"),0);
class_addmethod(hid_class,(t_method) hid_open,gensym("open"),A_GIMME,0);
class_addmethod(hid_class,(t_method) hid_close,gensym("close"),0);
More information about the Pd-cvs
mailing list