音频系统的播放接口由AudioTrack提供,每一个音频都会对应一个AudioTrack实例,它会通过iBinder来远程调用AudioFlinger的createTrack函数.AudioFlinger 会根据传入的frameCOunt参数申请一块内存,AudioTrack可以通过IaudioTrack接口的getCblk()函数获得指向该内存的Imemory接口,然后AudioTrack通过该Imemeory接口的pointer()函数获得指向该内存快的指针,这块内存的开始部分是audio_track_cblk_t结构,紧接着是大小为feameSize的buffer内存.
代码路径位于frameworks/base/media/libmedia/AudioTrack.cpp
status_t AudioTrack::set(
int streamType,
uint32_t sampleRate,
int format,
int channelMask,
int frameCount,
uint32_t flags,
callback_t cbf,
void* user,
int notificationFrames,
const sp<IMemory>& sharedBuffer,
bool threadCanCallJava,
int sessionId)
{
LOGV_IF(sharedBuffer != 0, "sharedBuffer: %p, size: %d", sharedBuffer->pointer(), sharedBuffer->size());
AutoMutex lock(mLock);
if (mAudioTrack != 0) {
LOGE("Track already in use");
return INVALID_OPERATION;
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
/* create the IAudioTrack */
status_t status = createTrack_l(streamType,
sampleRate,
(uint32_t)format,
(uint32_t)channelMask,
frameCount,
flags,
sharedBuffer,
output,
true);
if (status != NO_ERROR) {
return status;
}
if (cbf != 0) {
mAudioTrackThread = new AudioTrackThread(*this, threadCanCallJava);
if (mAudioTrackThread == 0) {
LOGE("Could not create callback thread");
return NO_INIT;
}
}
。。。。。。。。。。。。。。。。。。。
AudioSystem::acquireAudioSessionId(mSessionId);
mRestoreStatus = NO_ERROR;
return NO_E