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

本文探讨了在Linux及Android环境下实现USB耳机热插拔自动切换的方法。通过配置alsa及编写脚本,使得系统能够在USB耳机插入或拔出时自动调整音频输出。文章还讨论了在Android中使用netlink进行热插拔事件监听的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

需求: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,如下:

  1. ~ # cat /proc/asound/cards  
  2.  0 [WMTSOC         ]: HWDAC - WMT_SOC  
  3.                       WMT_SOC (HWDAC)  
  4.  1 [default        ]: USB-Audio - C-Media USB Headphone Set    
  5.                       C-Media USB Headphone Set   at usb-0000:00:06.0-1, full speed  

3.2、参考了这个链接,写了如下的配置文件/etc/asond.conf:

  1. pcm.!default {  
  2.          type asym  
  3.          playback.pcm {  
  4.                  type plug  
  5.                  slave.pcm "hw:1,0"  
  6.          }  
  7.          capture.pcm {  
  8.                  type plug  
  9.                  slave.pcm "hw:1,0"  
  10.          }   
  11. }  

 重启后,声音就从Headset出来了。 

hw:1,0对应card1即USB-Audio - C-Media USB Headphone Set


4、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要知道USB Audio插上时打开USB Audio的plug,USB Audio拔下时打开local CODEC的plug。这样一想,修改的幅度还是蛮大的。而且未能确定如果在播放的过程中,切换音频设备是否有影响?如果alsa允许只是配置好asound.conf达到同样的目的,那就好办了,可惜目前找不到这方面的资料,应该没有这个便利了。


进展:

2011/9/19:按照以上难点分析,大致完成了整个Android框架层的代码和ALSA配置文件,基本实现了USB Audio热插拔时的音频设备切换。但有个很大的问题:在播放时切换音频设备会导致AudioFlinger服务crash(之前做2G通话时也遇到这个问题,用其他办法规避了)。看来在切换音频设备时,应该停止播放;等切换完成后,再恢复播放。


传闻Android3.1开始支持USB Audio设备:“Your device will support USB Host Mode, applications can now manage connected USB peripherals such as audio devices. input devices, communications devices, and more.”。但Android3.1何时才能开源?


已经有思路了,刚想起Android本身不是支持Bluetooth音频吗?Bluetooth Headset的切换应该与USB Headset本质差不多吧。应该仔细研究下蓝牙音频是如何实现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值