Stagefright之六
——AudioPlayback的流程
Stagefright中关于audio的部分是交由 AudioPlayer来处理,它是在AwesomePlayer::play_l中被创建的。
(1) 当上层应用程序要求播放视频时,AudioPlayer同时被创建,并被启动
*******************************************************************************
status_t AwesomePlayer::play_l()
{
...
mAudioPlayer = new AudioPlayer(mAudioSink, ...);
mAudioPlayer->setSource(mAudioSource);
mAudioPlayer->start(...);
...
}
*******************************************************************************
(2) AudioPlayer在启动的过程中会先去读取第一笔解码后的数据,并且开启audio output
status_t AudioPlayer::start(...)
{
mSource->read(&mFirstBuffer);
if (mAudioSink.get() != NULL)
{
mAudioSink->open(..., &AudioPlayer::AudioSinkCallback, ...);
mAudioSink->start();
}
else
{
mAudioTrack = new AudioTrack(..., &AudioPlayer::AudioCallback, ...);
mAudioTrack->start();
}
}
从 AudioPlayer::start的程序代码来看,AudioPlayer似乎并没有将mFirstBuffer传给audio output。
(3) 开启audio output的同时,AudioPlayer会将callback函数设给它,之后每当callback函数被呼叫,AudioPlayer便去 audio decoder读取解码后的数据
size_t AudioPlayer::AudioSinkCallback(audioSink, buffer, size, ...)
{
return fillBuffer(buffer, size);
}
void AudioPlayer::AudioCallback(..., info)
{
buffer = info;
fillBuffer(buffer->raw, buffer->size);
}
size_t AudioPlayer::fillBuffer(data, size)
{
mSource->read(&mInputBuffer, ...);
memcpy(data, mInputBuffer->data(), ...);
}
解码后audio数据的读取就是由callback函数所驱动,但是callback函数又是怎么由audio output去驱动的,目前从程序代码上还看不出来。另外一方面,从上面的程序片段可以看出,fillBuffer将数据(mInputBuffer)复制到data之后,audio output应该会去取用data。
(5) audio decoder的buffer传输流程与video decoder类似,可参阅video decoder