• Android Audio 架构自学笔记(二) audio HAL 基本功能


    通过对androia audio架构的整体分析,我们知道android audio framework中的audio flinger是通过操作audio hal层对间接的对底层设备进行操作的。(音频数据的读写以及各种参数的设定);

    那么audio hal到底具备哪些能力,以及向上提供了哪些功能接口自然也是我们关注重点。

    (个人认为分析软件无非就是两条路线,数据流与控制流;数据流是指软件底层具备怎样的能力,而控制流就是上层软件使用怎样的策略对底层进行控制。先了解底层具备怎样的能力,这样对于以后分析控制流会有很大的帮助,否则很容易出现知其然而不知其所以然的现象)

    参照安卓官方文档(https://source.android.google.cn/devices/audio/implement),我们知道audio hal一定要实现system/media/audio/include/system/audio.h文件中的全部接口。那么我们就可以认为这个文件中所描述的就是audio hal的必须具备的基本能力与功能。

     文件内容大概如图中表示,其中audio_hw_device 代表的是实际物理硬件的抽象;

    这个对象中主要包括了如下两类内容:

     (1)对实际物理硬件的操作,比如init_check检测硬件是否初始化完毕;set_mic_mute设置静音等;

       (2)用stream对数据流进行抽象,用stream来对实际的物理数据来进行控制。使用audio_stream_in来表示输入流;用audio_stream_out表示输出流;

             在stream中使用int (*set_device)(struct audio_stream *stream, audio_devices_t device);让stream与具体物理设备进行绑定。对此我们可以用linux中的文件描述符与文件之间的关系来进行理解。

    由此,我们就可以大致理解audio底层软件的基本设计。由于audio hal只对上层提供了这些能力,那么上层软件中的audio fligner以及audio policy无非就是使用这些能力来做自己内部的逻辑设计,来满足不同的业务场景。

    而且,对此我们也可以对上层软件设计的基本逻辑作出一些初步的判断,其基本时序为:

    (1)使用load等方法,加载hal动态库。

    (2)通过init_check来检车物理硬件初始化状态

    (3)使用get_supported_devices来获得audio hal所支持的物理硬件类型

    (4)通过open_output_stream或者open_input_stream方法创建输出、输入数据流。

    (5)通过stream_out以及stream_in中的write以及read方法对数据进行读写。

    (6)当需要操作音量等物理硬件能力时,则使用audio_hw_device 的相关方法。如果需要对数据流中的内容,则应该直接或者间接的调用到stream_out或者stream_in中的方法。

    对此,我们则对audio hal层的内容有了大致的了解。

    其中详细内容,我们以后会结合上层代码进一步分析。

  • 相关阅读:
    springboot接口测试
    谷粒学院_day08_课程管理_添加课程之课程发布(后端开发)
    谷粒学院_day03_vue组件
    谷粒学院_day03_vue固定代码抽取
    vue自定义事件
    vue插槽slot
    vue基本语法
    Vue之axios异步通信
    无归岛[HNOI2009]
    仓库建设[ZJOI2007]
  • 原文地址:https://www.cnblogs.com/ouyshy/p/13446772.html
Copyright © 2020-2023  润新知