MediaPlayer_setDataSource流程
-----------------------------------------------------------------------------------------------------------------------------------------------------
App层:
private final MediaPlayer mMediaPlayer;
mMediaPlayer = new MediaPlayer();
mMediaPlayer.reset();
mMediaPlayer.setDataSource(path);
-----------------------------------------------------------------------------------------------------------------------------------------------------
Framework api:
android/media/MediaPlayer.java:
//加载JNI部分,libmedia,初始化
static {
System.loadLibrary("media_jni");
native_init();
}
//api最终调用的java函数
void setDataSource(FileDescriptor fd, longoffset, long length)
//调用native函数
native void _setDataSource(FileDescriptorfd, long offset, long length)
-----------------------------------------------------------------------------------------------------------------------------------------------------
Native层:
/frameworks/av/media/libmedia/mediaplayer.cpp:
// 创建sp<IMediaPlayer>,调用sp ->setDataSource(fd, offset, length)
MediaPlayer::setDataSource(int fd, int64_toffset, int64_t length)
调用服务端的MediaPlayerService的setDataSource函数
class MediaPlayerService : publicBnMediaPlayerService
/frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
//获取播放器类型,并创建sp<MediaPlayerBase>,post创建结果消息
status_t MediaPlayerService::Client::setDataSource(intfd, int64_t offset, int64_t length)
spMediaPlayerService::Client::setDataSource_pre(player_type playerType)
//创建播放器
MediaPlayerFactory::createPlayer(playerType,mListener, mPid);
//创建NuPlayerDriver
/frameworks/av/media/libmediaplayerservice/MediaPlayerFactory.cpp
virtual spcreatePlayer(pid_t pid) {
ALOGV(" createNuPlayer");
return newNuPlayerDriver(pid);
}
/frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
//接下来是NuPlayerDriver的构造,初始化很多变量
NuPlayerDriver::NuPlayerDriver(pid_t pid)
: mState(STATE_IDLE),
mIsAsyncPrepare(false),
mAsyncResult(UNKNOWN_ERROR),
mSetSurfaceInProgress(false),
mDurationUs(-1),
mPositionUs(-1),
mSeekInProgress(false),
mPlayingTimeUs(0),
mRebufferingTimeUs(0),
mRebufferingEvents(0),
mRebufferingAtExit(false),
mLooper(new ALooper),
mMediaClock(newMediaClock),
mPlayer(newNuPlayer(pid, mMediaClock)),
mPlayerFlags(0),
mAnalyticsItem(NULL),
mClientUid(-1),
mAtEOS(false),
mLooping(false),
mAutoLoop(false) {
ALOGD("NuPlayerDriver(%p) created, clientPid(%d)", this, pid);
mLooper->setName("NuPlayerDriverLooper");
mMediaClock->init();
// set up an analyticsrecord
mAnalyticsItem =MediaAnalyticsItem::create(kKeyPlayer);
mLooper->start(
false, /*runOnCallingThread */
true, /* canCallJava */
PRIORITY_AUDIO);
mLooper->registerHandler(mPlayer);
mPlayer->init(this);
}
//重点注意:
mPlayer(new NuPlayer(pid, mMediaClock)),
mPlayerFlags(0),
mPlayer->init(this);
//创建了NuPlayer, 这就是实际的播放器对象,调用了NuPlayer去init
/frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
//创建GenericSource,完成后msg->post(),发出消息kWhatSetDataSource
void NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_tlength)
在NuPlayer::onMessageReceived(const sp<AMessage> &msg)中接受消息,调用notifySetDataSourceCompleted通知出去。
case kWhatSetDataSource:
{
ALOGV("kWhatSetDataSource");
CHECK(mSource ==NULL);
status_t err = OK;
sp obj;
CHECK(msg->findObject("source", &obj));
if (obj != NULL){
Mutex::Autolock autoLock(mSourceLock);
mSource =static_cast(obj.get());
} else {
err =UNKNOWN_ERROR;
}
CHECK(mDriver !=NULL);
sp driver = mDriver.promote();
if (driver !=NULL) {
driver->notifySetDataSourceCompleted(err);
}
break;
}
/frameworks/av/media/libmediaplayerservice/nuplayer/GenericSource.cpp
//重置 resetDataSource(),设置新的fd
mFd = dup(fd);
mOffset = offset;
mLength = length;
/frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
//至此,setDataSource()的流程结束,最后的状态是:STATE_UNPREPARED
void NuPlayerDriver::notifySetDataSourceCompleted(status_t err) {
Mutex::AutolockautoLock(mLock);
CHECK_EQ(mState,STATE_SET_DATASOURCE_PENDING);
mAsyncResult = err;
mState = (err == OK) ?STATE_UNPREPARED : STATE_IDLE;
mCondition.broadcast();
}