Android音频输出切换

来源:互联网 发布:php培训课程安排 编辑:程序博客网 时间:2024/05/21 10:11

        扬声器输出和耳机输出是音频系统最基本的音频输出通路,实际应用中用户可根据自己需要随意切换,具体表现是通过插入耳机选择耳机输出,拔出耳机选择默认的扬声器输出。


图5-13 耳机插拔检测

        如图5-13所示,扬声器与耳机输出切换的实现思路是内核底层驱动实现耳机插拔检测,然后通过uevent通信机制通知Java框架层,Java框架层通过Intent机制发送广播消息通知音频系统改变输出通道。下面介绍下具体实现方法[19]


        首先调用class_create函数创建一个switch类,然后调用device_create函数创建一个switch类从属设备h2w,再通过调用device_create_file函数创建h2w设备的名称和状态两个属性文件,于是在文件系统中便有了供用户空间访问的两个节点“/sys/class/switch/h2w/name”和“/sys/class/switch/h2w/state”。一个专用中断脚用于耳机插拔检测,当耳机插入或拔出时触发中断,更新h2w状态的变化并调用kobject_uevent_env函数发送一组字符串给Java框架层。Java框架层中启动UEventThread线程用于轮询并接收内核发上来的uevent数据。WiredAccessoryObserver继承了UEventObserver,在系统启动完成时便调用startObserving()启动监听h2w的状态变化,当内核发送上来的字符串匹配成功后执行onUEvent()进行处理,onUEvent()最终会利用Intent机制发送广播消息ACTION_HEADSET_PLUG。AudioService创建AudioServiceBroadcastReceiver实例并通过IntentFilter注册监听ACTION_HEADSET_PLUG,当接收到ACTION_HEADSET_PLUG后调用AudioSystem.setDeviceConnectionState()设置音频设备连接状态,AudioSystem.setDeviceConnectionState()最终将调用到Audio硬件抽象层的AudioPolicyManager,通过音频策略模块改变音频输出通道,从而实现扬声器与耳机输出切换。