zoukankan      html  css  js  c++  java
  • 如何在Android平台上使用USB Audio设备

    http://blog.csdn.net/kevinx_xu/article/details/12951131

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

    [plain] view plain copy
     
    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:

    [plain] view plain copy
     
    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本质差不多吧。应该仔细研究下蓝牙音频是如何实现的。Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager

  • 相关阅读:
    并发实现-Callable/Future 实现返回值控制的线程
    Sql Server查询,关闭外键约束的sql
    Kettle-动态数据链接,使JOB得以复用
    Python爬虫实践~BeautifulSoup+urllib+Flask实现静态网页的爬取
    javaAPI操作Hbase
    Linux下的网络环境配置
    DataCleaner(4.5)第二章
    DataCleaner(4.5)第一章
    SpringBoot 使用 MyBatisPlus-Generator 快速生成model实体类
    Java 使用hutool工具类代替commons-text进行Json 中文 Unicode转换
  • 原文地址:https://www.cnblogs.com/leaven/p/6074159.html
Copyright © 2011-2022 走看看