
OpenHarmony3.1 按下音量按键后Audio service发生的哪些事 原创 精华
作者:润和软件 赵海鹏
OpenHarmony3.1 Release版本新增按键音量调节功能,如下图:
音量调节通俗的理解为按下按键,触发中断,中断处理函数中完成音量的调节。
那么在OpenHarmony Audio Service中是怎么完成的呢?
1.按键的注册,按键作为input模块,被多模输入子系统管理;
在Audio子系统中,AudioPolicy进程加载了多模子系统,并订阅的按键事件处理。根据按键的操作,触发音量调节接口,并通过PulseAudio调用HDI的接口,HDI接口通过Audio Dirver Model完成音量的调节。
下文将展开描述各个模块具体的执行流程
Key输入与多模输入
1.KEY的注册
KEY信息配置与节点配置,见vendor/hihope/rk3568/hdf_config/khdf/input/input_config.hcs,通过RegisterKeyDevice将Vol+/Vol-注册到HDF_KEY模块中,由input统一管理。
在openHarmony中KEY与多模输入的简单关系图
多模输入与AudioService如何联系
- 结合音频组件架构图,AudioPolicy主要完成Audio设备、音量等管理工作。
2.SubscribeKeyEvents接口完成Vol+/Vol-按键事件的订阅,当前Input事件触发后会执行对应的动作。
Audio Service如何进行音量设置
1.接着上述订阅事件,AudioPolicyServer通过调用AudioPolicyService类,AudioPolicyService继而调用AudioAdapterManager::SetStreamVolume
此接口中,通过完成WriteVolumeToKvStore音量值的保存(kv:Key,value),继而调用AudioServiceAdapter::mAudioServiceAdapter->SetVolume(streamType, volume);进行音量设置。
2.AudioServiceAdapter::SetVolume接口
PulseAudio作为Audio服务,SetVolume通过调用PulseAudio的接口完成音量设置。
此接口中PaGetSinkInputInfoVolumeCb作为回调函数,通过pa_context_set_sink_input_volume接口完成音量设置的具体工作。
上述类之间的关系见图,如下:
pulseaudio如何与HDI接口对接
1.module-hdi-sink/module-hdi-source(foundation/multimedia/audio_standard/frameworks/native/pulseaudio/src/modules/hdi)作为PulseAudio的module,系统启动过程被audiopolicy进程加载启动。
2.renderer_sink_adapter(foundation/multimedia/audio_standard/frameworks/native/audiorenderer/src/renderer_sink_adapter.c) 作为hdi-sink和renderer之间的适配层,完成接口封装与定义。
其中RendererSinkSetVolume接口完成音量设置,LoadSinkAdapter接口根据不同的设备类型,给出不同的接口实现。
3.RendererSinkSetVolume如何与HDI接口对接
以primary device为例,RendererSinkSetVolume对应的实现为AudioRendererSinkSetVolume,调用g_audioRendrSinkInstance->SetVolume,即AudioRendererSink::SetVolume接口.
audioRender的定义为struct AudioRender *audioRender,AudioRender即为HDI接口,其定义参考(drivers/peripheral/audio/interfaces/include/audio_render.h)。
HDI如何完成音量设置,可以参考Audio HDI的测试用例,本文将不描述(*drivers/peripheral/audio/test/systemtest/hdi/render/src/audio_hdirender_volume_test.cpp)。
附录
1.https://gitee.com/openharmony/multimedia_audio_standard/blob/master/README_zh.md
2.https://gitee.com/openharmony/drivers_peripheral/blob/master/input/README_zh.md
