📄 advgroup.cpp
字号:
HXAdvancedGroup::SetPersistentComponentProperties(UINT32 /*IN*/ ulPersistentComponentID, IHXValues* /*IN*/ pProperties){ HX_RESULT rc = HXR_OK; IHXValues* pValues = NULL; if (!pProperties) { rc = HXR_FAILED; goto cleanup; } if (!m_pPersistentComponentPropertyMap) { m_pPersistentComponentPropertyMap = new CHXMapLongToObj; } if (!m_pPersistentComponentPropertyMap->Lookup(ulPersistentComponentID, (void*&)pValues)) { (*m_pPersistentComponentPropertyMap)[ulPersistentComponentID] = pProperties; pProperties->AddRef(); }cleanup: return rc;}/************************************************************************* Method:* IHXGroup2::GetPersistentComponentProperties* Purpose:* Get any persistent component specific information associated with * the group.* One group may contain multiple persistent components*/STDMETHODIMPHXAdvancedGroup::GetPersistentComponentProperties(UINT32 /*IN*/ ulPersistentComponentID, REF(IHXValues*) /*OUT*/ pProperties){ HX_RESULT rc = HXR_OK; pProperties = NULL; if (m_pPersistentComponentPropertyMap && m_pPersistentComponentPropertyMap->Lookup(ulPersistentComponentID, (void*&)pProperties)) { pProperties->AddRef(); } else { rc = HXR_FAILED; } return rc;}/************************************************************************* Method:* IHXGroup2::GetTrack2* Purpose:* Get ith track in this group*/STDMETHODIMPHXAdvancedGroup::GetTrack2(UINT16 /*IN*/ uTrackIndex, REF(IHXValues*) /*OUT*/ pTrack, REF(IHXValues*) /*OUT*/ pTrackPropInRequest){ return DoGetTrack(uTrackIndex, pTrack, pTrackPropInRequest);}STDMETHODIMPHXAdvancedGroup::AddTrack(IHXValues* /*IN*/ pTrack){ HX_RESULT rc = HXR_OK; HXAdvancedTrack* pHXTrack = new HXAdvancedTrack(this); pHXTrack->AddRef(); rc = DoAddTrack(pTrack, NULL, pHXTrack); if (HXR_OK != rc) { HX_RELEASE(pHXTrack); } return rc;}/************************************************************************* Method:* IHXGroup2::AddTrack2* Purpose:* Add Tracks to the group, including the props set in RequestHeader*/STDMETHODIMPHXAdvancedGroup::AddTrack2(IHXValues* /*IN*/ pTrack, IHXValues* /*IN*/ pTrackPropInRequest){ HX_RESULT rc = HXR_OK; HXAdvancedTrack* pHXTrack = new HXAdvancedTrack(this); pHXTrack->AddRef(); rc = DoAddTrack(pTrack, pTrackPropInRequest, pHXTrack); if (HXR_OK != rc) { HX_RELEASE(pHXTrack); } return rc;}/************************************************************************* Method:* IHXGroup::RemoveTrack* Purpose:* Remove an already added track*/STDMETHODIMPHXAdvancedGroup::RemoveTrack(UINT16 /*IN*/ uTrackIndex){ HX_RESULT theErr = HXR_OK; int i = 0; IHXValues* pValues = NULL; IHXValues* pValuesInRequest = NULL; IHXValues* pUpdateValues = NULL; CHXMapLongToObj* pNewTrackMap = NULL; HXAdvancedTrack* pHXTrackRemoved = NULL; HXAdvancedTrack* pHXTrack = NULL; if (!m_pTrackMap->Lookup(uTrackIndex, (void*&)pHXTrackRemoved)) { theErr = HXR_UNEXPECTED; goto cleanup; } m_pTrackMap->RemoveKey(uTrackIndex); pHXTrackRemoved->GetTrackProperties(pValues, pValuesInRequest); HX_ASSERT(pValues); HX_ASSERT(m_pPlayer); if (HXR_OK != m_pPlayer->RemoveTrack(m_uGroupIndex, uTrackIndex, pValues)) { theErr = HXR_UNEXPECTED; goto cleanup; } if (m_bToNotifyTrack) { theErr = m_pGroupManager->TrackRemoved(m_uGroupIndex, uTrackIndex, pValues); } // adjust track map index pNewTrackMap = new CHXMapLongToObj; for (i = 0; i < uTrackIndex; i++) { m_pTrackMap->Lookup(i, (void*&)pHXTrack); HX_ASSERT(pHXTrack); (*pNewTrackMap)[i] = pHXTrack; } for (i = uTrackIndex + 1; i < m_uTrackCount; i++) { m_pTrackMap->Lookup(i, (void*&)pHXTrack); HX_ASSERT(pHXTrack); pHXTrack->m_uTrackIndex = i - 1; (*pNewTrackMap)[i - 1] = pHXTrack; pUpdateValues = new CHXHeader; pUpdateValues->AddRef(); pUpdateValues->SetPropertyULONG32("TrackIndex", i - 1); m_pPlayer->UpdateTrack(m_uGroupIndex, i, pUpdateValues); HX_RELEASE(pUpdateValues); } HX_DELETE(m_pTrackMap); m_pTrackMap = pNewTrackMap; m_uTrackCount--; cleanup: HX_RELEASE(pValues); HX_RELEASE(pValuesInRequest); HX_RELEASE(pHXTrackRemoved); return theErr;}HX_RESULTHXAdvancedGroup::BeginTrack(UINT16 /*IN*/ uTrackIndex, IHXValues* /*IN*/ pTrack){ HX_RESULT theErr = HXR_OK; HX_ASSERT(m_pPlayer); theErr = m_pPlayer->BeginTrack(m_uGroupIndex, uTrackIndex, pTrack); if (m_pTrackSinkList) { CHXSimpleList::Iterator ndx = m_pTrackSinkList->Begin(); for (; ndx != m_pTrackSinkList->End(); ++ndx) { IHXTrackSink* pTrackSink = (IHXTrackSink*) (*ndx); pTrackSink->BeginDone(m_uGroupIndex, uTrackIndex); } } return theErr;}HX_RESULTHXAdvancedGroup::PauseTrack(UINT16 /*IN*/ uTrackIndex, IHXValues* /*IN*/ pTrack){ HX_RESULT theErr = HXR_OK; HX_ASSERT(m_pPlayer); theErr = m_pPlayer->PauseTrack(m_uGroupIndex, uTrackIndex, pTrack); if (m_pTrackSinkList) { CHXSimpleList::Iterator ndx = m_pTrackSinkList->Begin(); for (; ndx != m_pTrackSinkList->End(); ++ndx) { IHXTrackSink* pTrackSink = (IHXTrackSink*) (*ndx); pTrackSink->PauseDone(m_uGroupIndex, uTrackIndex); } } return theErr;}HX_RESULTHXAdvancedGroup::SeekTrack(UINT16 /*IN*/ uTrackIndex, IHXValues* /*IN*/ pTrack, UINT32 /*IN*/ ulSeekTime){ HX_RESULT theErr = HXR_OK; HX_ASSERT(m_pPlayer); theErr = m_pPlayer->SeekTrack(m_uGroupIndex, uTrackIndex, pTrack, ulSeekTime); if (m_pTrackSinkList) { CHXSimpleList::Iterator ndx = m_pTrackSinkList->Begin(); for (; ndx != m_pTrackSinkList->End(); ++ndx) { IHXTrackSink* pTrackSink = (IHXTrackSink*) (*ndx); pTrackSink->SeekDone(m_uGroupIndex, uTrackIndex, ulSeekTime); } } return theErr;}HX_RESULTHXAdvancedGroup::StopTrack(UINT16 /*IN*/ uTrackIndex, IHXValues* /*IN*/ pTrack){ HX_RESULT theErr = HXR_OK; HX_ASSERT(m_pPlayer); theErr = m_pPlayer->StopTrack(m_uGroupIndex, uTrackIndex, pTrack); if (m_pTrackSinkList) { CHXSimpleList::Iterator ndx = m_pTrackSinkList->Begin(); for (; ndx != m_pTrackSinkList->End(); ++ndx) { IHXTrackSink* pTrackSink = (IHXTrackSink*) (*ndx); pTrackSink->StopDone(m_uGroupIndex, uTrackIndex); } } return theErr;}HX_RESULT HXAdvancedGroup::GetSource(UINT16 uTrackIndex, IHXStreamSource*& pStreamSource){ SourceInfo* pSourceInfo = NULL; pStreamSource = NULL; HX_ASSERT(m_pPlayer); if (HXR_OK == m_pPlayer->GetSourceInfo(m_uGroupIndex, uTrackIndex, pSourceInfo) && pSourceInfo) { return pSourceInfo->m_pSource->QueryInterface(IID_IHXStreamSource, (void**)&pStreamSource); } return HXR_FAILED;}HX_RESULTHXAdvancedGroup::SetSoundLevel(UINT16 /*IN*/ uTrackIndex, UINT16 /*IN*/ uSoundLevel, BOOL /*IN*/ bReflushAudioDevice){ HX_RESULT theErr = HXR_OK; HX_ASSERT(m_pPlayer); theErr = m_pPlayer->SetSoundLevel(m_uGroupIndex, uTrackIndex, uSoundLevel, bReflushAudioDevice); return theErr;}HX_RESULTHXAdvancedGroup::BeginSoundLevelAnimation(UINT16 uTrackIndex, UINT16 uSoundLevelBeginWith){ HX_RESULT rc = HXR_OK; CHXAudioPlayer* pAudioPlayer = NULL; HXAdvancedTrack* pHXTrack = NULL; HX_ASSERT(m_pPlayer); if ((pAudioPlayer = m_pPlayer->GetAudioPlayer()) && m_pTrackMap->Lookup(uTrackIndex, (void*&)pHXTrack)) { pAudioPlayer->ActualAddPostMixHook((IHXAudioHook*)pHXTrack, 0, 1); m_pPlayer->SetSoundLevel(m_uGroupIndex, uTrackIndex, uSoundLevelBeginWith, TRUE); } return rc;}HX_RESULTHXAdvancedGroup::EndSoundLevelAnimation(UINT16 uTrackIndex, UINT16 uSoundLevelEndWith){ HX_RESULT theErr = HXR_OK; CHXAudioPlayer* pAudioPlayer = NULL; HXAdvancedTrack* pHXTrack = NULL; HX_ASSERT(m_pPlayer); if ((pAudioPlayer = m_pPlayer->GetAudioPlayer()) && m_pTrackMap->Lookup(uTrackIndex, (void*&)pHXTrack)) { pAudioPlayer->ActualRemovePostMixHook((IHXAudioHook*)pHXTrack); m_pPlayer->SetSoundLevel(m_uGroupIndex, uTrackIndex, uSoundLevelEndWith, FALSE); } return theErr;}HX_RESULTHXAdvancedGroup::OnSoundLevelAnimation(UINT16 uTrackIndex, UINT16 uSoundLevel, UINT32 ulSoundLevelAnimationTime){ HX_RESULT theErr = HXR_OK; if (m_pTrackSinkList) { CHXSimpleList::Iterator ndx = m_pTrackSinkList->Begin(); for (; ndx != m_pTrackSinkList->End(); ++ndx) { IHXTrackSink* pTrackSink = (IHXTrackSink*) (*ndx); pTrackSink->OnSoundLevelAnimation(m_uGroupIndex, uTrackIndex, ulSoundLevelAnimationTime); } } return theErr;}voidHXAdvancedGroup::PersistentComponentAdded(UINT16 uTrackIndex){ HXAdvancedTrack* pPersistentHXTrack = NULL; // XXX HP we don't actually remove the track in order // to preserve the group/track ID of subsequent sources // Need more work on RemoveTrack() so that all the group/ // track ID get updated across the board(esp. in persistent // renderers)!! if (m_pTrackMap->Lookup(uTrackIndex, (void*&)pPersistentHXTrack)) { pPersistentHXTrack->m_bActive = FALSE; } return;}voidHXAdvancedGroup::PersistentComponentRemoved(UINT16 uTrackIndex){ return;}HX_RESULTHXAdvancedGroup::CurrentGroupSet(void){ HX_RESULT rc = HXR_OK; CHXMapLongToObj::Iterator i = m_pTrackMap->Begin(); for(; i != m_pTrackMap->End(); ++i) { HXAdvancedTrack* pHXTrack = (HXAdvancedTrack*)(*i); CHXSimpleList* pRepeatList = pHXTrack->m_pRepeatList; if (pRepeatList) { CHXSimpleList::Iterator ndx = pRepeatList->Begin(); for (; ndx != pRepeatList->End(); ++ndx) { IHXValues* pRepeatTrack = (IHXValues*) (*ndx); ((HXAdvancedGroupManager*)m_pGroupManager)->RepeatTrackAdded(m_uGroupIndex, pHXTrack->m_uTrackIndex, pRepeatTrack); } } } return rc;}HX_RESULT HXAdvancedGroup::RepeatTrackAdded(UINT16 uTrackIndex, IHXValues* pValues){ HX_RESULT rc = HXR_OK; if (m_bToNotifyTrack) { rc = ((HXAdvancedGroupManager*)m_pGroupManager)->RepeatTrackAdded(m_uGroupIndex, uTrackIndex, pValues); HX_ASSERT(rc == HXR_OK); } return rc;}/************************************************************************* Method:* IHXGroup2::GetIHXTrack* Purpose:* get the IHXTrack object*/STDMETHODIMPHXAdvancedGroup::GetIHXTrack(UINT16 /*IN*/ uTrackIndex, REF(IHXTrack*) /*OUT*/ pTrack){ HX_RESULT rc = HXR_OK; pTrack = NULL; if (!m_pTrackMap->Lookup(uTrackIndex, (void*&)pTrack)) { rc = HXR_FAILED; goto cleanup; } pTrack->AddRef();cleanup: return HXR_OK;}/************************************************************************* Method:* IHXGroup2::AddTrackSink* Purpose:* add advise sink on track*/STDMETHODIMPHXAdvancedGroup::AddTrackSink(IHXTrackSink* /*IN*/ pSink){ if (!pSink) { return HXR_UNEXPECTED; } if (!m_pTrackSinkList) { m_pTrackSinkList = new CHXSimpleList; } pSink->AddRef(); m_pTrackSinkList->AddTail(pSink); return HXR_OK; }/************************************************************************* Method:* IHXGroup2::RemoveTrackSink* Purpose:* remove advise sink on track*/STDMETHODIMPHXAdvancedGroup::RemoveTrackSink(IHXTrackSink* /*IN*/ pSink){ if (!m_pTrackSinkList) { return HXR_UNEXPECTED; } LISTPOSITION lPosition = m_pTrackSinkList->Find(pSink); if (!lPosition) { return HXR_UNEXPECTED; } m_pTrackSinkList->RemoveAt(lPosition); HX_RELEASE(pSink); return HXR_OK;}#if defined(HELIX_FEATURE_PREFETCH)/************************************************************************* Method:* IHXPrefetch::AddPrefetchTrack* Purpose:* adds prefetch track by specifying "PrefetchType" and "PrefetchValue"* in pTrack's IHXValues*/STDMETHODIMPHXAdvancedGroup::AddPrefetchTrack(IHXValues* /*IN*/ pTrack){ HX_RESULT rc = HXR_OK; UINT16 uPrefetchIndex = 0; IHXPrefetch* pPrefetch = NULL; if (!pTrack) { rc = HXR_UNEXPECTED; goto cleanup; } uPrefetchIndex = m_uPrefetchTrackCount; pTrack->SetPropertyULONG32("GroupIndex", m_uGroupIndex); pTrack->SetPropertyULONG32("TrackIndex", uPrefetchIndex); // give TLC a first bite on prefetch track if (HXR_OK == m_pPlayer->QueryInterface(IID_IHXPrefetch, (void**)&pPrefetch)) { rc = pPrefetch->AddPrefetchTrack(pTrack); if (HXR_OK == rc && !m_bPrefetchSinkAdded) { m_bPrefetchSinkAdded = TRUE; pPrefetch->AddPrefetchSink(this); } else if (HXR_NOT_SUPPORTED == rc) { rc = m_pPlayer->AddPrefetchTrack(m_uGroupIndex, uPrefetchIndex, pTrack); } } else { rc = m_pPlayer->AddPrefetchTrack(m_uGroupIndex, uPrefetchIndex, pTrack); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -