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
- Audio笔记之MediaPlayerService:prepare
- Audio笔记之MediaPlayerService:setDataSource
- Audio笔记之MediaPlayerService启动
- Android多媒体之MediaPlayerService
- Audio笔记之AudioMixer
- Audio笔记之MixerThread
- Audio笔记之FastMixer
- Audio笔记之AudioTrack
- Audio笔记之AudioTrackThread
- Audio笔记之AudioEffect
- Audio笔记之SoftAAC2
- Audio笔记之ServiceManager
- Audio笔记之MixerThread
- Audio笔记之AudioMixer
- MediaPlayerService
- video/audio playback:prepare & start
- video/audio playback:prepare & start
- video/audio playback:prepare & start
- UVA - 401 Palindromes (回文串)
- 第一天 安卓基础
- iOS开发 - navigationBar背景图默认的Translucent
- 互联网协议入门(二)
- alias让linux的命令行更简洁
- Audio笔记之MediaPlayerService:prepare
- 通过ApplicationContextAware加载Spring上下文环境
- jQuery加载失败
- Android简易日期选择
- Android eglCreateWindowSurface Memory Allocation Kinds of Buffers Memory Share
- 矩阵连乘问题
- 开始写博客吧...把只是都留在OneNote和EverNote其实没什么意思...
- IOS开发---OC语言-⑦类方法
- Junit的简单使用