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方法