[Player-cvs] kit/android PlayerDriver.cpp, 1.15, 1.16 advisesink.cpp, 1.3, 1.4 advisesink.h, 1.3, 1.4 clientcontext.cpp, 1.3, 1.4 clientcontext.h, 1.2, 1.3
qluo at helixcommunity.org qluo at helixcommunity.orgUpdate of /cvsroot/player/kit/android In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv7948 Modified Files: PlayerDriver.cpp advisesink.cpp advisesink.h clientcontext.cpp clientcontext.h Log Message: player state fix to make pause after seeking work. CR: sfu at real.com Index: PlayerDriver.cpp =================================================================== RCS file: /cvsroot/player/kit/android/PlayerDriver.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- PlayerDriver.cpp 25 Feb 2009 23:39:13 -0000 1.15 +++ PlayerDriver.cpp 3 Mar 2009 14:47:44 -0000 1.16 @@ -163,7 +163,6 @@ status_t handleReset(PlayerReset* ec); status_t handleQuit(PlayerQuit* ec); status_t handleGetPosition(PlayerGetPosition* ec); - status_t handleGetStatus(PlayerGetStatus* ec); private: @@ -420,10 +419,6 @@ ret = handleGetPosition(static_cast<PlayerGetPosition*>(ec)); break; - case PlayerCommand::PLAYER_GET_STATUS: - ret = handleGetStatus(static_cast<PlayerGetStatus*>(ec)); - break; - case PlayerCommand::PLAYER_RESET: ret = handleReset(static_cast<PlayerReset*>(ec)); break; @@ -592,48 +587,6 @@ return OK; } -status_t PlayerDriver::handleGetStatus(PlayerGetStatus* ec) -{ - LOGD("PlayerDriver::handleGetStatus"); - - EHXClientState eHXPlayerState; - media_player_states eAndroidPlayerState; - - eHXPlayerState = (EHXClientState)m_pClientState->GetState(); - LOGD("m_pClientState->GetState() = %d", eHXPlayerState); - - switch (eHXPlayerState) - { - case HX_CLIENT_STATE_READY: - case HX_CLIENT_STATE_CONNECTING: - case HX_CLIENT_STATE_CONNECTED: - case HX_CLIENT_STATE_OPENING: - eAndroidPlayerState = MEDIA_PLAYER_IDLE; - break; - case HX_CLIENT_STATE_OPENED: - eAndroidPlayerState = MEDIA_PLAYER_INITIALIZED; - break; - case HX_CLIENT_STATE_PREFETCHING: - eAndroidPlayerState = MEDIA_PLAYER_PREPARING; - break; - case HX_CLIENT_STATE_PREFETCHED: - eAndroidPlayerState = MEDIA_PLAYER_PREPARED; - break; - case HX_CLIENT_STATE_PLAYING: - eAndroidPlayerState = MEDIA_PLAYER_STARTED; - break; - case HX_CLIENT_STATE_PAUSED: - eAndroidPlayerState = MEDIA_PLAYER_PAUSED; - break; - case HX_CLIENT_STATE_SEEKING: - eAndroidPlayerState = MEDIA_PLAYER_INITIALIZED; - break; - } - - ec->set(eAndroidPlayerState); - return OK; -} - status_t PlayerDriver::handleReset(PlayerReset* ec) { LOGV("handleReset"); @@ -1061,6 +1014,7 @@ : m_Init(NO_INIT) , m_Duration(-1) , m_nMyFD(-1) + , m_bIsPlaying(false) { LOGI("HelixPlayer constructor"); m_PlayerDriver = new PlayerDriver(this); @@ -1193,6 +1147,7 @@ status_t HelixPlayer::start() { LOGV("start"); + m_bIsPlaying = true; return m_PlayerDriver->enqueueCommand(new PlayerStart(0,0)); } @@ -1210,12 +1165,7 @@ bool HelixPlayer::isPlaying() { - int status = 0; - if (m_PlayerDriver->enqueueCommand(new PlayerGetStatus(&status,0,0)) == NO_ERROR) - { - return (status == MEDIA_PLAYER_STARTED); - } - return false; + return m_bIsPlaying; } status_t HelixPlayer::getVideoWidth(int *w) @@ -1274,4 +1224,20 @@ MediaPlayerBase::sendEvent(msg, ext1, ext2); } +void HelixPlayer::setPlayerState(media_player_states state) +{ + m_eState = state; + // set m_bIsPlaying flag + if (m_bIsPlaying == false && m_eState == MEDIA_PLAYER_STARTED) + { + m_bIsPlaying = true; + } + else if (m_eState == MEDIA_PLAYER_PAUSED || + m_eState == MEDIA_PLAYER_STOPPED || + m_eState == MEDIA_PLAYER_PLAYBACK_COMPLETE) + { + m_bIsPlaying = false; + } +} + }; // namespace android Index: clientcontext.cpp =================================================================== RCS file: /cvsroot/player/kit/android/clientcontext.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- clientcontext.cpp 25 Feb 2009 00:09:41 -0000 1.3 +++ clientcontext.cpp 3 Mar 2009 14:47:44 -0000 1.4 @@ -288,3 +288,8 @@ LOGD("AndroidClientContext::SetDuration(%d)", duration); m_pMediaPlayer->setDuration(duration); } + +void AndroidClientContext::SetPlayerState(media_player_states state) +{ + m_pMediaPlayer->setPlayerState(state); +} Index: advisesink.h =================================================================== RCS file: /cvsroot/player/kit/android/advisesink.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- advisesink.h 25 Feb 2009 00:09:41 -0000 1.3 +++ advisesink.h 3 Mar 2009 14:47:44 -0000 1.4 @@ -112,6 +112,7 @@ void GetClipInfo(); void SendClipProperties(IHXValues* pHeader); + void TranslateToAndroidState(UINT16 uState); LONG32 m_lRefCount; IUnknown* m_pUnknown; Index: advisesink.cpp =================================================================== RCS file: /cvsroot/player/kit/android/advisesink.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- advisesink.cpp 25 Feb 2009 00:09:41 -0000 1.3 +++ advisesink.cpp 3 Mar 2009 14:47:44 -0000 1.4 @@ -194,6 +194,7 @@ LOGD("AndroidClientAdviseSink::OnPresentationClose"); if(m_bOpened) { + m_pAndroidContext->SetPlayerState(MEDIA_PLAYER_PLAYBACK_COMPLETE); m_pAndroidContext->SendEvent(android::MEDIA_PLAYBACK_COMPLETE); m_bOpened = FALSE; } @@ -218,6 +219,7 @@ STDMETHODIMP AndroidClientAdviseSink::OnStop(void) { + m_pAndroidContext->SetPlayerState(MEDIA_PLAYER_STOPPED); return HXR_OK; } @@ -248,6 +250,10 @@ STDMETHODIMP AndroidClientAdviseSink::OnStateChange(UINT16 uOldState, UINT16 uNewState) { LOGD("AndroidClientAdviseSink::OnStateChanged %d->%d", uOldState, uNewState); + + // make new state available to the android MediaPlayer + TranslateToAndroidState(uNewState); + //XXXctb Something is wrong with android's state machine, so ensure that we are only // sending one 'onPrepared' message. if (uNewState == HX_CLIENT_STATE_PREFETCHED && !m_bPrepared) @@ -393,3 +399,41 @@ { return HXR_OK; } + +void AndroidClientAdviseSink::TranslateToAndroidState(UINT16 uState) +{ + media_player_states eAndroidPlayerState = MEDIA_PLAYER_STATE_ERROR; + + switch (uState) + { + case HX_CLIENT_STATE_READY: + case HX_CLIENT_STATE_CONNECTING: + case HX_CLIENT_STATE_CONNECTED: + case HX_CLIENT_STATE_OPENING: + eAndroidPlayerState = MEDIA_PLAYER_IDLE; + break; + case HX_CLIENT_STATE_OPENED: + eAndroidPlayerState = MEDIA_PLAYER_INITIALIZED; + break; + case HX_CLIENT_STATE_PREFETCHING: + eAndroidPlayerState = MEDIA_PLAYER_PREPARING; + break; + case HX_CLIENT_STATE_PREFETCHED: + eAndroidPlayerState = MEDIA_PLAYER_PREPARED; + break; + case HX_CLIENT_STATE_PLAYING: + eAndroidPlayerState = MEDIA_PLAYER_STARTED; + break; + case HX_CLIENT_STATE_PAUSED: + eAndroidPlayerState = MEDIA_PLAYER_PAUSED; + break; + case HX_CLIENT_STATE_SEEKING: + // no change + break; + } + + if (eAndroidPlayerState != MEDIA_PLAYER_STATE_ERROR) + { + m_pAndroidContext->SetPlayerState(eAndroidPlayerState); + } +} Index: clientcontext.h =================================================================== RCS file: /cvsroot/player/kit/android/clientcontext.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- clientcontext.h 25 Feb 2009 00:09:41 -0000 1.2 +++ clientcontext.h 3 Mar 2009 14:47:44 -0000 1.3 @@ -85,6 +85,8 @@ void SetVideoWidth(int width); void SetVideoHeight(int height); void SetDuration(int duration); + void SetPlayerState(media_player_states state); + /* * IUnknown methods */