赞
踩
OpenHarmony 操作系统为了做到给千行百业提供全场景业务能力,达到设备快速互联、硬件互助、资源共享;统一 OS、一次开发多端弹性部署的目标。在此背景下 OpenHarmony 提出在传统的单设备系统能力基础上,基于同一套系统能力、适配多种终端形态的分布式理念,并且内核层、系统服务层、框架层和应用层做了全新的设计和开发。内核层作为 OpenHarmony 最底层设计,包括支持多内核以及全新硬件驱动框架(HDF)。同时随着手机被发明应用到如今的智能语音等等,音频应用的形态和场景也是越来越丰富。在这两大背景下,音频需要支撑从轻设备到富设备应用需求,所以 OpenHarmony 下基于 HDF 驱动框架的音频驱动实现存在多种方式:
根据 OpenHarmony 系统的自下而上的层次结构划分:内核层、系统服务层、框架层和应用层。下面简要概述为实现 OpenHarmony 音频功能,各个层次做了哪些工作:
HDF 音频驱动框架的实现需要考虑符合 HDI-adapter 规范,保证生态良性演进。所以 HDF 音频驱动框架和 OpenHarmony 一样,实现过程也是遵循分层设计的。通过如下步骤完成 HDF 音频驱动框架的实现:
了解了 HDF 音频驱动的基本框架和实现技术路线后,下面遵循自下而上的分层设计 supportlibs、hdi_passthrough、hdi_binder 的实现逐一分析讲解对于设备驱动而言,这里大概描述 hi3516 和 rk3568 两个平台内核态实现的技术方式,
前面 HDF 音频驱动框架概述有描述,supportlib 为了屏蔽声卡访问控制的差异,在用户态实现一套符合 hdi-adapter 规范的访问控制,如下图所示:
开发者根据对应音频设备的驱动能力和实现方式完成对应接口。比如 HI3516 平台通过调研 IO service 完成接口集合声明的 api,RK3568 是调研 tinyalsa 完成接口结合声明的 api
根据面向对象的编程思想,hdi-passthrough 层的实现思路是将声卡(片内声卡、usb 声卡、HDMI 声卡等)抽象成 adapter,每个 adapter 都包含 supportlibs 抽象的 audioRender 和 audiocapture,最后通过 audiomanager 管理 adapters。此实现方式进一步将音频 HDI 接口规范化封装。如下图所示:
hdi-binder 是处于 HDF 音频驱动框架最上层的封装,这一层分为 server 实现和 proxy 实现。server 实现是将声卡管理、声卡录播控制以 HDF ioservice 的方式绑定到 modulename 为 audio_hdi_adapter_server 的 HDF 驱动服务。根据这个驱动服务的 hcs 描述可知它是向用户态和内核态发布服务,并满足按需加载。
struct HdffDriverEntry g_hdiServerEntry = {
.moduleVersion = 1,
.moduleName = "audio_hdi_adapter_server",
.Bind = AudioHdiServerBind,
.Init = AudioHdiServerInit,
.Release = AudioHdiServerRelease,
}
HDF_INIT(g_hdiServerEntry);
hcs 配置文件如下:
device0 :: deviceNode {
policy = 2;
priority = 100;
moduleName = "libaudio_hdi_adapter_server.z.so";
serviceName = "audio_hdi_service";
}
Note:proxy 通过 serviceName 获取的该服务。proxy 的山西爱你首先是获取 server 实现时注册的 audio_hdi_service ,然后通过 ipc 机制获取声卡管理和声卡能力接口集后遵循 hdi-adapter 的规范对声卡进行系统框架层的应用。总结 hdi-binder 的 server 和 proxy 的相互调用实现,可以参考下图所示:
前面完整分析了 OpenHarmony HDF 音频驱动框架的分层实现,以及每个层次的组件如何依赖组合关系。至此虽然大概知道 HDF 音频驱动框架的实现,但是 hdi-binder 下实现的 audio_hdi_service 何时被拉起,整个过程简单分析:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。