📄 advgroup.cpp
字号:
if (HXR_OK != rc) { goto cleanup; } 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*/STDMETHODIMPHXAdvancedGroup::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*/STDMETHODIMPHXAdvancedGroup::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*/STDMETHODIMPHXAdvancedGroup::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*/STDMETHODIMPHXAdvancedGroup::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*/STDMETHODIMPHXAdvancedGroup::PrefetchTrackAdded(UINT16 uGroupIndex, UINT16 uTrackIndex, IHXValues* pTrack){ return HXR_OK;}/************************************************************************* Method:* IHXPrefetchSink::PrefetchTrackRemoved()* Purpose:* prefetch track is removed*/STDMETHODIMPHXAdvancedGroup::PrefetchTrackRemoved(UINT16 uGroupIndex, UINT16 uTrackIndex, IHXValues* pTrack){ return HXR_OK;}/************************************************************************* Method:* IHXPrefetchSink::PrefetchTrackDone()* Purpose:* prefetch track is done*/STDMETHODIMPHXAdvancedGroup::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 */voidHXAdvancedGroup::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();}voidHXAdvancedGroupManager::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*/STDMETHODIMPHXAdvancedGroupManager::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.*/STDMETHODIMPHXAdvancedGroupManager::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*/STDMETHODIMPHXAdvancedGroupManager::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;} STDMETHODIMPHXAdvancedGroupManager::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);}voidHXAdvancedGroupManager::Close(void){ HX_RELEASE(m_pMasterTAC); HXBasicGroupManager::Close();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -