オーディオseekToの実装


1.オーディオのseekToは最終的にAudioPlayerクラスで実現され、AudioPlayer::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の分析です.