From: Thomas Röfer Date: Fri, 19 Nov 2010 21:03:11 +0000 (+0100) Subject: Darwin: Schedule isochronous transfers further in the future X-Git-Tag: upstream/1.0.21~850 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dcd002974e511879320233fd5b0600e06bdc5620;p=platform%2Fupstream%2Flibusb.git Darwin: Schedule isochronous transfers further in the future This is required to make OpenKinect transfer data at 30 fps. This change was originally made by Theo Watson, and Thomas improved on it. The commit came via OpenKinect into libusb thanks to Kyle Machulis and Hector Martin. Fixes #66. --- diff --git a/libusb/os/darwin_usb.c b/libusb/os/darwin_usb.c index 9121dd1..169fa1a 100644 --- a/libusb/os/darwin_usb.c +++ b/libusb/os/darwin_usb.c @@ -1219,7 +1219,10 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) { } /* schedule for a frame a little in the future */ - frame += 2; + frame += 4; + + if (cInterface->frames[transfer->endpoint] && frame < cInterface->frames[transfer->endpoint]) + frame = cInterface->frames[transfer->endpoint]; /* submit the request */ if (is_read) @@ -1231,6 +1234,8 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) { transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback, itransfer); + cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets / 8; + if (kresult != kIOReturnSuccess) { usbi_err (TRANSFER_CTX (transfer), "isochronous transfer failed (dir: %s): %s", is_read ? "In" : "Out", darwin_error_str(kresult)); diff --git a/libusb/os/darwin_usb.h b/libusb/os/darwin_usb.h index dc14ed6..9ffd6df 100644 --- a/libusb/os/darwin_usb.h +++ b/libusb/os/darwin_usb.h @@ -139,6 +139,7 @@ struct darwin_device_handle_priv { usb_interface_t **interface; uint8_t num_endpoints; CFRunLoopSourceRef cfSource; + uint64_t frames[256]; uint8_t endpoint_addrs[USB_MAXENDPOINTS]; } interfaces[USB_MAXINTERFACES]; };