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

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

如何在Android平台上使用USB Audio设备的更多相关文章

  1. 如何在Android手机上进行自动化测试(上)

    版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 前言 通过阅读本节教程,你将了解到以下内容: 如何在脚本代码中.运行脚本时指定手机 如何填写--device Android:/// ...

  2. 如何在 Android 手机上实现抓包?

    如何在 Android 手机上实现抓包? http://www.zhihu.com/question/20467503 我想知道某个应用究竟在数据提交到哪里,提交了什么.网上的教程太复杂,不想麻烦.有 ...

  3. [原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)

    链接地址:http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8阅读578 评论0 前言:cocos2dx作为一个开源的移动2D游戏框 ...

  4. 如何在Android手机上进行自动化测试(下)

    版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 前言 通过阅读本篇教程,你将会了解到: 如何使用Poco对Android原生应用进行测试 Poco支持直接对任何Android原生应 ...

  5. 随笔之Android平台上的进程调度探讨

    http://blog.csdn.net/innost/article/details/6940136 随笔之Android平台上的进程调度探讨 一由来 最近在翻阅MediaProvider的时候,突 ...

  6. (转) Android平台上关于IM的实践总结

    前言 IM通信在互联网发展到现在已经是码农的世界里人尽皆知的技术,特别在当下移动互联网迅猛发展的时代这种技术的开发也更加火热,其中老牌的代表作就有QQ和MSN,和最近新崛起的微信,默默,易信,来往等眼 ...

  7. Android平台上最好的几款免费的代码编辑器

    使用正确的开发工具能够快速有效地完成源代码的编写和测试,使编程事半功倍.在网络信息高速发展的今天,移动设备的方便快捷已经深入人心,越来越多的程序员会选择在任何感觉舒适的地方使用移动设备查看或者编辑源代 ...

  8. Qt在Android平台上实现html转PDF的功能

    Qt for Android Qt for Android enables you to run Qt 5 applications Android devices. All Qt modules ( ...

  9. 如何查找Mac上的USB存储设备使用痕迹

    最近刚好有个案子的证物主机是MBP, OS X版本为El Capitan,案况与营业秘密外泄有关,当中要找有关USB存储设备的使用痕迹. 要提醒大家的是,不同版本的OS X,各种迹证的存放文件名称及路 ...

随机推荐

  1. sql去除重复语句

    转自芙蓉清秀的BLOG http://blog.sina.com.cn/liurongxiu1211  sql去除重复语句 (2012-06-15 15:00:01) sql 单表/多表查询去除重复记 ...

  2. 每月IT摘录201810

    技术 1.Redis.对于单机实例,我们采用原生主从(Master-Slave)模式实现高可用,常规模式下对外仅暴露 Master 节点.由于使用原生 Redis,所以单机实例支持所有 Redis 指 ...

  3. matomo 开源网站分析平台

    1.安装PHP https://www.jianshu.com/p/8d54a401ec06 yum remove php* yum -y install epel-release rpm -Uvh ...

  4. as3.0 在数组中找个找个,并且替换

    var arr:Array=[1,2,7,9,3,5,6]; var findNum:Number =5//想要找到的数字 var replaceNum:Object =3//想要替换的数字 var ...

  5. C++思考

    1.复杂类型的对象,被栈或者队列等机制进行操作时,需要重新写其拷贝构造函数等,而不能使用默认拷贝构造函数. 2.复杂数据类型的对象的打印,需要对运算符进行重载,或者调用其中定义的打印方法.

  6. websocket搭建错误

    用一下版本: gevent == 1.2.2 Eel == 0.9.7 gevent-websocket == 0.10.1 greenlet == 0.4.13 PyInstaller == 3.3 ...

  7. 18. 4Sum (通用算法 nSum)

    Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...

  8. TZOJ 2722 Matrix(树状数组区间取反单点查询)

    描述 Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row ...

  9. SQL Server 触发器 表的特定字段(一个字段)更新时,触发Update触发器

    CREATE TRIGGER [dbo].[Trg_Update_table1_column1]   on table1  after update  as  if update (column1)  ...

  10. 日志排序(gets函数与sscanf的使用)

    题目链接:https://www.nowcoder.com/practice/0f64518fea254c0187ccf0ea05019672?tpId=40&tqId=21363&t ...