コード例 #1
0
ファイル: basicpcktflow.cpp プロジェクト: muromec/qtopia-ezx
void
BasicPacketFlow::Play(BOOL bWouldBlock)
{
    // If this play is not really going to unpause us, becuase the other
    // pause is still in effect, then do nothing.
    if ((bWouldBlock && m_bPaused) || (!bWouldBlock && m_ulWouldBlocking))
	return;

    BOOL bInitialPlayReceived = m_bInitialPlayReceived;
    BOOL bWasPaused           = IsPaused();

    if (m_bIsMulticast)
	return;

    if (m_bInSeek)
    {
	m_bPlayPendingOnSeek = TRUE;
	return;
    }

    HX_ASSERT(m_uFirstStreamRegistered != 0xFFFF);
    if (m_pStreams[m_uFirstStreamRegistered].m_pTransport->isNullSetup())
	return;

    if (m_bAutoSubscription && !m_bSubscribed)
    {
    	// subscribe to all rules...
    	PacketStream* pStream = 0;
    	for (UINT16 unStreamNum = 0;
             unStreamNum < m_unStreamCount;
             unStreamNum++)
    	{
    	    pStream = &m_pStreams[unStreamNum];
	    if (!pStream->m_bStreamRegistered)
	    {
		continue;
	    }
    	    for (INT32 lRuleNumber = 0;
                 lRuleNumber < pStream->m_lNumRules;
                 lRuleNumber++)
    	    {    
    		HandleSubscribe(lRuleNumber, unStreamNum);
	    }
	}	
    }

    HandleTimeLineStateChange(TRUE);
    m_bInitialSubscriptionDone = TRUE; // It better be done by now!

    if (!bWouldBlock)
    {
        // can we get multiple PLAYs ?
        if (m_bPaused || !bInitialPlayReceived)
        {
            HXTimeval hxt = m_pAccurateClock->GetTimeOfDay();
            m_tvRTSPPlayTime.tv_sec = hxt.tv_sec;
            m_tvRTSPPlayTime.tv_usec = hxt.tv_usec;
        }
	m_bPaused = FALSE;
    }

    if (bWasPaused)
    {
        HandleResume();
    }

    m_pFlowMgr->RecalcConstantBitRate();

    if (m_pRateManager)
    {
	IHXPacketFlowControl* pRateMgrFlowControl = NULL;
	if (HXR_OK == m_pRateManager->QueryInterface(IID_IHXPacketFlowControl,
						     (void**)&pRateMgrFlowControl))
	{
	    pRateMgrFlowControl->Play();
	    HX_RELEASE(pRateMgrFlowControl);
	}
    }

    InitialStartup();
 
    if (!m_bInitialPlayReceived)
    {
	m_bInitialPlayReceived = TRUE;

	// Until now, we have not added the bandwidth for this Flow to
	// the overall total, because we didn't know if the content was
	// being served from a downstream cache. Now, we know that's not
	// the case because the RealProxy wouldn't send a play request.
	m_pFlowMgr->CommitPendingBandwidth();

	// Tell the bandwidth calculators to commit their bandwidth as well
	for (UINT16 n = 0; n < m_unStreamCount; n++)
	{
	    if (m_pStreams[n].m_bStreamRegistered)
	    {
		m_pStreams[n].CommitPendingBandwidth();
	    }
	}
    }

 
    return;
}
コード例 #2
0
ファイル: DisplayTimer.cpp プロジェクト: emoose/lithtech
bool DisplayTimer::OnTrigger(HOBJECT hSender, const CParsedMsg &cMsg)
{
	static CParsedMsg::CToken s_cTok_Start("START");
	static CParsedMsg::CToken s_cTok_On("ON");
	static CParsedMsg::CToken s_cTok_Add("ADD");
	static CParsedMsg::CToken s_cTok_End("END");
	static CParsedMsg::CToken s_cTok_Off("OFF");
	static CParsedMsg::CToken s_cTok_Kill("KILL");
	static CParsedMsg::CToken s_cTok_Pause("PAUSE");
	static CParsedMsg::CToken s_cTok_Resume("RESUME");
	static CParsedMsg::CToken s_cTok_Team("TEAM");

	if ((cMsg.GetArg(0) == s_cTok_Start) ||
		(cMsg.GetArg(0) == s_cTok_On))
	{
		if (cMsg.GetArgCount() > 1)
		{
            HandleStart((LTFLOAT)atof(cMsg.GetArg(1)));
		}
	}
	else if (cMsg.GetArg(0) == s_cTok_Add)
	{
		if (cMsg.GetArgCount() > 1)
		{
            HandleAdd((LTFLOAT)atof(cMsg.GetArg(1)));
		}
	}
	else if ((cMsg.GetArg(0) == s_cTok_End) ||
			 (cMsg.GetArg(0) == s_cTok_Off))
	{
		HandleEnd();
	}
	else if (cMsg.GetArg(0) == s_cTok_Kill)
	{
		HandleAbort();
	}
	else if (cMsg.GetArg(0) == s_cTok_Pause)
	{
		HandlePause();
	}
	else if (cMsg.GetArg(0) == s_cTok_Resume)
	{
		HandleResume();
	}
	else if (cMsg.GetArg(0) == s_cTok_Team)
	{
		if( cMsg.GetArgCount( ) > 1 )
		{
			uint32 nTeamId = atoi( cMsg.GetArg( 1 ));
			if( nTeamId < MAX_TEAMS )
			{
				m_nTeamId = nTeamId;
			}
			else
			{
				m_nTeamId = INVALID_TEAM;
			}

			UpdateClients( );
		}
	}
	else
		return GameBase::OnTrigger(hSender, cMsg);

	return true;
}