1.AudioFlinger:管理着系统中的输入输出音频流,并承担音频数据的混音,以及读写Audio硬件等工作以实现数据的输入输出功能。
2.阅读API文档,是一个快速掌握相关知识的好方法。
3.Linux平台创建共享内存的一般做法是:1>进程A创建并打开一个文件,得到一个文件描述符fd;
2>通过mmap调用将fd映射成内存映射文件,在mmap调用中指定特定的参数表示要创建进程间共享内存;
3>进程B打开同一个文件,也得到一个文件描述符。这样A和B就打开了同一个文件
4>进程B也要用mmap调用指定的参数表示想使用共享内存,并传递打开的fd.这样A和B就通过打开同一个文件并构造内存映射,实现了进程间的内存共享。
4.android_media_AudioTrack_native_setup函数 //android_media_AudioTrack.cpp
AudioTrack *lpTrack = new AudioTrack();
lpTrack->set(atStreamType, sampleRateInHertz,format,channels,frameCount,0,audioCallback,&(lpJniStorage->mCallbackData),0,0,true);
AudioTrack(Java空间)的分析总结:
AudioTrack在JNI层使用了Native的AudioTrack对象,总结一下调用Native对象的流程:
1>new 一个AudioTrack,使用无参的构造函数
2>调用set函数,把java层的参数传进去,另外还设置了一个audiocallback回调函数
3>调用AudioTrack的start函数
4>调用AudioTrack的writet函数
5>工作完毕后,调用stop
6>Native对象的delete
5.上述set函数createTrack,这个createTrack又会通过audioFlinger去调用createTrack
set函数会创建一个AudioTrackThread; 处理数据
AudioFlinger有几种不同类型的工作线程,关系如下:
Thread-->ThreadBase--->PlayBackThread---->MixThread------->DuplicatingThread
---->DirectOutputThread
MixThread工作流程:1>接收来自AT的数据;2>对这些数据进行混音;3>把混音结果写到AudioStreamOut中;这样就完成了音频数据的输出。
6.AudioPolicyService openOutput导致AF创建工作线程。
MixThread的线程函数大致工作流程是:
1>如果有通知信息或者配置请求,则先完成这些工作,比如向监听者通知AF的一些信息,或者根据配置请求进行音量控制、设备切换等
2>调用prepareTracks_l函数,检查活跃的Tracks是否有数据已经准备好;
3>调用混音器对象mAudioMixer的process,并且传入一个存储结果数据的缓冲,混音后的结果就存储在这个缓冲中。
4>调用AudioOutputStream对象的write,把结果写入设备