Android Audio 系统(深入理解)

7.1 概述

AudioRcorder 和 AudioTrack 音频数据的采集和输出任务

AudioFinger 工作引擎 管理着系统中的输入输出音频流、承担音频数据的混音、读写Audio 硬件等工作以实现数据的输入输出功能

AudioPolicyService 策略控制中心,掌管系统中声音设备的选择和切换、音量控制等功能

7.2 AudioTrack

7.2.1 用例介绍

(1)根据音频数据的特性来确定所要分配的最小缓冲区

(2)创建AudioTrack 数据流类型+数据加载模式

(3)play()、write()、stop、release 方法

1.加载模式:

Mode_Stream:多次写入

Mode_Static:一次写入

2.音频流类型:

通话、多媒体、铃声、通知、系统声

3.Buffer 和 Frame

java:getminbuffersize 确定应用层分配多大的数据buffer——采样率、采样位深和声道数

native:native_get_min_buff_size——查询硬件信息

Frame = 1个采样点的字节数 * 声道数——声卡驱动管理的单位

7.2.2 Java 空间分析

1.AudioTrack 函数的构造

2.AudioTrackJniStorage

(1)共享内存,内存映射 ,mmap 文件描述符fd

(2)MemoryHeapBase 和 MemoryBase 类

3.play 和 write

7.2.3 Native 空间

1.new AudioTrack 和set 

set() 函数、audio_io_handle_t 类型 内部工作线程号

(1)IAudioTrack 和 AT,AF的关系

(2)共享内存及其Control Block

IAudioTrack中有一个共享内存,其头部是一个audio_track_cblk_t(简称CB)对象,在该对象之后才是数据缓冲区

flowControlFlag underrun 状态 环形缓冲区

(3)数据的Push 和 pull

Push:用户主动调用Write 写数据

——MediaPlayerService

Pull:AudioTrackThread 利用 audiocallback 回调函数 ,主动从用户那pull 数据

——ToneGenerator

AudioTrackThread 线程函数threadLoop

2.write 输入数据

3.obtainBuffer 和 releaseBuffer 

7.2.4 AudioTrack 总结

7.3  AudioFlinger

7.3.1 AudioFlinger 的诞生

MediaServer 进程

AudioHardwareInterface 是 Android 对代表Audio 硬件的封装,属于HAL层

AudioHardwareInterface 管理音频输出设备对象(AudioStreamOut)和音频输入设备对象(AudioStreamIn)

7.3.2 通过流程分析AudioFlinger

1.createTrack 分析

(1)选择工作线程 checkPlaybackThread_l

AudioFlinger 会创建几个工作线程,AT会找到对应的工作线程,找到对应的工作线程后,会执行CreateTrack_l 函数,根据output的值找到对应的thread

CreateTrack 返回的是TrackHandle 对象,它以Track 为参数构造

(2)AudioFlinger 涉及的对象

AudioFlinger 对象

Client 对象:AudioFlinger对客户端的封装,凡是使用AudioTrack和AudioRecord的进程,都被当作AF的Client,而且Client 用它的进程pid 作为标识

工作线程 PlaybackThread、DirectOutputThread、MixerThread、DuplicatingThread

PlaybackThread 和 AudioStreamOutput 对象

Track 对象

(3)MixerThread 分析

Audio Framework 总体上可分为三层,即 Java 层,JNI 和 Native 层,从音频业务的角度分析,可归纳为音频数据传输和音频服务控制两个方面,在音频数据传输方面,AudioTrack 用于数据输出,AudioRecord 用于数据输入,数据流向为从AT 到 共享内存 到 AF ,具体表现为,用户在应用层根据音频特性(采样率、位深和声道数 )构建一个最小缓冲区,然后,利用最小缓冲区,音频流,数据加载模式等输入参数构造AudioTrack,通过AudioTrack 与 AudioFlinger 进行数据交互,AudioFlinger是音频系统的引擎, 由其负责音频数据的输入、输出和混音操作,并完成硬件的读写操作,将数据输送至Hal 层。在代码流程上,主要是AT 和AF 的交互过程,首先 AudioTrack 使用

createTrack方法

你可能感兴趣的:(音视频)