基于Andorid9.0源码
分析下AudioRecord、AudioTrack对应 audioserver中的关键类。
一.ThreadBase
ThreadBase,线程类对音频数据处理(混音、音效),从Hal层读数据、写数据
分析AudioRecord和AudioTrack源码,发现有多种Thread,都继承ThreadBase。其结构如下图
-
RecordThread:录音线程
-
PlaybackThread:播放线程,包括多个子类,对应不同的播放模式;
MixerThread:混音线程
DuplicatingThread:混音线程子类,特殊在于音频数据复制成两份分别输出
DirectOutputThread:直接输出,软件层不需要mixer混音,直接交给hal层数据
OffloadThread:压缩的音频数据,直接输出到hal层,由音频DSP进行解码处理;
-
MmapThread:映射线程,AAudio使用,后续研究。。。
MixerThread
以MixerThread为例分析下其内部使用
MixerThread由AudioFlinger openOutput创建,其父类PlaybackThread重写了Thread的threadLoop,onFirstRef方法,MixerThread没有重写.
void AudioFlinger::PlaybackThread::onFirstRef()
{
run(mThreadName, ANDROID_PRIORITY_URGENT_AUDIO);
}
MixerThread对象创建时会调用onFirstRef函数,run 方法启动线程循环体threadLoop
bool AudioFlinger::PlaybackThread::threadLoop(){
while (!exitPending())
{
//....
processConfigEvents_l();
mMixerStatus = prepareTracks_l(