⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hxsrc.cpp

📁 symbian 下的helix player源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    /* 
     * Make sure that the we have not been re-directed
     * to a new URL.
     */ 
    if (m_pRequest && 
	m_pRequest->GetURL(pURL) == HXR_OK &&
	pURL)
    {
	if (!m_pszURL ||
	    ::strcasecmp(pURL, m_pszURL) != 0)
	{
	    HX_VECTOR_DELETE(m_pszURL);
	    m_pszURL = new char[strlen(pURL) + 1];
	    strcpy(m_pszURL, pURL); /* Flawfinder: ignore */
	}
    }

    // append RAM mimeType as URL option to notify the
    // caller(i.e. ViewSource)
    if (m_bIsMeta)
    {
	char* pszTemp = NULL;

	pszTemp = ::HXFindChar(m_pszURL, '?');
	if (pszTemp)
	{
		int lenTemp = strlen(m_pszURL) + strlen("&mimeType=") + strlen(RAM_MIMETYPE) + 1;
	    pszTemp = new char[lenTemp];
	    SafeSprintf(pszTemp, lenTemp, "%s%s%s", m_pszURL, "&mimeType=", RAM_MIMETYPE); /* Flawfinder: ignore */
	}
	else
	{
		int lenTemp = strlen(m_pszURL) + strlen("?mimeType=") + strlen(RAM_MIMETYPE) + 1;
	    pszTemp = new char[lenTemp];
	    SafeSprintf(pszTemp, lenTemp, "%s%s%s", m_pszURL, "?mimeType=", RAM_MIMETYPE); /* Flawfinder: ignore */
	}

	HX_VECTOR_DELETE(m_pszURL);
	m_pszURL = pszTemp;
    }

    return m_pszURL;
}


/************************************************************************
 *	Method:
 *	    IHXStreamSource::GetStreamCount
 *	Purpose:
 *	    Get the number of streams in this source
 *
 */
STDMETHODIMP_(UINT16)
HXSource::GetStreamCount()
{
    return m_HXStreamList.GetCount();
}


/************************************************************************
 *	Method:
 *	    IHXStreamSource::GetStream
 *	Purpose:
 *	    Get the stream with the given index.
 *	Note: 
 *	    Since stream numbers may not be zero based, stream index is not
 *	    equal to the stream number. Actual stream number may be determined 
 *	    from IHXStream::GetStreamNumber()
 *
 */
STDMETHODIMP
HXSource::GetStream
(
    UINT16 nIndex,
    REF(IUnknown*) pUnknown
)
{
    LISTPOSITION lPosition = m_HXStreamList.FindIndex((int) nIndex);
    if (!lPosition)
    {
	pUnknown = NULL;
	return HXR_INVALID_PARAMETER;
    }

    HXStream* pStream = (HXStream*) m_HXStreamList.GetAt(lPosition);
    HX_ASSERT(pStream);

    return pStream->QueryInterface(IID_IUnknown,(void**)&pUnknown);
}


// IHXPrivateStreamSource methods 
STDMETHODIMP_(BOOL) HXSource::IsSaveAllowed()
{
    return mSaveAsAllowed;
}


/*
 * IHXBackChannel method
 */

/************************************************************************
 *	Method:
 *	    IHXBackChannel::PacketReady
 *	Purpose:
 *      A back channel packet sent from Renderer to FileFormat plugin.
 */
STDMETHODIMP
HXSource::PacketReady(IHXPacket* pPacket)
{
    HX_ASSERT(m_pBackChannel);

    if (m_pBackChannel)
    {
	return m_pBackChannel->PacketReady(pPacket);
    }

    return HXR_FAIL;
}


/*
 * IHXASMSource methods
 */

/************************************************************************
 *	Method:
 *	    IHXASMSource::Subscribe
 *	Purpose:
 *      Called to inform a file format that a subscription has occurred,
 *	    to rule number uRuleNumber, for stream uStreamNumber.
 */
STDMETHODIMP
HXSource::Subscribe(UINT16	uStreamNumber,
		     UINT16	uRuleNumber)
{
    HX_ASSERT(m_pASMSource);

    if (m_pASMSource)
    {
	return m_pASMSource->Subscribe(uStreamNumber, uRuleNumber);
    }

    return HXR_FAIL;
}

/************************************************************************
 *	Method:
 *	    IHXASMSource::Unsubscribe
 *	Purpose:
 *      Called to inform a file format that a unsubscription has occurred,
 *	    to rule number uRuleNumber, for stream uStreamNumber.
 */
STDMETHODIMP
HXSource::Unsubscribe(UINT16	uStreamNumber,
		       UINT16	uRuleNumber)
{
    HX_ASSERT(m_pASMSource);

    if (m_pASMSource)
    {
	return m_pASMSource->Unsubscribe(uStreamNumber, uRuleNumber);
    }

    return HXR_FAIL;
}

void	
HXSource::AddHXStream(HXStream* pStream)
{
    pStream->AddRef();
    m_HXStreamList.AddTail(pStream);

    UINT16 uStreamNumber = pStream->GetStreamNumber();
    STREAM_INFO* pStreamInfo;
    if (mStreamInfoTable->Lookup((LONG32) uStreamNumber, (void*& )pStreamInfo))
    {
	pStreamInfo->m_pStream = pStream;
	pStreamInfo->m_pStream->AddRef();

	pStreamInfo->BufferingState().OnStream((IHXStream*)pStream);
    }
}

HX_RESULT
HXSource::CollectAudioStreams(CHXSimpleList*& pAudioStreamList)
{
#if defined(HELIX_FEATURE_ADVANCEDGROUPMGR)
    HX_RESULT	    rc = HXR_OK;
    UINT16	    i = 0;
    UINT16	    uNumAudioStreams = 0;
    CHXAudioPlayer* pAudioPlayer = NULL;
    CHXAudioStream* pCHXAudioStream = NULL;
    IHXValues*	    pHeader = NULL;

    pAudioStreamList = NULL;

    if (!m_pPlayer)
    {
	goto cleanup;
    }

    pAudioPlayer = m_pPlayer->GetAudioPlayer();
    if (!pAudioPlayer)
    {
	goto cleanup;
    }

    uNumAudioStreams = pAudioPlayer->GetAudioStreamCount();
    for (i = 0; i < uNumAudioStreams; i++)
    {
	pCHXAudioStream = pAudioPlayer->GetCHXAudioStream(i);
	pCHXAudioStream->AddRef();

	pHeader = ((IHXAudioStream*)pCHXAudioStream)->GetStreamInfo();

	if (pHeader &&
	    IsAudioStreamFromThisSource(pHeader))
	{
	    if (!pAudioStreamList)
	    {
		pAudioStreamList = new CHXSimpleList();
	    }

	    pAudioStreamList->AddTail(pCHXAudioStream);
	}
	else
	{
	    HX_RELEASE(pCHXAudioStream);
	}
	HX_RELEASE(pHeader);	
    }

cleanup:

    if (!pAudioStreamList)
    {	 
	rc = HXR_FAILED;
    }

    return rc;
#else
    return HXR_NOTIMPL;
#endif /* HELIX_FEATURE_ADVANCEDGROUPMGR */
}

void		
HXSource::RemoveAudioStreams(void)
{    
#if defined(HELIX_FEATURE_ADVANCEDGROUPMGR)
    CHXAudioPlayer* pAudioPlayer = NULL;
    CHXSimpleList*  pAudioStreamList = NULL;

    if (!m_pPlayer)
    {
	goto cleanup;
    }

    pAudioPlayer = m_pPlayer->GetAudioPlayer();
    if (!pAudioPlayer)
    {
	goto cleanup;
    }

    pAudioPlayer->AddRef();

    if (HXR_OK == CollectAudioStreams(pAudioStreamList) && pAudioStreamList)
    {
	pAudioPlayer->ManageAudioStreams(pAudioStreamList, CHXAudioPlayer::STR_REMOVE);

	ReleaseAudioStreams(pAudioStreamList);
	HX_DELETE(pAudioStreamList);
    }

    HX_RELEASE(pAudioPlayer);

cleanup:
#endif /* HELIX_FEATURE_ADVANCEDGROUPMGR */

    return;
}

void
HXSource::PauseAudioStreams(void)
{
#if defined(HELIX_FEATURE_ADVANCEDGROUPMGR)
    CHXAudioPlayer* pAudioPlayer = NULL;
    CHXSimpleList*  pAudioStreamList = NULL;

    if (!m_pPlayer)
    {
	goto cleanup;
    }

    pAudioPlayer = m_pPlayer->GetAudioPlayer();
    if (!pAudioPlayer)
    {
	goto cleanup;
    }

    pAudioPlayer->AddRef();

    if (HXR_OK == CollectAudioStreams(pAudioStreamList) && pAudioStreamList)
    {
	pAudioPlayer->ManageAudioStreams(pAudioStreamList, CHXAudioPlayer::STR_PAUSE);

	ReleaseAudioStreams(pAudioStreamList);
	HX_DELETE(pAudioStreamList);
    }

    HX_RELEASE(pAudioPlayer);

cleanup:
#endif /* HELIX_FEATURE_ADVANCEDGROUPMGR */

    return;
}

void
HXSource::ResumeAudioStreams(void)
{
#if defined(HELIX_FEATURE_ADVANCEDGROUPMGR)
    CHXAudioPlayer* pAudioPlayer = NULL;
    CHXSimpleList*  pAudioStreamList = NULL;

    if (!m_pPlayer)
    {
	goto cleanup;
    }

    pAudioPlayer = m_pPlayer->GetAudioPlayer();
    if (!pAudioPlayer)
    {
	goto cleanup;
    }

    pAudioPlayer->AddRef();

    if (HXR_OK == CollectAudioStreams(pAudioStreamList) && pAudioStreamList)
    {
	pAudioPlayer->ManageAudioStreams(pAudioStreamList, CHXAudioPlayer::STR_RESUME);

	ReleaseAudioStreams(pAudioStreamList);
	HX_DELETE(pAudioStreamList);
    }

    HX_RELEASE(pAudioPlayer);

cleanup:
#endif /* HELIX_FEATURE_ADVANCEDGROUPMGR */

    return;
}

void
HXSource::ReleaseAudioStreams(CHXSimpleList* pAudioStreamList)
{
#if defined(HELIX_FEATURE_ADVANCEDGROUPMGR)
    if (pAudioStreamList && !pAudioStreamList->IsEmpty())
    {
	CHXSimpleList::Iterator lIter = pAudioStreamList->Begin();
	for (; lIter != pAudioStreamList->End(); ++lIter)
	{
	    CHXAudioStream* pAudioStream = (CHXAudioStream*) (*lIter);
	    HX_RELEASE(pAudioStream);
	}
    }
#endif /* HELIX_FEATURE_ADVANCEDGROUPMGR */

    return;
}

HX_RESULT HXSource::Init(HXPlayer * pPlayer, UINT32 unRegistryID)
{
    HX_RESULT	theErr = HXR_OK;
   
    m_pPlayer = pPlayer;
    if (m_pPlayer->QueryInterface(IID_IHXPreferences, (void **) &m_pPreferences) != HXR_OK)
    {
	theErr = HXR_INVALID_PARAMETER;	//HX_INVALID_INTERFACE;
    }

    m_pBufferManager = new CBufferManager(this);
    if(!m_pBufferManager)
    {
        theErr = HXR_OUTOFMEMORY;
    }

    // create registry entries
    if (HXR_OK != m_pPlayer->QueryInterface(IID_IHXRegistry, (void**)&m_pRegistry))
    {
	m_pRegistry = NULL;
    }
    else
    {
	m_ulRegistryID = unRegistryID;
    }

    if (!theErr &&
	m_pPlayer->QueryInterface(IID_IHXScheduler, (void **) &m_pScheduler) != HXR_OK)
    {
	theErr = HXR_INVALID_PARAMETER;	//HX_INVALID_INTERFACE;
    }

    IHXPreferences* pPref = NULL;

    m_pPlayer->QueryInterface(IID_IHXPreferences, (void**)&pPref);
    if (HXR_OK == ReadPrefINT32(pPref, "TurboPushdown", m_ulTurboPushDown))
    {
	m_ulTurboPushDown = (m_ulTurboPushDown / 100) * 100;  // round to multiple of 100
    }
    HX_RELEASE(pPref);

    m_pEngine = m_pPlayer->m_pEngine;
    m_pEngine->AddRef();

    return theErr;
}

HX_RESULT HXSource::SetupRegistry()
{
    HX_RESULT	theErr = HXR_OK;
#if defined(HELIX_FEATURE_STATS) && defined(HELIX_FEATURE_REGISTRY)
    UINT32	ulRepeatedRegistryID = 0;
    IHXBuffer*	pRepeatRegName = NULL;
    char        szSourceName[MAX_DISPLAY_NAME] = {0}; /* Flawfinder: ignore */

    HX_ASSERT(m_pSourceInfo);    

    if (m_pSourceInfo->m_bLeadingSource &&
	!m_pSourceInfo->m_pRepeatList)
    {
	m_pStats = new SOURCE_STATS(m_pRegistry, m_ulRegistryID);
    }
    else if (m_pRegistry && 
	    HXR_OK == m_pRegistry->GetPropName(m_pPlayer->m_ulRepeatedRegistryID, pRepeatRegName))
    {
	SafeSprintf(szSourceName, MAX_DISPLAY_NAME, "%s.%ld%ld%ld", 
		pRepeatRegName->GetBuffer(),
		m_pSourceInfo->m_uGroupID,
		m_pSourceInfo->m_uTrackID,
		(int)m_pSourceInfo->m_bLeadingSource);
    
	ulRepeatedRegistryID = m_pRegistry->GetId(szSourceName);
	if (!ulRepeatedRegistryID)
	{
	    ulRepeatedRegistryID = m_pRegistry->AddComp(szSourceName);
	}

	m_pStatsManager = new StatsManager(m_pRegistry, m_ulRegistryID, ulRepeatedRegistryID);
	m_pStatsManager->AddRef();

	m_pStats = new SOURCE_STATS(m_pRegistry, ulRepeatedRegistryID);
        if( !m_pStats )
        {
            theErr = HXR_OUTOFMEMORY;
        }
    }
    else
    {
	// why stats' creation failed??
	HX_ASSERT(FALSE);
    }

    HX_RELEASE(pRepeatRegName);
#endif /* HELIX_FEATURE_STATS && HELIX_FEATURE_REGISTRY */

    return theErr;
}

HX_RESULT HXSource::ReadPreferences(void)
{
    UINT32      un16Temp = 10;

    ReadPrefINT32(m_pPreferences, "PerfectPlayTime", un16Temp); 
    m_ulPerfectPlayTime = un16Temp;

    ReadPrefINT32(m_pPreferences, "BufferedPlayTime", un16Temp);
    m_ulBufferedPlayTime = un16Temp;

    ReadPrefBOOL(m_pPreferences, "PerfPlayEntireClip", m_bPerfectPlayEntireClip); 

    return HXR_OK;
}


HX_RESULT HXSource::DeleteStreamTable(void)
{
    HX_RESULT theErr = HXR_OK;

    STREAM_INFO	* sInfo = NULL;
	
    for (CHXMapLongToObj::Iterator i = mStreamInfoTable->Begin();
         i != mStreamInfoTable->End(); ++i) 
    {    
	sInfo = (STREAM_INFO*) (*i);
	
	if (sInfo)
	{
	    HX_DELETE (sInfo);
	}
    }

    mStreamInfoTable->RemoveAll();
    m_ulStreamIndex = 0;
    m_uNumStreams = 0;
    
    return theErr;
}	


IHXValues* HXSource::GetHeaderInfo(UINT16 stream_number)
{
    STREAM_INFO	* pStreamInfo;
    if (mStreamInfoTable->Lookup((LONG32) stream_number, (void*& )pStreamInfo))
    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -