From 90d6e62911b846544fe1a489529503ca67094d80 Mon Sep 17 00:00:00 2001 From: Axel Fagerstedt Date: Thu, 15 Nov 2012 12:37:47 +0100 Subject: Split large writes into 16k chunks. On some hosts LibusbDevice::write fails when for large buffers. This is solved by splitting the write into 16k chunks. --- CDAL/LibusbDevice.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CDAL/LibusbDevice.cpp b/CDAL/LibusbDevice.cpp index 6e2c670..9f7b3a2 100644 --- a/CDAL/LibusbDevice.cpp +++ b/CDAL/LibusbDevice.cpp @@ -20,6 +20,8 @@ using namespace std; #define MIN(A, B) ((A) < (B) ? (A) : (B)) +#define CHUNKSIZE 16384 //16 kB + LibusbDevice::LibusbDevice(libusb_device* device): device_(device) { int status = libusb_open(device_, &handle_); @@ -120,8 +122,10 @@ int LibusbDevice::write(void *buffer, size_t size) while (size) { int transfered; + int chunkSize = size > CHUNKSIZE ? CHUNKSIZE : size; + //Call with timeout to enable possible cancel - int error = libusb_bulk_transfer(handle_, outEndpoint_, src, size, &transfered, 0); + int error = libusb_bulk_transfer(handle_, outEndpoint_, src, chunkSize, &transfered, 0); if (error) { if (error == LIBUSB_ERROR_TIMEOUT) { -- cgit v1.2.3