Audio笔记之MediaPlayerService:prepare

来源:互联网 发布:游戏人生软件下载 编辑:程序博客网 时间:2024/05/22 06:53


status_t MediaPlayer::prepare(){    ALOGV("prepare");    Mutex::Autolock _l(mLock);    mLockThreadId = getThreadId();    if (mPrepareSync) {        mLockThreadId = 0;        return -EALREADY;    }    mPrepareSync = true;    status_t ret = prepareAsync_l();    if (ret != NO_ERROR) {        mLockThreadId = 0;        return ret;    }    if (mPrepareSync) {        mSignal.wait(mLock);  // wait for prepare done        mPrepareSync = false;    }    ALOGV("prepare complete - status=%d", mPrepareStatus);    mLockThreadId = 0;    return mPrepareStatus;}status_t MediaPlayer::prepareAsync_l(){    if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_INITIALIZED | MEDIA_PLAYER_STOPPED) ) ) {        mPlayer->setAudioStreamType(mStreamType);        mCurrentState = MEDIA_PLAYER_PREPARING;        return mPlayer->prepareAsync();    }    ALOGE("prepareAsync called in state %d", mCurrentState);    return INVALID_OPERATION;} status_t MediaPlayerService::Client::setAudioStreamType(audio_stream_type_t type){    ALOGV("[%d] setAudioStreamType(%d)", mConnId, type);    // TODO: for hardware output, call player instead    Mutex::Autolock l(mLock);    if (mAudioOutput != 0) mAudioOutput->setAudioStreamType(type);    return NO_ERROR;}status_t MediaPlayerService::Client::prepareAsync(){    ALOGV("[%d] prepareAsync", mConnId);    sp<MediaPlayerBase> p = getPlayer();    if (p == 0) return UNKNOWN_ERROR;    status_t ret = p->prepareAsync();#if CALLBACK_ANTAGONIZER    ALOGD("start Antagonizer");    if (ret == NO_ERROR) mAntagonizer->start();#endif    return ret;}status_t StagefrightPlayer::prepareAsync() {    return mPlayer->prepareAsync();}status_t AwesomePlayer::prepareAsync() {    ATRACE_CALL();    Mutex::Autolock autoLock(mLock);    if (mFlags & PREPARING) {        return UNKNOWN_ERROR;  // async prepare already pending    }    mIsAsyncPrepare = true;    return prepareAsync_l();}status_t AwesomePlayer::prepareAsync_l() {    if (mFlags & PREPARING) {        return UNKNOWN_ERROR;  // async prepare already pending    }    if (!mQueueStarted) {        mQueue.start();        mQueueStarted = true;    }    modifyFlags(PREPARING, SET);    mAsyncPrepareEvent = new AwesomeEvent(            this, &AwesomePlayer::onPrepareAsyncEvent);    mQueue.postEvent(mAsyncPrepareEvent);    return OK;}void AwesomePlayer::onPrepareAsyncEvent() {    Mutex::Autolock autoLock(mLock);    if (mFlags & PREPARE_CANCELLED) {        ALOGI("prepare was cancelled before doing anything");        abortPrepare(UNKNOWN_ERROR);        return;    }    if (mUri.size() > 0) {        status_t err = finishSetDataSource_l();        if (err != OK) {            abortPrepare(err);            return;        }    }    if (mVideoTrack != NULL && mVideoSource == NULL) {        status_t err = initVideoDecoder();        if (err != OK) {            abortPrepare(err);            return;        }    }    if (mAudioTrack != NULL && mAudioSource == NULL) {        status_t err = initAudioDecoder();        if (err != OK) {            abortPrepare(err);            return;        }    }    modifyFlags(PREPARING_CONNECTED, SET);    if (isStreamingHTTP()) {        postBufferingEvent_l();    } else {        finishAsyncPrepare_l();    }}




0 0
原创粉丝点击