在Android中使用libusb捕获音频

时间:2016-12-08 16:57:56

标签: android audio usb audio-recording libusb

我正在开发一款采用Android Kitkat版本的SBC。 (主板确实有USB主机)。但由于在Android 5.0之后推出官方usb音频本机支持,我无法直接使用带有SBC的USB音频设备。 我正在使用libusb来达到目的。我能够打开特定的端点。但是在捕获时获取所有空数据。我在libusb调用中没有任何错误。

以下是步骤的短伪代码:

libusb_init(NULL)
devId = libusb_open_device_with_vid_pid(NULL, VID, PID)
if(libusb_kernel_driver_active(devId, IFACE_NUM)->detachKernel)
libusb_claim_interface(devId, IFACE_NUM)
libusb_set_interface_alt_setting(devId, IFACE_NUM, ALT_SETTING)
Loop{libusb_alloc_transfer(numOfPackets)
libusb_fill_iso_transfer(callBack)
libusb_set_iso_packet_lengths
libusb_submit_transfer}:NumOfTransfer(10) times
Inside callback: uint8_t* data = libusb_get_iso_packet_buffer_simple()

当我尝试打印数据指向的缓冲区时,所有数据都将为NULL。当我在回调中检查我的libusb_transfer结构元素时,它将缓冲区长度设为1960,但实际长度为0。

我正在使用Logitech C310网络摄像头,它具有麦克风并充当USB音频设备。 我正在使用接口编号3和备用设置4,因为从设备描述符的下面部分可以清楚地看到

    Interface Descriptor:
------------------------------
0x09    bLength
0x04    bDescriptorType
0x03    bInterfaceNumber
0x04    bAlternateSetting
0x01    bNumEndPoints
0x01    bInterfaceClass   (Audio Device Class)
0x02    bInterfaceSubClass   (Audio Streaming Interface)
0x00    bInterfaceProtocol   
0x00    iInterface

AS Interface Descriptor:
------------------------------
0x07    bLength
0x24    bDescriptorType
0x01    bDescriptorSubtype
0x03    bTerminalLink
0x01    bDelay
0x0001  wFormatTag   (PCM)

AS Format Type 1 Descriptor:
------------------------------
0x0B    bLength
0x24    bDescriptorType
0x02    bDescriptorSubtype
0x01    bFormatType   (FORMAT_TYPE_1)
0x01    bNrChannels   (1 Channels)
0x02    bSubframeSize
0x10    bBitResolution   (16 Bits/sample)
0x01    bSamFreqType   (Discrete sampling frequencies)
0x00BB80    tSamFreq(1)   (48000 Hz)

Endpoint Descriptor (Audio/MIDI):
------------------------------
0x09    bLength
0x05    bDescriptorType
0x86    bEndpointAddress   (IN Endpoint)
0x05    bmAttributes    (Transfer: Isochronous / Synch: Asynchronous / Usage: Data)
0x00C4  wMaxPacketSize   (196 Bytes)
0x01    bInterval
0x00    bRefresh
0x00    bSynchAddress

我没有得到它出错的地方?任何人都可以在Android较低版本上分享usb音频的任何工作参考吗?

1 个答案:

答案 0 :(得分:1)

最后,我能够在Kitkat上使用USB麦克风。 对于那些在Android Kitkat版本上挣扎USB音频的人来说,下面是我所遵循的简短说明:
我从代码usbaudio-android-demo

中获取了参考资料

此代码是为特定设备编写的,即。 TI的PCM2900C使用相同的器件进行捕获和回放。要使其适用于您的USB音频设备,您需要修改VID,PID,MAX数据包大小,接口编号和正确的备用设置编号以及能够提供足够带宽的有效端点。一旦您能够捕获和回放音频,您需要调整数据包长度,缓冲区中的数据包数等,以获得清晰的音频。

但现在我有另一个问题。我的应用程序不是关于录制音频和捕获和回放USB音频,我需要使用这个原始PCM数据作为电话应用程序中MIC的来源。我现在只能想到解决方案是通过修改device/vendor/sub-vendor/hardware/audio/audio_hw.c将此数据传递给本机音频代码。这是正确的方法还是更好的解决方案?