オーディオseekToの実装
1.オーディオのseekToは最終的にAudioPlayerクラスで実現され、AudioPlayer::seekTo関数
2.bufferの充填はAudioPlayer::AudioSinkCallback関数でAudioPlayer::fillBufferを呼び出して充填され、fillBufferはmSource->read(&mInputBuffer,&options)を呼び出す.実装するには、readは音声タイプ対応MediaSourceの実装クラスを呼び出してseekto位置のデータを読み取ることを実現し、例えばMP 3オーディオは、ソフト解であればMP 3 Source::readメソッドを呼び出し、seekto位置のデータを読み込んでbufferを埋め込む.
seekからの位置はMediaSource::ReadOptionsオブジェクトoptionsに設定され、以下の方法で設定されます.
options.setSeekTo(mSeekTimeUs);
optionsはまたmSource->readのパラメータとしてMP 3 Source::read関数に渡され、MP 3 Sourceのメンバー変数mCurrentTimeUsに付与される.1フレームのデータを読み終えると、mCurrentTimeUsの値は1フレームの時間を増やします.計算方法は次のとおりです.
mCurrentTimeUs += frame_size * 8000ll/bitrate;
3.AudioSinkCallback関数はAudioPlayer::start関数に登録されています.
4.fillBuffer関数でINFO_FORMAT_CHANGEDでは、AudioSinkCallback関数を再登録しました.
以上、オーディオseekToの分析です.
status_t AudioPlayer::seekTo(int64_t time_us) {
Mutex::Autolock autoLock(mLock);
mSeeking = true;// seek true
mReachedEOS = false;// seek, , false
mSeekTimeUs = time_us;// seek
if (mAudioSink != NULL) { // mAudioSink ,mAudioSink create AudioTrack callback
mAudioSink->flush();
} else {
mAudioTrack->flush();
}
return OK;
}
2.bufferの充填はAudioPlayer::AudioSinkCallback関数でAudioPlayer::fillBufferを呼び出して充填され、fillBufferはmSource->read(&mInputBuffer,&options)を呼び出す.実装するには、readは音声タイプ対応MediaSourceの実装クラスを呼び出してseekto位置のデータを読み取ることを実現し、例えばMP 3オーディオは、ソフト解であればMP 3 Source::readメソッドを呼び出し、seekto位置のデータを読み込んでbufferを埋め込む.
seekからの位置はMediaSource::ReadOptionsオブジェクトoptionsに設定され、以下の方法で設定されます.
options.setSeekTo(mSeekTimeUs);
optionsはまたmSource->readのパラメータとしてMP 3 Source::read関数に渡され、MP 3 Sourceのメンバー変数mCurrentTimeUsに付与される.1フレームのデータを読み終えると、mCurrentTimeUsの値は1フレームの時間を増やします.計算方法は次のとおりです.
mCurrentTimeUs += frame_size * 8000ll/bitrate;
3.AudioSinkCallback関数はAudioPlayer::start関数に登録されています.
if (mAudioSink.get() != NULL) {
status_t err = mAudioSink->open(
mSampleRate, numChannels, AudioSystem::PCM_16_BIT,
DEFAULT_AUDIOSINK_BUFFERCOUNT,
&AudioPlayer::AudioSinkCallback, this);
4.fillBuffer関数でINFO_FORMAT_CHANGEDでは、AudioSinkCallback関数を再登録しました.
status_t err = mAudioSink->open(
mSampleRate, numChannels, AudioSystem::PCM_16_BIT,
DEFAULT_AUDIOSINK_BUFFERCOUNT,
&AudioPlayer::AudioSinkCallback, this);
以上、オーディオseekToの分析です.