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-6 AudioHardwareInterface关系图
从图7-6中还可看出:
音频输出/输入对象均支持设置参数(由setParameters完成)。
说明 AudioHardwareInterface最重要的功能是创建AudioStreamOut和AudioStreamIn,它们分别代表音频输出设备和音频输入设备。从这个角度说,是AudioHardwareInterface管理着系统中所有的音频设备。Android引入的HAL层,大大简化了应用层的工作,否则不管是使用libasound(AlSA提供的用户空间库)还是ioctl来控制音频设备,都会非常麻烦。