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

📄 advgroup.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    }

    if (!m_pPrefetchTrackMap)
    {
	m_pPrefetchTrackMap = new CHXMapLongToObj;
    }

    (*m_pPrefetchTrackMap)[uPrefetchIndex] = pTrack;
    pTrack->AddRef();

    m_uPrefetchTrackCount++;

    if (m_pPrefetchSinkList)
    {
	CHXSimpleList::Iterator ndx = m_pPrefetchSinkList->Begin();
	for (; ndx != m_pPrefetchSinkList->End(); ++ndx)
	{
	    IHXPrefetchSink* pPrefetchSink = (IHXPrefetchSink*) (*ndx);
	    pPrefetchSink->PrefetchTrackAdded(m_uGroupIndex, uPrefetchIndex, pTrack);
	}
    }

cleanup:

    HX_RELEASE(pPrefetch);

    return rc;
}

/************************************************************************
*  Method:
*      IHXPrefetch::RemovePrefetchTrack
*  Purpose:
*      removes prefetched track
*/
STDMETHODIMP
HXAdvancedGroup::RemovePrefetchTrack(UINT16 /*IN*/ uTrackIndex)
{
    HX_RESULT		rc = HXR_OK;
    int			i = 0;
    IHXValues*		pTrack = NULL;
    IHXValues*		pUpdateValues = NULL;
    CHXMapLongToObj*	pNewPrefetchTrackMap = NULL;

    if (!m_pPrefetchTrackMap)
    {
	rc = HXR_FAILED;
	goto cleanup;
    }

    if (!m_pPrefetchTrackMap->Lookup(uTrackIndex, (void*&)pTrack))
    {
	rc = HXR_FAILED;
	goto cleanup;
    }

    m_pPrefetchTrackMap->RemoveKey(uTrackIndex);

    if (HXR_OK != m_pPlayer->RemovePrefetchTrack(m_uGroupIndex, uTrackIndex, pTrack))
    {
	rc = HXR_FAILED;
	goto cleanup;
    }

    if (m_pPrefetchSinkList)
    {
	CHXSimpleList::Iterator ndx = m_pPrefetchSinkList->Begin();
	for (; ndx != m_pPrefetchSinkList->End(); ++ndx)
	{
	    IHXPrefetchSink* pPrefetchSink = (IHXPrefetchSink*) (*ndx);
	    pPrefetchSink->PrefetchTrackRemoved(m_uGroupIndex, uTrackIndex, pTrack);
	}
    }

    HX_RELEASE(pTrack);

    // adjust track map index
    pNewPrefetchTrackMap = new CHXMapLongToObj;
    for (i = 0; i < uTrackIndex; i++)
    {
	pTrack = (IHXValues*)(*m_pPrefetchTrackMap)[i];
	HX_ASSERT(pTrack);
	(*pNewPrefetchTrackMap)[i] = pTrack;
    }

    for (i = uTrackIndex + 1; i < m_uPrefetchTrackCount; i++)
    {
	pTrack = (IHXValues*)(*m_pPrefetchTrackMap)[i];	
	HX_ASSERT(pTrack);
	(*pNewPrefetchTrackMap)[i - 1] = pTrack;

	pUpdateValues = new CHXHeader;
	pUpdateValues->AddRef();

	pUpdateValues->SetPropertyULONG32("TrackIndex", i - 1);
	m_pPlayer->UpdatePrefetchTrack(m_uGroupIndex, i, pUpdateValues);

	HX_RELEASE(pUpdateValues);
    }
    HX_DELETE(m_pPrefetchTrackMap);

    m_pPrefetchTrackMap = pNewPrefetchTrackMap;
    m_uPrefetchTrackCount--;

cleanup:

    return rc;
}

/************************************************************************
*  Method:
*      IHXPrefetch::GetPrefetchTrackCount
*  Purpose:
*      get number of prefetch tracks added
*/
STDMETHODIMP_(UINT16)
HXAdvancedGroup::GetPrefetchTrackCount()
{
    return m_uPrefetchTrackCount;
}

/************************************************************************
*  Method:
*      IHXPrefetch::GetPrefetchTrack
*  Purpose:
*      get prefetch track based on the index
*/
STDMETHODIMP
HXAdvancedGroup::GetPrefetchTrack(UINT16            /*IN*/  uTrackIndex,
			          REF(IHXValues*)   /*OUT*/ pTrack)
{
    HX_RESULT	rc = HXR_OK;

    pTrack = NULL;

    if (!m_pPrefetchTrackMap)
    {
	rc = HXR_FAILED;
	goto cleanup;
    }

    if (!m_pPrefetchTrackMap->Lookup(uTrackIndex, (void*&)pTrack))
    {
	rc = HXR_FAILED;
	goto cleanup;
    }

cleanup:

    return rc;
}

/************************************************************************
*  Method:
*      IHXPrefetch::AddPrefetchSink
*  Purpose:
*      add prefetch sink
*/
STDMETHODIMP
HXAdvancedGroup::AddPrefetchSink(IHXPrefetchSink* /*IN*/ pSink)
{
    HX_RESULT	rc = HXR_OK;

    if (!pSink)
    {
	rc = HXR_FAILED;
	goto cleanup;
    }

    if (!m_pPrefetchSinkList)
    {
	m_pPrefetchSinkList = new CHXSimpleList;
    }

    m_pPrefetchSinkList->AddTail(pSink);
    pSink->AddRef();

cleanup:

    return rc;
}

/************************************************************************
*  Method:
*      IHXPrefetch::RemovePrefetchSink
*  Purpose:
*      remove prefetch sink
*/
STDMETHODIMP
HXAdvancedGroup::RemovePrefetchSink(IHXPrefetchSink* /*IN*/ pSink)
{
    HX_RESULT	    rc = HXR_OK;
    LISTPOSITION    lPosition = 0;

    if (!m_pPrefetchSinkList || !pSink)
    {
	rc = HXR_FAILED;
	goto cleanup;
    }

    lPosition = m_pPrefetchSinkList->Find(pSink);
    if (!lPosition)
    {
	rc = HXR_FAILED;
	goto cleanup;
    }

    m_pPrefetchSinkList->RemoveAt(lPosition);
    HX_RELEASE(pSink);
    
cleanup:

    return rc;
}

/************************************************************************
*  Method:
*	    IHXPrefetchSink::PrefetchTrackAdded()
*  Purpose:
*	    prefetch track is added
*/
STDMETHODIMP
HXAdvancedGroup::PrefetchTrackAdded(UINT16      uGroupIndex,
			            UINT16      uTrackIndex,
			            IHXValues*  pTrack)
{
    return HXR_OK;
}

/************************************************************************
*  Method:
*	    IHXPrefetchSink::PrefetchTrackRemoved()
*  Purpose:
*	    prefetch track is removed
*/
STDMETHODIMP
HXAdvancedGroup::PrefetchTrackRemoved(UINT16	    uGroupIndex,
			              UINT16        uTrackIndex,
			              IHXValues*    pTrack)
{
    return HXR_OK;
}

/************************************************************************
*  Method:
*	    IHXPrefetchSink::PrefetchTrackDone()
*  Purpose:
*	    prefetch track is done
*/
STDMETHODIMP
HXAdvancedGroup::PrefetchTrackDone(UINT16	uGroupIndex,
			           UINT16	uTrackIndex,			    
			           HX_RESULT	status)
{
    HX_RESULT	rc = HXR_OK;

    if (m_pPrefetchSinkList)
    {
	CHXSimpleList::Iterator ndx = m_pPrefetchSinkList->Begin();
	for (; ndx != m_pPrefetchSinkList->End(); ++ndx)
	{
	    IHXPrefetchSink* pPrefetchSink = (IHXPrefetchSink*) (*ndx);
	    pPrefetchSink->PrefetchTrackDone(uGroupIndex, uTrackIndex, status);
	}
    }

    return rc;
}
#endif /* HELIX_FEATURE_PREFETCH */

void
HXAdvancedGroup::Close(void)
{
    HXBasicGroup::Close();

    HX_RELEASE(m_pGroupProperties);

    IHXPrefetch*   pPrefetch = NULL;
    CHXMapLongToObj::Iterator i;
    CHXSimpleList::Iterator j;

    m_uPrefetchTrackCount = 0;

    if (m_pTrackSinkList)
    {
	CHXSimpleList::Iterator ndx = m_pTrackSinkList->Begin();
	for (; ndx != m_pTrackSinkList->End(); ++ndx)
	{
	    IHXTrackSink* pTrackSink = (IHXTrackSink*) (*ndx);
	    HX_RELEASE(pTrackSink);
	}
	HX_DELETE(m_pTrackSinkList);
    }

#if defined(HELIX_FEATURE_PREFETCH)
    if (m_pPrefetchTrackMap)
    {
	i = m_pPrefetchTrackMap->Begin();
	for(; i != m_pPrefetchTrackMap->End(); ++i)
	{
	    IHXValues* pTrack = (IHXValues*)(*i);
	    HX_RELEASE(pTrack);
	}
	HX_DELETE(m_pPrefetchTrackMap);
    }

    if (m_pPrefetchSinkList)
    {
	j = m_pPrefetchSinkList->Begin();
	for (; j != m_pPrefetchSinkList->End(); ++j)
	{
	    IHXPrefetchSink* pPrefetchSink = (IHXPrefetchSink*) (*j);
	    HX_RELEASE(pPrefetchSink);
	}
	HX_DELETE(m_pPrefetchSinkList);
    }

    if (m_bPrefetchSinkAdded)
    {
	if (HXR_OK == m_pPlayer->QueryInterface(IID_IHXPrefetch, (void**)&pPrefetch))
	{
	    pPrefetch->RemovePrefetchSink(this);
	    m_bPrefetchSinkAdded = FALSE;
	}
	HX_RELEASE(pPrefetch);
    }
#endif /* HELIX_FEATURE_PREFETCH */

    if (m_pPersistentComponentPropertyMap)
    {
	i = m_pPersistentComponentPropertyMap->Begin();
	for(; i != m_pPersistentComponentPropertyMap->End(); ++i)
	{
	    IHXValues* pValues = (IHXValues*)(*i);
	    HX_RELEASE(pValues);
	}
	HX_DELETE(m_pPersistentComponentPropertyMap);
    }
}

/*HXAdvancedGroupManager*/

HXAdvancedGroupManager::HXAdvancedGroupManager(HXPlayer* pPlayer)
                       :HXBasicGroupManager(pPlayer)
                       ,m_pMasterTAC(NULL)

{
}

HXAdvancedGroupManager::~HXAdvancedGroupManager(void)
{
    Close();
}

void HXAdvancedGroupManager::SetMasterTAC(HXMasterTAC* pMasterTAC)
{
    m_pMasterTAC = pMasterTAC;
    m_pMasterTAC->AddRef();
}

void
HXAdvancedGroupManager::PersistentComponentAdded(UINT16 uGroupIndex, UINT16 uTrackIndex)
{
    HXAdvancedGroup* pGroup = NULL;
    CHXSimpleList::Iterator ndx;

    if (HXR_OK == GetGroup(uGroupIndex, (IHXGroup*&)pGroup))
    {
	pGroup->PersistentComponentAdded(uTrackIndex);
    }
    HX_RELEASE(pGroup);

    return;
}

void 
HXAdvancedGroupManager::PersistentComponentRemoved(UINT16 uGroupIndex, UINT16 uTrackIndex)
{    
    HXAdvancedGroup* pGroup = NULL;
    CHXSimpleList::Iterator ndx;

    if (HXR_OK == GetGroup(uGroupIndex, (IHXGroup*&)pGroup))
    {
	pGroup->PersistentComponentRemoved(uTrackIndex);
    }

    return;
}

/*
 *  IHXGroupManager methods
 */

/************************************************************************
*  Method:
*      IHXGroupManager::CreateGroup
*  Purpose:
*		Create a group
*/
STDMETHODIMP
HXAdvancedGroupManager::CreateGroup(REF(IHXGroup*) pGroup)
{
    pGroup = new HXAdvancedGroup(this);
    if (!pGroup)
    {
	return HXR_OUTOFMEMORY;
    }
    
    pGroup->AddRef();

    return HXR_OK;
}

/************************************************************************
*  Method:
*      IHXGroupManager::AddGroup
*  Purpose:
*		Add a group to the presentation.
*/
STDMETHODIMP
HXAdvancedGroupManager::AddGroup(IHXGroup*	/*IN*/ pGroup)
{
    HX_RESULT	        theErr = HXR_OK;
    UINT16	        uInsertGroupAt = 0;
    UINT32	        ulLastGroupInRAM20 = 0;
    UINT32	        ulPersistentComponentID = 0;
    IHXValues*	        pGroupProperties = NULL;
    HXAdvancedTrack*    pHXTrack = NULL;
    IHXPersistentComponent* pPersistentComponent = NULL;
    HXPersistentComponentManager* pPersistentComponentManager = NULL;

    if (!pGroup)
    {
	return HXR_UNEXPECTED;
    }
    
    pGroupProperties = ((HXAdvancedGroup*)pGroup)->m_pGroupProperties;

#if defined(HELIX_FEATURE_NESTEDMETA)
    if (pGroupProperties)
    {
	if (HXR_OK != pGroupProperties->GetPropertyULONG32("LastGroupInRAM20", ulLastGroupInRAM20) &&
	    HXR_OK == pGroupProperties->GetPropertyULONG32("PersistentComponentID", ulPersistentComponentID))
	{
	    pPersistentComponentManager = m_pPlayer->m_pPersistentComponentManager;	
	    if (HXR_OK == pPersistentComponentManager->GetPersistentComponent(ulPersistentComponentID,
									      pPersistentComponent))
	    {
		((HXPersistentComponent*)pPersistentComponent)->m_uGroups++;
		uInsertGroupAt = ((HXPersistentComponent*)pPersistentComponent)->m_pSourceInfo->m_uGroupID +
				 ((HXPersistentComponent*)pPersistentComponent)->m_uGroups;

		theErr = InsertGroupAt(uInsertGroupAt, pGroup);
	    }
	    else
	    {
		HX_ASSERT(FALSE);
	    }
	}
	else
	{
	    HX_ASSERT(ulLastGroupInRAM20);
	    InsertGroupAt(m_uGroupCount, pGroup);
	}
    }
    else
#endif /* HELIX_FEATURE_NESTEDMETA */
    {
	InsertGroupAt(m_uGroupCount, pGroup);
    }
    
    HX_RELEASE(pPersistentComponent);

    return theErr;
}

/************************************************************************
*  Method:
*      IHXGroupManager::RemoveGroup
*  Purpose:
*		Remove an already added group
*/
STDMETHODIMP
HXAdvancedGroupManager::RemoveGroup(UINT16 	/*IN*/ uGroupIndex)
{
    HX_RESULT		theErr = HXR_OK;
    int			i = 0;
    CHXMapLongToObj*	pNewGroupMap = NULL;
    IHXGroup*		pHXGroupRemoved = NULL;
    IHXGroup*		pHXGroup = NULL;
    CHXSimpleList::Iterator ndx;

    if (!m_pGroupMap->Lookup(uGroupIndex, (void*&)pHXGroupRemoved))
    {
	theErr = HXR_UNEXPECTED;
	goto cleanup;
    }

    m_pGroupMap->RemoveKey(uGroupIndex);

    // adjust track map index
    pNewGroupMap = new CHXMapLongToObj;
    for (i = 0; i < uGroupIndex; i++)
    {
	m_pGroupMap->Lookup(i, (void*&)pHXGroup);
	HX_ASSERT(pHXGroup);

	(*pNewGroupMap)[i] = pHXGroup;
    }

    for (i = uGroupIndex + 1; i < m_uGroupCount; i++)
    {
	m_pGroupMap->Lookup(i, (void*&)pHXGroup);
	HX_ASSERT(pHXGroup);

	((HXAdvancedGroup*)pHXGroup)->m_uGroupIndex = i - 1;
	(*pNewGroupMap)[i - 1] = pHXGroup;
    }
    HX_DELETE(m_pGroupMap);

    m_pGroupMap = pNewGroupMap;
    m_uGroupCount--;
    
    ndx = m_pSinkList->Begin();
    for (; ndx != m_pSinkList->End(); ++ndx)
    {
	IHXGroupSink* pGroupSink = (IHXGroupSink*) (*ndx);
	pGroupSink->GroupRemoved(uGroupIndex, pHXGroupRemoved);
    }

cleanup:

    HX_RELEASE(pHXGroupRemoved);

    return theErr;
}    

STDMETHODIMP
HXAdvancedGroupManager::SetCurrentGroup(UINT16 uGroupIndex)
{
    HX_RESULT res = HXBasicGroupManager::SetCurrentGroup(uGroupIndex);

#if defined(HELIX_FEATURE_MASTERTAC)
    if (SUCCEEDED(res) && m_pMasterTAC)
    {
       // check for TAC info from new group
       m_pMasterTAC->ResetTAC(TRUE, TRUE); // reset status & clear master props
       m_pMasterTAC->CheckGroupForTACInfo(uGroupIndex);
    }
#endif // defined(HELIX_FEATURE_MASTERTAC)

    return res;
}

HX_RESULT	    
HXAdvancedGroupManager::RepeatTrackAdded(UINT16 uGroupIndex, UINT16 uTrackIndex, IHXValues* pTrack)
{
    return m_pPlayer->RepeatTrackAdded(uGroupIndex, uTrackIndex, pTrack);
}

void
HXAdvancedGroupManager::Close(void)
{
    HX_RELEASE(m_pMasterTAC);
    HXBasicGroupManager::Close();
}

⌨️ 快捷键说明

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