如何在Android平台上使用USB Audio设备

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Android平台上使用USB Audio设备相关的知识,希望对你有一定的参考价值。

android对USB的支持有两种模式:
HOST模式:Android设备为USB总线和外设供电,数据传输是双向的。
Accessory模式:即附件模式,Android作为附件,手机和电脑连接,通常是这种模式,由USB Device端向总线供电,数据传输方向是双向的。这就是为什么手机插到电脑上可以充电的原因。

在讨论具体代码之前,需要先讲一下再host模式下面的调试办法,因为数据线的端口被外设使用了,那么,传统的连接数据线调试的方法已经不行了。官网给出了解决办法:
1、请把Android设备用数据线连接到电脑,当然,也要把Android设备的wifi打开。
2、在windows命令行下,进入SDK platform-tools/ 目录(具体看SDK安装在哪个目录了),执行 adb tcpip 5555 回车。这里其实是打开了adb调试的无线端口(Android设备在电脑上的端口映射),其实后面的数字可以随便来,只要端口没有被占用。
3、adb connect <device-ip-address>:5555键入回车,这里的device-ip-address是Android端的IP地址。
4、最后adb usb回车,假如没有问题,现在已经可以在eclipse上看到logcat的输出了。

其实还有个简单的办法,可以在应用商店上下一个无线ADB工具,随便哪个都可以,这类工具就是在Android端做了上面的那些工作,而且还不用连数据线,但是第三步的那个操作还是要在windows的命令行窗口手动输入的。
参考技术A Android对USB的支持有两种模式:
HOST模式:Android设备为USB总线和外设供电,数据传输是双向的。
Accessory模式:即附件模式,Android作为附件,手机和电脑连接,通常是这种模式,由USB Device端向总线供电,数据传输方向是双向的。这就是为什么手机插到电脑上可以充电的原因。

在讨论具体代码之前,需要先讲一下再host模式下面的调试办法,因为数据线的端口被外设使用了,那么,传统的连接数据线调试的方法已经不行了。官网给出了解决办法:
1、请把Android设备用数据线连接到电脑,当然,也要把Android设备的wifi打开。
2、在windows命令行下,进入SDK platform-tools/ 目录(具体看SDK安装在哪个目录了),执行 adb tcpip 5555 回车。这里其实是打开了adb调试的无线端口(Android设备在电脑上的端口映射),其实后面的数字可以随便来,只要端口没有被占用。
3、adb connect <device-ip-address>:5555键入回车,这里的device-ip-address是Android端的IP地址。
4、最后adb usb回车,假如没有问题,现在已经可以在eclipse上看到logcat的输出了。

其实还有个简单的办法,可以在应用商店上下一个无线ADB工具,随便哪个都可以,这类工具就是在Android端做了上面的那些工作,而且还不用连数据线,但是第三步的那个操作还是要在windows的命令行窗口手动输入的。
参考技术B 需求:USB Headset插上去后,声音要从本地CODEC切换到USB Headset输出/输入。
上网搜了有关USB Audio Hotplug的东西,比较适用的资源如下:1、Hotplugging USB audio devices (Howto)
题目看起来很吻合我们的问题,事实上并没有多少参考价值。其中脚本
/etc/hotplug/usb/extigy或许可以捕捉到USB Audio设备的热插拔事件,应该可以进一步验证和利用,留意这点。
2、Example to map USB Ports to ALSA card numbers and
add each sound card to a combined, single interface device
这是利用udev来获取USB热插拔事件,虽然Android没有udev,但例子程序对热插拔事件字符串的处理值得参考。
3、USB mic on Linux
其实我们工作的第一步:验证USB Headset是否可以回放录音。
3.1、插上USB Headset,可以看到alsa的确加载了USB Audio,如下:
~ # cat /proc/asound/cards
0 [WMTSOC ]: HWDAC - WMT_SOC
WMT_SOC (HWDAC)
1 [default ]: USB-Audio - C-Media USB Headphone Set
3.2、参考了这个链接,写了如下的配置文件/etc/asond.conf:
pcm.!default type asymplayback.pcm type plugslave.pcm hw:1,0capture.pcm type plugslave.pcm hw:1,0
重启后,声音就从Headset出来了。
hw:1,0对应card1即USB-Audio - C-Media USB Headphone Set4、Linux下USB设备热插拔
到此,需要考虑在Android平台切换USB Audio的实现问题了。有几个途径:1/
hotplug/usb;2/ udev;3/ netlink。这里就是netlink的实现方式,链接里有个证实可用的例子程序,目前可能需要做热插拔事件字符串的处理。
难点:Android音频设备的切换底层入口是alsa_default.cpp,目前看来需要在asound.conf定义好local CODEC和USB Audio的plug;还需要修改
alsa_default.cpp,最主要Android要知道USBAudio插上时打开
USB Audio的plug,
USB Audio拔下时打开local CODEC的plug。这样一想,修改的幅度还是蛮大的。而且未能确定如果在播放的过程中,切换音频设备是否有影响?如果alsa允许只是配置好asound.conf达到同样的目的,那就好办了,可惜目前找不到这方面的资料,应该没有这个便利了。
进展:2011/9/19:按照以上难点分析,大致完成了整个Android框架层的代码和ALSA配置文件,基本实现了USB Audio热插拔时的音频设备切换。但有个很大的问题:在播放时切换音频设备会导致AudioFlinger服务crash(之前做2G通话时也遇到这个问题,用其他办法规避了)。看来在切换音频设备时,应该停止播放;等切换完成后,再恢复播放。

以上是关于如何在Android平台上使用USB Audio设备的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 audio_service 在 Android 上显示当前正在播放的音频?

使用 Android 手机上的 "USB 绑定"功能

使用OpenGL ES 2.0在Android上创建Audio wave

关于AI视觉-如何连接使用智能语音开发套件(USB语音开发套件)

如何检测用户何时在 android 设备上插入耳机? (与 ACTION_AUDIO_BECOMING_NOISY 相反)

如何使用 USB 声卡在 Windows 10 上启用 android 模拟器声音?