目录
回顾
在前面的小节中,我们编写了一个驱动程序,模拟耳机的插拔事件,其可以上报耳机的拔插事件,并且修改了android的源代码,可以根据耳机的拔插事件,在状态栏上现实或者消除耳麦的图标,这节视频我们讲解耳麦插拔事件导致的程序调用流程。
前面提到过,有两种上报插拔事件的方式,一种是使用输入子系统,另外一种是使用swith dev(实质是使用uevent,通过网络上报事件),那么我们的anroid系统最终是使用哪种方式呢?我们可以去配置android系统,可以去配置frameworks/base/core/res/res/values/config.xml
文件,或者:
device/rockchip/common/overlay/frameworks/base/core/res/res/values/config.xml
第二个文件会覆盖第一个文件,修改文件中的config_useDevInputEventForAudioJack变量,该值为true时使用input子系统, 为false时使用uevent机制。
下面是详细的调用流程:
input系统方法
我们先来讲解使用input子系统上报流程,后面再讲解uevent的调用流程:
1.input驱动上报
2.input系统上报给Audio系统。
3.Audio系统把事件发送给Activity(感兴趣的应用程序)
4.最终发送给某个APP(前面的小节为状态栏APP)
其上input系统是获取事件,然后上报事件,在输入子系统章节我们讲解过,有一个InputReader线程,存在成员EventHub,其会监测多个节点(使用poll机制),InputReader获得事件之后,发送给InputDispatcher线程,InputDispatcher程处理之后上报给InputManagerService,InputManagerService调用WiredAccessoryManager中CallBack(回调函数)函数,WiredAccessoryManager上报Andio系统了。
首先我们要确定CallBack函数,这样在输入子系统过得事件之后,才能进入音频子系统,根据时序图我们打开SystemServer.java文件:
private void startOtherServices() {
// Listen for wired headset changes
inputManager.setWiredAccessoryCallbacks(new WiredAccessoryManager(context, inputManager));
/*回调函数,当输入系统获得数据之后,调用callbacks函数*/
mWiredAccessoryCallbacks = callbacks;
可以看到其中创建了一个WiredAccessoryManager对象,传递给inputManager.setWiredAccessoryCallbacks函数(设置回调函数)。
现在我们打开InputReader.cpp:
void InputReader::loopOnce() {
/*获得事件,