2013-06-06 57 views
2

我使用libusb-1.0.9和NDK(Android 4.0.4+)編寫Android應用程序,必須從USB-audiocard中讀取音頻數據。來自libusb的USB設備可以成功打開,並且可以接收所有接口/ EndPoint列表。但要做出ISOC傳遞時,我面臨着以下不清楚我的錯誤:作出移交Android和libusb提交ISOC傳輸錯誤

調試C代碼:

static uint8_t buf[12]; 

static void cb_xfr(struct libusb_transfer *xfr) 
{ 
    LOGD("USB callback\n"); 
    libusb_free_transfer(xfr); 
} 

JNIEXPORT jlong JNICALL 
Java_com_usbtest_libusb_Libusb_makeISOCTransfer(JNIEnv *env, jobject this, jlong ms) 
{ 
     static struct libusb_transfer *xfr; 
     int num_iso_pack = 1; 
     unsigned char ep = 0x84; 

     xfr = libusb_alloc_transfer(num_iso_pack); 
     if (!xfr) { 
       LOGD("libusb_alloc_transfer: errno=%d\n", errno); 
       return -1000; 
     } 

     LOGD("libusb_fill_iso_transfer: ep=%x, buf=%d, num iso=%d\n", ep, sizeof(buf), num_iso_pack); 
     libusb_fill_iso_transfer(xfr, handle, ep, buf, sizeof(buf), num_iso_pack, cb_xfr, NULL, 0); 
     libusb_set_iso_packet_lengths(xfr, sizeof(buf)/num_iso_pack); 
     int res = libusb_submit_transfer(xfr); 
     LOGD("libusb_submit_transfer: %d, errno=%d\n", res, errno); 
     struct timeval tv; 
     tv.tv_sec = 1; 
     tv.tv_usec = 0; 
     libusb_handle_events_timeout(NULL, &tv); 
     return res; 
} 

libusb_submit_transfer的電話後,我收到了一個錯誤:libusb_submit_transfer:-1,-2錯誤號 和短信:

need 1 32k URBs for transfer 
first URB failed, easy peasy 

EndPoint 0x84對於音頻輸入是正確的。 buf []大小= 12 - 對應於此EndPoint的字段wMaxPacketSize。我要求1次轉賬。 xfr-> status = 0的字段,但不會導致回調。 我認爲有必要增加buf緩衝區到32K - 我增加了,但它沒有幫助。 我試圖增加轉移的數量。同樣的錯誤。 提示我請在什麼可以有一個錯誤?

回答

1

我發現了這個問題的解決方案。 在這個主題http://en.it-usenet.org/thread/14995/14985/有一個類似的問題,並且該決定似乎使設備HID USB接口分離。

I've used libusb_detach_kernel to detach the 2 hid drivers and submit transfer returned 0!!

我製成libusb_detach_kernel_driver(手柄,接口)用於設備開口之後的器件(0..3)的所有接口,並作爲傳輸的libusb_submit_transfer返回SUCCESS 的結果。