博客
关于我
Android音频系统之USB设备通路(Android 5.1)
阅读量:373 次
发布时间:2019-03-05

本文共 2882 字,大约阅读时间需要 9 分钟。

输入/输出通路选择在Android音频系统中的关键分析

在Android音频系统中,输入/输出通路的选择是一个复杂而重要的任务。Android 5.1及以上版本引入了新的音频处理机制,尤其是通过AudioPolicyManager来管理设备连接状态和策略选择。以下将从代码和实际案例分析入手,探讨这一过程的实现方式和常见问题的解决思路。


一、引言

输入/输出通路的选择直接关系到音频设备的功能和性能。Android系统支持多种输出设备,如喇叭、外放、USB设备和蓝牙等。然而,在实际项目中,经常需要根据具体需求调整策略选择。在Android 5.1中,策略选择主要通过audiopolicy实现,audioflinger负责执行输入/输出设备的打开和关闭。由于缺乏实际项目经验,这类问题对我来说相对陌生,因此本文旨在分析代码逻辑和常见问题的处理思路。


二、代码分析

1.通过alsa指令分析声卡

在Android 5.1及以上版本中,audio hal层主要采用tinyalsa实现。了解声卡信息是分析音频系统的重要第一步。

  • 查看当前连接的声卡

    可以通过以下命令查看系统中连接的声卡信息:

    cat /proc/asound/cards

    例如,插入了一个USB耳机和一个自带声卡时,输出可能如下:

    1: USB device 1: SubDevice 0x00002: [snd_pcm_0]: [0] [0x00000000] [0x00000000] [0x00000000] [0x00000000]
  • 查看声卡状态

    为了判断声卡是否在进行录音或播放,可以查看对应的状态文件:

    cat /proc/asound/card2/pcm0p/sub0/status

    例如,插入了USB耳机并进行播放时,状态可能显示为:

    hw_ptr: 0x0000000000000000 [active]

    如果需要查看录音状态,可以将pcm0p替换为pcm0c

    cat /proc/asound/card2/pcm0c/sub0/status

2.热插拔事件响应

热插拔事件是Android系统中常见的场景之一。热插拔处理主要由上层服务完成,AudioPolicyManagersetDeviceConnectionState函数中处理。以下是关键代码片段:

status_t AudioPolicyManager::setDeviceConnectionState(audio_devices_t device,                                                   audio_policy_dev_state_t state,                                                   const char *device_address) {    // ...      if (device == AUDIO_DEVICE_IN_REMOTE_SUBMIX && device_address) {        // 处理远程混音输入        AudioParameter parameters = AudioParameter(String8(device_address));        int forceValue;        if (parameters.getInt(String8("force"), forceValue) == OK) {            ALOGD("setDeviceConnectionState() forceValue = %d", forceValue);            mForceSubmixInputSelection = forceValue != 0;        }    }    // ...      if (device != AUDIO_DEVICE_IN_REMOTE_SUBMIX) {        return setDeviceConnectionStateInt(device, state, device_address);    }    return ret;}

此外,setDeviceConnectionStateInt函数负责根据设备类型和状态进行处理。对于输出设备,函数会尝试打开对应的HAL模块,并调用audioflinger执行输出流操作。代码中使用checkOutputsForDevice函数验证输出设备的可用性:

status_t checkOutputsForDevice(audio_devices_t device, audio_policy_dev_state_t state,                              const audio_output_device_t * const outputs[],                              const audio_device_address_t * const address) {    // ...      status_t status = mpClientInterface->openOutput(...);    // ...      return status;}

3.处理输入/输出流

audioflinger是Android音频系统中的核心模块,负责执行音频数据的读写操作。checkOutputsForDevice函数通过audioflinger调用HAL层的openOutput方法,实现输出设备的打开和配置。对于输入设备,类似的流程也需要在HAL层进行处理。


三、案例分析

1.留心蓝牙设备可能是USB类型

某些蓝牙设备(如语音遥控器或dongle)采用USB接口进行通信。这些设备的识别需要通过alsa命令查看声卡类型:

cat /proc/asound/cards

如果显示为USB设备,则应统一按USB处理。

2.USB多输入选择

当同时插入多个USB设备(如耳机和摄像头)时,Android系统会优先选择第一个识别到的设备进行录音或播放。这种情况下,可以通过调整USB插拔顺序进行定向选择。但如果设备在启动时已经插入,则无法进行定向选择。

解决方法是通过扩展HAL层,添加设备选择逻辑。在audio_policy.conf文件中配置对应的模块和设备,并在HAL层实现设备切换逻辑。


四、总结

通过以上分析,我们可以看到输入/输出通路选择在Android系统中的复杂性。理解AudioPolicyManager和audioflinger的工作流程,以及熟悉HAL层实现,对解决实际问题至关重要。对于像USB多输入选择这样的场景,需要结合audio_policy.conf和HAL层逻辑进行定制化处理。

转载地址:http://bbwwz.baihongyu.com/

你可能感兴趣的文章
Nginx运维与实战(二)-Https配置
查看>>
Nginx配置ssl实现https
查看>>
Nginx配置TCP代理指南
查看>>
Nginx配置——不记录指定文件类型日志
查看>>
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
Nginx配置参数中文说明
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
NHibernate学习[1]
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>