0、
-
高通读取外设插入方式有两种:
-
1. UEvent:
-
读取/sys/class/switch/h2w/state文件等状态
-
2. InputEvent:
-
读取/dev/input/event
-
通过属性值,判断采用何种方式。
-
frameworks\base\core\res\res\values\config.xml
-
<bool name="config_useDevInputEventForAudioJack">true</bool>
-
getevent
-
add device 1: /dev/input/event7
-
name: "msm8953-snd-card-mtp Button Jack"
-
add device 2: /dev/input/event6
-
name: "msm8953-snd-card-mtp Headset Jack"
-
add device 3: /dev/input/event2
-
name: "goodix-ts"
-
add device 4: /dev/input/event3
-
name: "hbtp_vm"
-
could not get driver version for /dev/input/mouse0, Not a typewriter
-
add device 5: /dev/input/event0
-
name: "qpnp_pon"
-
could not get driver version for /dev/input/mice, Not a typewriter
-
add device 6: /dev/input/event1
-
name: "tsu6721"
-
add device 7: /dev/input/event4
-
name: "keyremap_virtual"
-
add device 8: /dev/input/event5
-
name: "gpio-keys"
-
插入:
-
/dev/input/event6: 0005 0002 00000001
-
/dev/input/event6: 0005 0004 00000001
-
/dev/input/event6: 0005 0007 00000001
-
/dev/input/event6: 0000 0000 00000000
-
拔出:
-
/dev/input/event6: 0005 0002 00000000
-
/dev/input/event6: 0005 0004 00000000
-
/dev/input/event6: 0005 0007 00000000
-
/dev/input/event6: 0000 0000 00000000
-
getevent -l
-
/dev/input/event6: EV_SW SW_HEADPHONE_INSERT 00000001
-
/dev/input/event6: EV_SW SW_MICROPHONE_INSERT 00000001
-
/dev/input/event6: EV_SW SW_JACK_PHYSICAL_INS 00000001
-
/dev/input/event6: EV_SYN SYN_REPORT 00000000
-
/dev/input/event6: EV_SW SW_HEADPHONE_INSERT 00000000
-
/dev/input/event6: EV_SW SW_MICROPHONE_INSERT 00000000
-
/dev/input/event6: EV_SW SW_JACK_PHYSICAL_INS 00000000
-
/dev/input/event6: EV_SYN SYN_REPORT 00000000
1、获取当前设备支持的音频输出方式
adb shell dumpsys media.audio_policy
2、音频策略配置文件
frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml
3.HAL层下面使用TiniAlsa(Android下一个简约的Alsa版本)。
HAL层分为两部分,一部分为各种音频设备,每种音频设备由一个独立的库文件实现:如audio.a2dp.default.so(管理蓝牙a2dp音频),audio.usb.default.so(管理usb外接的音频),audio.primary.default.so(管理设备上的大部分音频)。另一部分为厂家自己实现的音频策略,Android下提供了默认一套音频策略,当厂家有特殊的音频策略时,可以在这部分修改实现。HAL层上面就是音频系统的核心AudioFlinger,这里实现了各种输入、输出音频流的管理,管理实时可用的音频通道,为各种音频流选择音频通道,实现多个音频流的混音等。
这里只介绍HAL中各种音频设备的管理,如何确定各种音频设备支持哪些输入、输出音频等。AudioFlinger在加载音频设备库文件时,从/system/lib/hw/下查找以audio开头的库,同时根据audio_policy.conf中定义的音频设备名(如a2dp、usb、primary)作为库的第二部分名称,对于没有特别指定的,库的第三部分名称就是default,所以加载音频设备库的名称就可以确定了,如:audio.a2dp.default.so。每个音频库的实现接口都是一样的,这样就可以让AudioFlinger使用相同的接口调用不同音频设备。
4、音频政策代码组织
平台将 AudioPolicyManager.cpp
拆分为多个模块,使其易于维护和配置。frameworks/av/services/audiopolicy
的组织包括以下模块:
模块 | 说明 |
---|---|
/managerdefault | 包含所有应用通用的常规接口和行为实现。类似于剥离了引擎功能和通用概念的 AudioPolicyManager.cpp 。 |
/common | 定义基类(例如,输入输出音频流配置文件、音频设备描述符、音频补丁程序和音频端口等的数据结构)。该模块之前在 AudioPolicyManager.cpp 中定义。 |
/engine | 实现规则,这些规则定义应将哪些设备和音量用于指定使用情形。该模块会实现标准接口(包含通用部分),例如,为指定的播放或捕获使用情形获取适当的设备,或设置可以改变导向选择的已连接设备或外部状态(即强制使用的调用状态)。 两种版本(自定义版本和默认版本)中都提供该模块;使用编译选项 |
/engineconfigurable | 依赖参数框架的政策引擎实现(请参阅下文)。配置基于参数框架,相关政策由 XML 文件定义。 |
/enginedefault | 基于以前的 Android 音频政策管理器实现的政策引擎实现。这是默认模块,包含 Nexus 和 AOSP 实现对应的硬编码规则。 |
/service | 包含 Binder 接口、线程和锁定实现(包含连接框架其余部分的接口)。 |