调用MediaPlayer的setParameter、prepare方法后,经过一系列处理,最终后调用MediaPlayerService的setParameter方法,具体如下:
sp<AudioTrack> mTrack;
//frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
status_t MediaPlayerService::AudioOutput::setParameters(const String8& keyValuePairs)
{
Mutex::Autolock lock(mLock);
if (mTrack == 0) return NO_INIT;
return mTrack->setParameters(keyValuePairs); //调用AudioTrack的setParameters方法
}
调用AudioTrack的setParameters方法:
frameworks/av/media/libaudioclient/AudioTrack.cpp
status_t AudioTrack::setParameters(const String8& keyValuePairs)
{
AutoMutex lock(mLock);
status_t status;
mAudioTrack->setParameters(keyValuePairs.c_str(), &status);
return status;
}
这里最重要的代码就是status = mAudioTrack->setParameters(); ,其中mAudioTrack的定义为sp<IAudioTrack> mAudioTrack;,IAudioTrack接口由AudioFlinger的BnAudioTrack实现, mAudioTrack->setParameters()会调用BnAudioTrack的start函数。
/frameworks/av/media/libaudioclient/IAudioTrack.aidl
interface IAudioTrack {
......
/** Send parameters to the audio hardware. */
int setParameters(@utf8InCpp String keyValuePairs);
}
AudioFlinger TrackHandle start
之后就是AudioFlinger的处理了: