stagefright AudioPlayer源码位置 :
frameworks/av/cmds/stagefright/AudioPlayer.cpp
流程为:
AudioPlayer自己解码音频数据,然后把解码之后的数据送往AudioTrack来播放。
AudioPlayer的使用
sp<AudioPlayer> player = sp<AudioPlayer>::make(nullptr);
player->setSource(rawSource);
rawSource.clear();
err = player->start(true /* sourceAlreadyStarted */);
AudioPlayer的start方法
在 start方法中创建了一个AudioTrack ,然后调用它的start方法 。
AudioTrack简单解析 :
我们的AudioPlayer::start()调用 AudioTrack::start(), 后者调用AudioTrackThread::resume() ,后者执行mMyCond.signal() 唤醒AudioTrackThread, 开始调用AudioTrackThread::threadLoop()。
它调用AudioTrack::processAudioBuffer(),后者调用mCbf(EVENT_MORE_DATA, …) 去取音频数据,这个会调用到stagefright的 AudioPlayer::onMoreData方法。
AudioPlayer::onMoreData()
AudioTrack请求填充数据。它调用 AudioPlayer::fillBuffer,继续到AudioPlayer.cpp的mSource->read 方法 。
MediaSource::read() :
我们的AudioPlayer的mSource的类型是SimpleDecodingSource,
一个SimpleDecodingSource有以下主要方法:
start()
stop()
getFormat()
read()
送入解码器,拿出解码的数据。
如何判断到达文件末尾:
mCodec->dequeueOutputBuffer 会返回是否到达文件末尾.
编解码流程:
位置在SimpleDecodingSource::doRead方法 。
mCodec->queueInputBuffer。
mCodec->dequeueOutputBuffer。
AudioTrack是如何处理解码之后的音频流数据的:
后面完善。