7.3 AudioFlinger的破解

AudioFlinger是Audio系统的核心,来自AudioTrack的数据,最终都会在这里得到处理并被写入Audio HAL层。虽然破解AudioFlinger的难度比较大,但既然已经攻破了桥头堡AudioTrack,并掌握了重要的突破口,那么对AudioFlinger的破解也就能手到擒来了。接下来,就一步步地破解它。

7.3.1 AudioFlinger的诞生

AudioFlinger驻留于MediaServer进程中。回顾一下它的代码,如下所示:


[—>Main_MediaServer.cpp]

int main(int argc,char**argv)

{

sp<ProcessState>proc(ProcessState:self());

sp<IServiceManager>sm=defaultServiceManager();

……

//很好,AF和APS都驻留在这个进程中。

AudioFlinger:instantiate();

AudioPolicyService:instantiate();

……

ProcessState:self()->startThreadPool();

IPCThreadState:self()->joinThreadPool();

}


1.AudioFlinger的构造

先看一段代码,如下所示:


[—>AudioFlinger.cpp]

void AudioFlinger:instantiate(){

defaultServiceManager()->addService(//把AF添加到ServiceManager中。

String16("media.audio_flinger"),new AudioFlinger());

}


再来看它的构造函数,如下所示:


[—>AudioFlinger.cpp]

AudioFlinger:AudioFlinger():BnAudioFlinger(),

mAudioHardware(0),//代表Audio硬件的HAL对象。

mMasterVolume(1.0f),mMasterMute(false),mNextThreadId(0)

{

mHardwareStatus=AUDIO_HW_IDLE;

//创建代表Audio硬件的HAL对象。

mAudioHardware=AudioHardwareInterface:create();

mHardwareStatus=AUDIO_HW_INIT;

if(mAudioHardware->initCheck()==NO_ERROR){

//设置系统初始化的一些值,有一部分通过Audio HAL设置到硬件中。

setMode(AudioSystem:MODE_NORMAL);

setMasterVolume(1.0f);

setMasterMute(false);

}

}


AudioHardwareInterface是Android对代表Audio硬件的封装,属于HAL层。HAL层的具体功能,由各个硬件厂商根据所选硬件的情况来实现,多以动态库的形式提供。这里简单分析一下Audio HAL的接口,至于其具体的实现就不做过多的探讨了。

2.AudioHardwareInterface介绍

AudioHardwareInterface接口的定义在AudioHardwareInterface.h中。先来看看它。


[—>AudioHardwareInterface.h:AudioHardwareInterface声明]

class AudioHardwareInterface

{

public:

virtual~AudioHardwareInterface(){}

//用于检查硬件是否初始化成功,返回的错误码定义在include/utils/Errors.h中。

virtual status_t initCheck()=0;

//设置通话音量,范围从0到1.0。

virtual status_t setVoiceVolume(float volume)=0;

/*

设置除通话音量外的其他所有音频流类型的音量,范围从0到1.0,如果硬件不支持的话,这个功能会由软件层的混音器完成。

*/

virtual status_t setMasterVolume(float volume)=0;

/*

设置模式,NORMAL的状态为普通模式,RINGTONE表示来电模式(这时听到的声音是来电铃声),IN_CALL表示通话模式(这时听到的声音是手机通话过程中的语音)。

*/

virtual status_t setMode(int mode)=0;

//和麦克相关

virtual status_t setMicMute(bool state)=0;

virtual status_t getMicMute(bool*state)=0;

//设置/获取配置参数,采用key/value的组织方式。

virtual status_t setParameters(const String8&keyValuePairs)=0;

virtual String8 getParameters(const String8&keys)=0;

//根据传入的参数得到输入缓冲的大小,返回0表示其中某个参数的值Audio HAL不支持。

virtual size_t getInputBufferSize(uint32_t sampleRate,int format,

int channelCount)=0;

/下面这几个函数非常重要/

/*

openOutputStream:创建音频输出流对象(相当于打开音频输出设备)。

AF可以往其中write数据,指针型参数将返回该音频输出流支持的类型、声道数、采样率等。

*/

virtual AudioStreamOut*openOutputStream(

uint32_t devices,

int*format=0,

uint32_t*channels=0,

uint32_t*sampleRate=0,

status_t*status=0)=0;

//关闭音频输出流。

virtual void closeOutputStream(AudioStreamOut*out)=0;

/创建音频输入流对象(相当于打开音频输入设备),AF可以read数据/

virtual AudioStreamIn*openInputStream(

uint32_t devices,

int*format,

uint32_t*channels,

uint32_t*sampleRate,

status_t*status,

AudioSystem:audio_in_acoustics acoustics)=0;

virtual void closeInputStream(AudioStreamIn*in)=0;

//关闭音频输入流。

virtual status_t dumpState(int fd,const Vector<String16>&args)=0;

//静态create函数,使用设计模式中的工厂模式,具体返回的对象由厂商根据硬件的情况决定。

static AudioHardwareInterface*create();

……

};


根据上面的代码,可以得出以下结论:

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

通过AudioHardwareInterface可设置音频系统的一些参数。

图7-6表示AudioHardwareInterface和音频输入输出对象之间的关系,以及它们的派生关系:

7.3 AudioFlinger的破解 - 图1

图 7-6 AudioHardwareInterface关系图

从图7-6中还可看出:

音频输出/输入对象均支持设置参数(由setParameters完成)。

说明 AudioHardwareInterface最重要的功能是创建AudioStreamOut和AudioStreamIn,它们分别代表音频输出设备和音频输入设备。从这个角度说,是AudioHardwareInterface管理着系统中所有的音频设备。Android引入的HAL层,大大简化了应用层的工作,否则不管是使用libasound(AlSA提供的用户空间库)还是ioctl来控制音频设备,都会非常麻烦。