예제 #1
0
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);
}
예제 #2
0
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);
	    }
	}
    }
}
예제 #3
0
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);
}
예제 #4
0
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);
}
예제 #5
0
	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 );
	}
예제 #6
0
void OnTimer(HWND hwnd)
{
	if (g_bMoveTime)
		UpdatePlayTime(g_pPlayer->GetTime());
}