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) << 16, sharedBuffer, output, &mSessionId, &status); 函数AudioFlinger::createTrack 返回的是一个TrackHandle 对象: trackHandle = new TrackHandle(track); return trackHandle; track 的由来: track = thread->createTrack_l(client, streamType, sampleRate, format, channelCount, frameCount, sharedBuffer, lSessionId, &lStatus); 函数AudioFlinger::PlaybackThread::createTrack_l 返回的是一个Track 对象: track = new Track(this, client, streamType, sampleRate, format, channelCount, frameCount, sharedBuffer, sessionId); return track; 看看函数TrackHandle::getCblk() : return mTrack->getCblk(); mTrack 就是作为构造函数传入的track 对象。 函数AudioFlinger::ThreadBase::TrackBase::getCblk() 的实现: return mCblkMemory; mCblkMemory 的赋值在构造函数AudioFlinger::ThreadBase::TrackBase::TrackBase 中: mCblkMemory = client->heap()->allocate(size); mCblk = static_cast(m...