diff options
author | Nathan Hjelm <hjelmn@cs.unm.edu> | 2013-04-03 04:12:47 -0600 |
---|---|---|
committer | Pete Batard <pete@akeo.ie> | 2013-04-03 19:46:17 +0100 |
commit | 2ffefc04769845dcb682655a437fa604e0299683 (patch) | |
tree | 310936e95f4288a3790f7118413793cc8d3b921f | |
parent | cf8506faf42165a37eb8d4db08c13761a90d3c03 (diff) | |
download | libusb-2ffefc04769845dcb682655a437fa604e0299683.tar.gz |
OS X: Don't assume an interval of 1
-rw-r--r-- | libusb/os/darwin_usb.c | 26 | ||||
-rw-r--r-- | libusb/version_nano.h | 2 |
2 files changed, 18 insertions, 10 deletions
diff --git a/libusb/os/darwin_usb.c b/libusb/os/darwin_usb.c index 30ee3ff..e90c1cc 100644 --- a/libusb/os/darwin_usb.c +++ b/libusb/os/darwin_usb.c @@ -1385,11 +1385,12 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) { struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv; - IOReturn kresult; - uint8_t pipeRef, iface; - UInt64 frame; - AbsoluteTime atTime; - int i; + IOReturn kresult; + uint8_t direction, number, interval, pipeRef, iface, transferType; + uint16_t maxPacketSize; + UInt64 frame; + AbsoluteTime atTime; + int i; struct darwin_interface *cInterface; @@ -1429,6 +1430,14 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) { return darwin_to_libusb (kresult); } + (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number, + &transferType, &maxPacketSize, &interval); + + /* work around buggy devices */ + if (0 == interval) { + interval = 9; + } + /* schedule for a frame a little in the future */ frame += 4; @@ -1445,10 +1454,9 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) { transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback, itransfer); - if (transfer->dev_handle->dev->speed == LIBUSB_SPEED_FULL) - cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets; - else - cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets / 8; + cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets * (1 << (interval - 1)); + if (transfer->dev_handle->dev->speed >= LIBUSB_SPEED_HIGH) + cInterface->frames[transfer->endpoint] /= 8; if (kresult != kIOReturnSuccess) { usbi_err (TRANSFER_CTX (transfer), "isochronous transfer failed (dir: %s): %s", IS_XFERIN(transfer) ? "In" : "Out", diff --git a/libusb/version_nano.h b/libusb/version_nano.h index 19e505f..9aec26e 100644 --- a/libusb/version_nano.h +++ b/libusb/version_nano.h @@ -1 +1 @@ -#define LIBUSB_NANO 10636 +#define LIBUSB_NANO 10637 |