大家在学习NuPlayerDriver.cpp的时候,可以看到被上层调用的接口内部都会被设置一个变量:mState,它的状态总共有11种:
//frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
enum State {
STATE_IDLE,
STATE_SET_DATASOURCE_PENDING,
STATE_UNPREPARED,
STATE_PREPARING,
STATE_PREPARED,
STATE_RUNNING,
STATE_PAUSED,
STATE_RESET_IN_PROGRESS,
STATE_STOPPED, // equivalent to PAUSED
STATE_STOPPED_AND_PREPARING, // equivalent to PAUSED, but seeking
STATE_STOPPED_AND_PREPARED, // equivalent to PAUSED, but seek complete
};
其中最主要的状态分别是:IDLE/UNPREPARED/PREPARED/RUNNING/PAUSED/STOPPED,其他的状态都是中间的过度态。通过这些状态形成一个状态机来控制上层的接口调用的正确顺序,来让NuPlayer正常的运转。下面直接贴出自画的状态机供大家参考:
以下是许伟同学提供的来自官方的状态机,感谢大佬的投稿: