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

📄 advgroup.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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
*/
STDMETHODIMP
HXAdvancedGroup::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
*/
STDMETHODIMP
HXAdvancedGroup::GetTrack2(UINT16		/*IN*/	uTrackIndex,
		           REF(IHXValues*)	/*OUT*/ pTrack,
		           REF(IHXValues*)	/*OUT*/	pTrackPropInRequest)
{
    return DoGetTrack(uTrackIndex, pTrack, pTrackPropInRequest);
}

STDMETHODIMP
HXAdvancedGroup::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
*/
STDMETHODIMP
HXAdvancedGroup::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
*/
STDMETHODIMP
HXAdvancedGroup::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_RESULT
HXAdvancedGroup::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_RESULT
HXAdvancedGroup::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_RESULT
HXAdvancedGroup::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_RESULT
HXAdvancedGroup::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_RESULT
HXAdvancedGroup::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_RESULT
HXAdvancedGroup::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_RESULT
HXAdvancedGroup::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_RESULT
HXAdvancedGroup::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;
}

void
HXAdvancedGroup::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;
}

void
HXAdvancedGroup::PersistentComponentRemoved(UINT16 uTrackIndex)
{
    return;
}

HX_RESULT
HXAdvancedGroup::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
*/
STDMETHODIMP
HXAdvancedGroup::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
*/
STDMETHODIMP
HXAdvancedGroup::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
*/
STDMETHODIMP
HXAdvancedGroup::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
*/
STDMETHODIMP
HXAdvancedGroup::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);
    }

    if (HXR_OK != rc)
    {
	goto cleanup;

⌨️ 快捷键说明

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