Android/linux从usb声卡获取音频(使用libusb库)----环境,lsusb命令的介绍(一)

Android/linux从usb声卡获取音频(使用libusb库)---环境,lsusb命令的介绍(一)
       Android/linux从usb声卡获取音频(使用libusb库)---设备环境的确认(二)
      Android/linux从usb声卡获取音频(使用libusb库)---libusb库获取“纯麦”音频数据(三)
      Android/linux从usb声卡获取音频(使用libusb库)---libusb库获取“纯麦”音频数据,附(四)
      Android/linux从usb声卡获取音频(使用libusb库)---监听“纯麦”(五)
     环境:ubuntu 18.04  + 小米炉石纯麦无线K歌 麦克风 。 libusb库,android设备。(在android上同样适用,libsub库都已经提供好了android的编译,代码通用,后续github给上工程)

写这一篇,主要介绍下个人使用libusb库读取外接的usb-mic音频数据的过程心得,第一篇,先说明一下使用环境和基本的原理。个人当前调试的设备,是一款无线K歌麦克风,小米出品的“纯麦”,炉石纯麦。其无线接收终端,是插在电视上的一个USB接收设备。这个就是我们调试的对象。无线话筒会将声音信号发送到usb接收设备,usb接收设备将采样好的pcm数据通过usb协议传输给主机。(具体信号的采样过程是在话筒端还是在usb接收终端?我觉得是在话筒端采样然后将数字信号负载到模拟信号发射出去,可以避免直接发送模拟信号导致的变形衰减比如噪音,就像我们以前用“天线”接收器收看电视节目,信号不好满屏雪花点,和卫星接收器收看电视节目,信号不好只会卡壳花屏。一个道理。具体就不深入论述了,以上属于个人猜测,属于通信系同学考虑的问题,与本文主题无关。)
       所以,从usb口通过usb协议,可以读到我们mic传输过来的数据。有些商家宣传的免驱动,并不是真的不需要驱动,只是linux内核已经集成了这类标准驱动,所以标准的设备是可以直接插用的。个人之前测试的一个usb摄像头
       只要我们的设备符合这个标准,ok.直接使用。怎么确认我们的设备被系统真确识别并支持?这些usb热插拔设备会被自动挂载到usb总线上,用命令:#lsusb 就可以列举出挂载的usb设备。lsusb这个程序默认的android上也提供,但是看样子是个精简版。在ubuntu上可以man手册查看使用方法。
先接上设备到虚拟机:


lsusb命令查看:

root@can-virtual-machine:/work/test/libusb/libusb-1.0.22/examples# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 015: ID 0c76:1915 JMTek, LLC. 
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

root@can-virtual-machine:/work/test/libusb/libusb-1.0.22/examples# lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 2: Dev 3, If 0, Class=Hub, Driver=hub/7p, 12M
        |__ Port 1: Dev 15, If 2, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 1: Dev 15, If 0, Class=Audio, Driver=snd-usb-audio, 12M
        |__ Port 1: Dev 15, If 1, Class=Audio, Driver=snd-usb-audio, 12M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
root@can-virtual-machine:/work/test/libusb/libusb-1.0.22/examples# 


man lsusb帮助手册:以下结合man手册解释lsusb命令的使用(android上的lsusb可能是个简单版,部分选项不支持)

#这个是lsusb的显示。
root@can-virtual-machine:/work/test/libusb/libusb-1.0.22/examples# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 015: ID 0c76:1915 JMTek, LLC. 
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

man手册:
lsusb(8)                                                       Linux USB Utilities                                                      

NAME
       lsusb - list USB devices

SYNOPSIS
       lsusb [ options ]

DESCRIPTION # lsusb是一个实用程序,用于显示有关系统中的USB总线及其连接的设备的信息
       lsusb is a utility for displaying information about USB buses in the system and the devices connected to them.

OPTIONS
       -v, --verbose
              Tells  lsusb  to be verbose and display detailed information about the devices shown.  This includes configuration descriptors for
              the device's current speed.  Class descriptors will be shown, when available, for USB device classes including  hub,  audio,  HID,
              communications, and chipcard.

       -s [[bus]:][devnum] #这个选项可以单独显示指定的usb设备的信息,bus是挂载的总线号,devnunm是设备挂载时的序号,比如 lsusb -s 002:015
              Show only devices in specified bus and/or devnum.  Both ID's are given in decimal and may be omitted.

       -d [vendor]:[product] #这个选项和上面-s一样,但是通过 VID和PID来指定设备,比如lsusb -d 0c76:1915
              Show only devices with the specified vendor and product ID.  Both ID's are given in hexadecimal.

       -D device #这个选项比较有用,他是通过设备节点来指定设备,然后单独列出这个设备的详细信息,这些详细的usb信息是我们后续开发需要用到的,列出的具体信息怎么查看,参考:https://www.cnblogs.com/Daniel-G/p/3993904.html 
设备节点,usb设备挂载在usb总线上,usb总线上的设备的设备节点,在/dev/bus/usb/**/** 比如 lsusb -D /dev/bus/usb/002/015
              Do  not scan the /dev/bus/usb directory, instead display only information about the device whose device file is given.  The device
              file should be something like /dev/bus/usb/001/001.  This option displays detailed information like the v option; you must be root
              to do this.

       -t     Tells lsusb to dump the physical USB device hierarchy as a tree. This overrides the v option.
       -V, --version #这个选项,会详细列出所有的 设备的 详细详细,标准usb设备信息输出。
              Print  version information on standard output, then exit successfully.

RETURN VALUE
       If the specified device is not found, a non-zero exit code is returned.

FILES 
       /var/lib/usbutils/usb.ids #这个文件可以看到usb组织已经知道的厂家ID和部分设备。公开的
              A list of all known USB ID's (vendors, products, classes, subclasses and protocols).

usb设备挂载在  /dev/bus/usb/**/**
usb是一个组织,官网:https://www.usb.org/ 厂家要生产一个符合usb标准的usb设备,可以申请一个VID vendor ID . 该网站可以查询已经”标识”的usb ID http://www.voidcn.com/article/p-tdrrcoup-ho.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章