Android 音频系统

一.Android音频框架

Application 层:

音乐播放器软件等。

Framework 层:

Android也提供了另两个相似功能的类,即AudioTrack和AudioRecorder。
MediaPlayerService内部的实现就是通过它们来完成的,
只不过MediaPlayer/MediaRecorder提供了更强大的控制功能,相比前者也更易于使用。

除此以外,Android系统还为我们控制音频系统提供了AudioManager、AudioService及AudioSystem类
这些都是framework为便利上层应用开发所设计的。

Libraries 层:

framework 只是向应用程序提供访问 Android 库的桥梁,具体功能放在 库 中完成。
比如上面的 Audio Track、Audio Recorder 、MediaPlayer 和 MediaRecorder 等库中都能找到相对应的类。

1、frameworks/av/media/libmedia【libmedia.so】
2、frameworks/av/services/audioflinger【libaudioflinger.so】
3、frameworks/av/media/libmediaplayerservice【libmediaplayerservice.so】

HAL 层:

从设计上来看,硬件抽象层是AudioFlinger直接访问的对象。
这说明了两个问题,一方面AudioFlinger并不直接调用底层的驱动程序;
另一方面,AudioFlinger上层模块只需要与它进行交互就可以实现音频相关的功能了。

因而我们可以认为AudioFlinger是Android音频系统中真正的“隔离板”,无论下面如何变化,上层的实现都可以保持兼容。

音频方面的硬件抽象层主要分为两部分,即AudioFlinger和AudioPolicyService。实际上后者并不是一个真实的设备,只是采用虚拟设备的方式来让厂商可以方便地定制出自己的策略。

抽象层的任务是将AudioFlinger/AudioPolicyService真正地与硬件设备关联起来,但又必须提供灵活的结构来应对变化——特别是对于Android这个更新相当频繁的系统。
比如以前Android系统中的Audio系统依赖于ALSA-lib,但后期就变为了tinyalsa,这样的转变不应该对上层造成破坏。

因而Audio HAL提供了统一的接口来定义它与AudioFlinger/AudioPolicyService之间的通信方式,这就是audio_hw_device、audio_stream_in及audio_stream_out等等存在的目的。这些Struct数据类型内部大多只是函数指针的定义,是一些“壳”。当AudioFlinger/AudioPolicyService初始化时,它们会去寻找系统中最匹配的实现(这些实现驻留在以audio.primary.,audio.a2dp.为名的各种库中)来填充这些“壳”。

根据产品的不同,音频设备存在很大差异,在Android的音频架构中,这些问题都是由HAL层的audio.primary等等库来解决的,而不需要大规模地修改上层实现。换句话说,厂商在定制时的重点就是如何提供这部分库的高效实现了。

Tinyalsa 层:

源码在external/tinyalsa目录下
Tinyalsa:tinyplay/tinycap/tinymix,这些用户程序直接调用 alsa 用户库接口来实现放音、录音、控制。

Kernel部分:

ASoC被分为Machine、Platform和Codec三大部分。

Machine用于描述设备组件信息和特定的控制如耳机/外放等。

Platform用于实现平台相关的DMA驱动和音频接口等。

Codec用于实现平台无关的功能,如寄存器读写接口,音频接口,各widgets的控制接口和DAPM的实现等。

相关推荐

  1. Android 音频焦点管理

    2024-04-14 09:08:03       62 阅读
  2. android 音频调试技巧

    2024-04-14 09:08:03       60 阅读
  3. Android音频焦点

    2024-04-14 09:08:03       28 阅读
  4. android 音频焦点,音频策略梳理

    2024-04-14 09:08:03       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-14 09:08:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 09:08:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 09:08:03       82 阅读
  4. Python语言-面向对象

    2024-04-14 09:08:03       91 阅读

热门阅读

  1. 基于双向链表的通讯录C语言实现

    2024-04-14 09:08:03       35 阅读
  2. [蓝桥杯 2023 省 B] 冶炼金属(c++)

    2024-04-14 09:08:03       35 阅读
  3. Spring ApplicationEvent 事件处理--不用引入中间件

    2024-04-14 09:08:03       41 阅读
  4. 自定义神经网络时的注意事项

    2024-04-14 09:08:03       42 阅读
  5. TensorFlow学习之:高级应用和扩展

    2024-04-14 09:08:03       32 阅读
  6. Redis 内存碎片揭秘:成因、影响与清理策略

    2024-04-14 09:08:03       39 阅读
  7. 如何开通『GPT-4 Turbo』

    2024-04-14 09:08:03       34 阅读
  8. 第七章 模板

    2024-04-14 09:08:03       110 阅读
  9. 数据库讲解---(SQL语句--练习题讲解)【MySQL版本】

    2024-04-14 09:08:03       40 阅读
  10. 【Linux】动静态库

    2024-04-14 09:08:03       42 阅读
  11. SRTP + RTCP + SCTP

    2024-04-14 09:08:03       35 阅读
  12. 供应RTC5606H 芯片现货

    2024-04-14 09:08:03       41 阅读
  13. Android sweet-alert-dialog 自定义按钮背景颜色

    2024-04-14 09:08:03       45 阅读
  14. C#:for循环

    2024-04-14 09:08:03       129 阅读
  15. 大模型日报2024-04-13

    2024-04-14 09:08:03       52 阅读
  16. 智能需要适时动态的分类和打标

    2024-04-14 09:08:03       87 阅读