void CGoodPlayer::PlayCompleted(void *pObj) { KillTimer(g_hMain, 1); //stop updating play time UpdatePlayTime(g_pPlayer->GetDuration()); EnableWindow(g_btPlay, true); EnableWindow(g_btPause, false); EnableWindow(g_btStop, false); }
void BasicPacketFlow::Pause(BOOL bWouldBlock, UINT32 ulPausePoint) { if (ulPausePoint > 0) { SetEndPoint(ulPausePoint, TRUE); } else { if (m_bIsPausePointSet) { m_bIsPausePointSet = FALSE; m_uEndPoint = 0; } m_bPlayPendingOnSeek = FALSE; m_bSessionPlaying = FALSE; HandleTimeLineStateChange(FALSE); if (!bWouldBlock) { // can we get multiple pauses? if (!m_bPaused) { m_bPaused = TRUE; // must be set before UpdatePlayTime(). HXTimeval hxt = m_pAccurateClock->GetTimeOfDay(); Timeval t((long)hxt.tv_sec, (long)hxt.tv_usec); m_tvBankedPlayTime += (t - m_tvRTSPPlayTime); UpdatePlayTime(); } } if (m_pRateManager) { IHXPacketFlowControl* pRateMgrFlowControl = NULL; if (HXR_OK == m_pRateManager->QueryInterface(IID_IHXPacketFlowControl, (void**)&pRateMgrFlowControl)) { pRateMgrFlowControl->Pause(ulPausePoint); HX_RELEASE(pRateMgrFlowControl); } } } }
STDMETHODIMP BasicPacketFlow::PacketReady(HX_RESULT ulStatus, IHXPacket* pPacket) { // update the PlayTime stat if not paused // (for some reason, we keep streaming when live pauses.) if (!m_bPaused) UpdatePlayTime(); if (ulStatus == HXR_OK && m_pConvertShim) { HX_RELEASE(m_pConvertingPacket); m_pConvertingPacket = pPacket; m_pConvertingPacket->AddRef(); m_pConvertShim->ConvertData(pPacket); return HXR_OK; } return SessionPacketReady(ulStatus, pPacket); }
void BasicPacketFlow::Done() { if (m_bIsDone) return; m_bIsDone = TRUE; ULONG32 ulSubscribedRate = 0; // Update the PlayTime stat // we come here on both TEARDOWN and client socket reset HXTimeval hxt = m_pAccurateClock->GetTimeOfDay(); Timeval t((long)hxt.tv_sec, (long)hxt.tv_usec); if (!m_bPaused) m_tvBankedPlayTime += (t - m_tvRTSPPlayTime); UpdatePlayTime(); if (m_pRateManager) { IHXPacketFlowControl* pRateMgrFlowControl = NULL; if (HXR_OK == m_pRateManager->QueryInterface(IID_IHXPacketFlowControl, (void**)&pRateMgrFlowControl)) { ulSubscribedRate = pRateMgrFlowControl->GetDeliveryRate(); HX_RELEASE(pRateMgrFlowControl); } } if (ulSubscribedRate) { m_pFlowMgr->ChangeDeliveryBandwidth(-1 * ulSubscribedRate, !m_bIsMulticast); if (m_pRateManager) { m_pRateManager->Done(); } } m_pFlowMgr = 0; HX_VECTOR_DELETE(m_pStreams); for (int j = 0; j < MAX_RESENDS_PER_SECOND; j++) { if (m_pResendIDs[j]) { m_pProc->pc->engine->schedule.remove(m_pResendIDs[j]); m_pResendIDs[j] = 0; } } if (m_pConvertShim) { m_pConvertShim->Done(); HX_RELEASE(m_pConvertShim); } HX_RELEASE(m_pConvertingPacket); HX_RELEASE(m_pPlayerControl); HX_RELEASE(m_pPlayerSessionId); HX_RELEASE(m_pAccurateClock); }
void GameDataHolder::Impl::Flush() { if( !FileExist( "save" ) ){ CreateDirectory( "save" ); } UpdatePlayTime(); std::vector < char > data; data.reserve( 30000 ); std::ofstream fOut( m_SaveDataFileName, std::ios::binary | std::ios::out ); if( !fOut ){ return; } CopyInt( &data, m_GameFileData.m_PlayTime ); CopyInt( &data, m_GameFileData.m_Progress ); for( int i = 0; i < GAME_DIFFICULTY_TOTAL; ++i ){ // 通常プレイの統計情報の保存 CopyInt( &data, m_GameFileData.m_Difficulty[ i ].m_NormalPlayStat.m_Play ); CopyInt( &data, m_GameFileData.m_Difficulty[ i ].m_NormalPlayStat.m_AllClear ); CopyInt( &data, m_GameFileData.m_Difficulty[ i ].m_NormalPlayStat.m_PlayTime ); CopyInt( &data, m_GameFileData.m_Difficulty[ i ].m_NormalPlayStat.m_Progress ); for( int j = 0; j < STAGE_TOTAL; ++j ){ // 敵情報の保存 const StageStat& stage = m_GameFileData.m_Difficulty[ i ].m_NormalPlayStat.m_StageStat[ j ]; StageStat::EnemyStatMap::const_iterator it = stage.m_EnemyStat.begin(); // エントリ数の保存 CopyInt( &data, stage.m_EnemyStat.size() ); for( ; it != stage.m_EnemyStat.end(); ++it ){ // 敵の名前の長さ保存 CopyInt( &data, it->first.size() ); // 敵の名前の保存 CopyArray( &data, it->first.c_str(), it->first.size() ); // 情報の保存 CopyInt( &data, it->second.m_Destroy ); CopyInt( &data, it->second.m_Damaged ); CopyInt( &data, it->second.m_KO ); } } // ステージ選択プレイの統計情報の保存 CopyInt( &data, m_GameFileData.m_Difficulty[ i ].m_StageSelectionPlayStat.m_Play ); CopyInt( &data, m_GameFileData.m_Difficulty[ i ].m_StageSelectionPlayStat.m_Clear ); CopyInt( &data, m_GameFileData.m_Difficulty[ i ].m_StageSelectionPlayStat.m_PlayTime ); for( int j = 0; j < STAGE_TOTAL; ++j ){ // 敵情報の保存 const StageStat& stage = m_GameFileData.m_Difficulty[ i ].m_StageSelectionPlayStat.m_StageStat[ j ]; StageStat::EnemyStatMap::const_iterator it = stage.m_EnemyStat.begin(); // エントリ数の保存 CopyInt( &data, stage.m_EnemyStat.size() ); for( ; it != stage.m_EnemyStat.end(); ++it ){ // 敵の名前の長さ保存 CopyInt( &data, it->first.size() ); // 敵の名前の保存 CopyArray( &data, it->first.c_str(), it->first.size() ); // 情報の保存 CopyInt( &data, it->second.m_Destroy ); CopyInt( &data, it->second.m_Damaged ); CopyInt( &data, it->second.m_KO ); } } // スコアの保存 for( int j = 0; j < MAX_SCORE_ENTRY; ++j ){ SaveDataRecord record = m_GameFileData.m_Difficulty[ i ].m_Record[ j ]; CopyArray( &data, record.m_Name, sizeof( record.m_Name ) ); CopyInt( &data, record.m_Date.m_Year ); data.push_back( record.m_Date.m_Month ); data.push_back( record.m_Date.m_Day ); data.push_back( record.m_Date.m_Hour ); data.push_back( record.m_Date.m_Min ); data.push_back( record.m_Date.m_Sec ); for( int k = 0; k < STAGE_TOTAL; ++k ){ SaveDataRecord::StageData stage = record.m_StageData[ k ]; CopyInt( &data, stage.m_Score ); CopyInt( &data, stage.m_Killed ); CopyInt( &data, stage.m_Crystal ); CopyInt( &data, stage.m_CrystalUsed ); CopyInt( &data, stage.m_Progress ); } CopyInt( &data, record.m_Score ); CopyInt( &data, record.m_Progress ); CopyInt( &data, record.m_Killed ); CopyInt( &data, record.m_Crystal ); CopyInt( &data, record.m_CrystalUsed ); } } // 圧縮 char* pBuf = new char [ data.size() * 2 ]; int compSize = 0; MAPIL::LZ lz( 200, 3 ); lz.Compress( &data[ 0 ], data.size(), &pBuf, data.size() * 2, &compSize ); // シーザ暗号化 MAPIL::Caesar caesar( 10 ); caesar.Encrypt( pBuf, compSize ); // XOR暗号化 MAPIL::XOR xor( 60 ); xor.Encrypt( pBuf, compSize ); fOut.write( pBuf, compSize ); fOut.close(); MAPIL::SafeDeleteArray( pBuf ); }
void OnTimer(HWND hwnd) { if (g_bMoveTime) UpdatePlayTime(g_pPlayer->GetTime()); }