MediaPlayer 那边就不看了,从AudioTrack 开始研究
1、AudioTrack::write 函数 调用函数 obtainBuffer获取到一块 buffer,然后把传入的数据 copy 到获取的 buffer 中
2、AudioTrack::obtainBuffer 函数 该函数的主要功能就是对传入的 audioBuffer 进行赋值
看看audioBuffer 的类型: class Buffer { public: enum { MUTE = 0x00000001 }; uint32_t flags; int channelCount; int format; size_t frameCount; size_t size; union { void* raw; short* i16; int8_t* i8; }; }; 其中存放数据的是下面这个东东: union { void* raw; short* i16; int8_t* i8; }; 对这块东东赋值的代码如下: audioBuffer->raw = (int8_t *)cblk->buffer(u); 先看其中 cblk 的来历: audio_track_cblk_t* cblk = mCblk; mCblk 的赋值在函数 AudioTrack::createTrack 中: mCblk = static_cast(cblk->pointer()); cblk 的由来: sp cblk = track->getCblk(); track 的由来: sp track = audioFlinger->createTrack(getpid(), streamType, sampleRate, format, channelCount, frameCount, ((uint16_t)flags)