summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Hjelm <hjelmn@cs.unm.edu>2013-04-03 04:12:47 -0600
committerPete Batard <pete@akeo.ie>2013-04-03 19:46:17 +0100
commit2ffefc04769845dcb682655a437fa604e0299683 (patch)
tree310936e95f4288a3790f7118413793cc8d3b921f
parentcf8506faf42165a37eb8d4db08c13761a90d3c03 (diff)
downloadlibusb-2ffefc04769845dcb682655a437fa604e0299683.tar.gz
OS X: Don't assume an interval of 1
-rw-r--r--libusb/os/darwin_usb.c26
-rw-r--r--libusb/version_nano.h2
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