Android Hdmi-CEC 相关文档
A.Android中的HDMI-CEC 背景介绍
B.Android 按键处理流程和HDMI-CEC按键指令的流程分析
C.HDMI-CEC 指令One Touch Play 代码举例
A.android 中HDMI-CEC背景介绍
HDMI-CEC(高清晰度多媒体接口的消费电子控制标准)允许多媒体消费类产品之间沟通和交换信息。HDMI-CEC支持多种功能,例如直通遥控,系统音频控制,其中最常用的是一键播放功能。一键播放功能是指媒体源设备能够打开电视并且让电视自动切换到自己的端口进行播放,这样的话用户就不需要远程控制电视从Chromecast切换到蓝光播放器。
很多厂商采用的HDMI-CEC标准,使他们的产品能够和其他厂商的产品相互工作。但是由于每个厂商实现HDMI-CEC标准的方式不同。很多时候这样的设备之间不能相互理解,而且这些设备还支持不同的功能。由于这种情况,消费者不能简单的认为声称支持CEC的产品之间能够兼容使用。
为了缓解以上描述的设备不能够进行很好的兼容的问题,随着android TIF的引入,HDMI-CEC 能够让相互连接的设备沟通起来,也就是说能够很好的降低设备之间的兼容性问题。Android创建了一个系统服务HdmiControlSerivce来有效缓解这个问题。
HdmiControlSerivce是和系统其他的部分(TIF,Audio服务,电源管理服务)一起来实现CEC标准。
我们从下面两幅图来理解HDMIControlSerivce是怎么缓解兼容性问题的;
图一可以看出,在android5.0之前没有HDMIControlService,对不同设备的兼容和控制都是通过Custom CEC Controller模块来完成(这个可能是厂商自己开发的,或者用第三方的方案),这样所有的兼容性处理工作都放在了Custom CEC Controller模块,里面涉及到显示操作,Audiod 的控制,power的控制,都要通过其来管理,这样使兼容性问题处理起来显得异常复杂,不同设备一多起来,就对Custom CEC Controller模块的健壮性,和扩展性等提高了要求。Android为了解决这个问题(因为google 牛B,所以他才搞),就设计了基于HDMI Control Service服务为核心的一套逻辑,请看图2。从图2中可以看出,HDMI Control Service服务下面添加了HDMI CEC HAL层,这个HAL 层,就是各个使用厂商需要着力开发的部分,里面有一套接口,需要android厂商遵守实现,这样减少了兼容问题的复杂性,只需要在HAL层实现一套接口(下层驱动实现)(接口的定义请看官方文档:https://source.android.google.cn/devices/tv/hdmi-cec),接口里面实现兼容各个HDMI Source设备的指令协议。(仍然是要兼容,但是整体处理兼容问题的工作变得更加公开和便捷,收敛到driver层来解决问题。)而HDMI Control Service服务本身在framework层,可以通过android系统已有的进程间通信机制与TIF ,Audio Service,Power Manager Service进行通信。大大提升了设备之间交互的稳定性等。
B.Android 按键处理流程和HDMI-CEC按键指令的流程分析
- 首先我们看一下android系统的按键处理流向
This diagram below shows how buttons on a remote control are passed to a specific TV Input for picture in picture (PIP) display. Those button presses are interpreted by the hardware driver supplied by the device manufacturer,converting hardware scancode to Android keycodes and passing them to the standard Android input pipeline ,InputReader and InputDispatcher functions as KeyEvents.These in turn trigger events on the TV App if it is in focus. PhoneWindowManager接受到这些events后,就dispatch to application. Application 收到相关event后,会有对应的处理逻辑,