diff --git a/usb/iso.c b/usb/iso.c index 7cd4dd0..05c1106 100644 --- a/usb/iso.c +++ b/usb/iso.c @@ -64,7 +64,26 @@ void print_xfer(struct libusb_transfer *xfer) { } } +// extract data from a non-isochronous transfer. int extract_data(struct libusb_transfer *xfer, void *raw, int max, unsigned char *status) { + int i; + unsigned char *in = xfer->buffer; + unsigned char *out = raw; + + int len = xfer->actual_length; + if (len > max) { + len = max; + } + memcpy(out, in, len); + if (xfer->status != 0 && *status == 0) { + *status = xfer->status; + } + return len; +} + +// extract data from an isochronous transfer. Very similar to extract_data, but +// acquires data from xfer->iso_packet_desc array instead of xfer attributes. +int extract_iso_data(struct libusb_transfer *xfer, void *raw, int max, unsigned char *status) { int i; int copied = 0; unsigned char *in = xfer->buffer; diff --git a/usb/transfer.go b/usb/transfer.go index becfbf5..8e447d3 100644 --- a/usb/transfer.go +++ b/usb/transfer.go @@ -18,6 +18,7 @@ package usb #include int extract_data(struct libusb_transfer *xfer, void *data, int max, unsigned char *status); +int extract_iso_data(struct libusb_transfer *xfer, void *data, int max, unsigned char *status); int submit(struct libusb_transfer *xfer); */ import "C" @@ -50,7 +51,12 @@ func (t *usbTransfer) wait(b []byte) (n int, err error) { case <-t.done: } var status uint8 - n = int(C.extract_data(t.xfer, unsafe.Pointer(&b[0]), C.int(len(b)), (*C.uchar)(unsafe.Pointer(&status)))) + switch TransferType(t.xfer._type) { + case TRANSFER_TYPE_ISOCHRONOUS: + n = int(C.extract_iso_data(t.xfer, unsafe.Pointer(&b[0]), C.int(len(b)), (*C.uchar)(unsafe.Pointer(&status)))) + default: + n = int(C.extract_data(t.xfer, unsafe.Pointer(&b[0]), C.int(len(b)), (*C.uchar)(unsafe.Pointer(&status)))) + } if status != 0 { err = TransferStatus(status) }