nxtgrmgr.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:12k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxcom.h"
  36. #include "hxresult.h"
  37. #include "hxgroup.h"
  38. #include "hxcore.h"
  39. #include "hxengin.h"
  40. #include "hxslist.h"
  41. #include "hxstring.h"
  42. #include "hxplay.h"
  43. #include "hxbsrc.h"
  44. #include "hxsrc.h"
  45. #include "nxtgrmgr.h"
  46. #include "srcinfo.h"
  47. #include "hxheap.h"
  48. #ifdef _DEBUG
  49. #undef HX_THIS_FILE
  50. static const char HX_THIS_FILE[] = __FILE__;
  51. #endif
  52. NextGroupManager::NextGroupManager(HXPlayer* pPlayer)
  53.     : m_pPlayer(NULL)
  54.     , m_pInterruptState(NULL)
  55.     , m_pSourceList(NULL)
  56.     , m_LastError(HXR_OK)
  57.     , m_uGroupNumber(0)
  58.     , m_pGroup(NULL)
  59.     , m_pErrorSource(NULL)
  60.     , m_bStopPrefetch(FALSE)
  61. {
  62.     m_pPlayer     = pPlayer;
  63.     m_pSourceList   = new CHXSimpleList;
  64.     m_UserString    = "";
  65.     m_pPlayer->AddRef();
  66. }
  67. NextGroupManager::~NextGroupManager()
  68. {
  69.     Cleanup();
  70.     HX_RELEASE(m_pPlayer);
  71.     HX_RELEASE(m_pInterruptState);
  72.     HX_DELETE(m_pSourceList);
  73.     m_pSourceList = 0;
  74. }
  75. void
  76. NextGroupManager::Init()
  77. {
  78.     m_pPlayer->QueryInterface(IID_IHXInterruptState, (void**) &m_pInterruptState);
  79. }
  80. HX_RESULT
  81. NextGroupManager::SetCurrentGroup(UINT16 uGroupNumber, IHXGroup* pGroup)
  82. {
  83.     Cleanup();
  84.     m_uGroupNumber  = uGroupNumber;
  85.     m_pGroup     = pGroup;
  86.     m_pGroup->AddRef();
  87.     return HXR_OK;
  88. }
  89. HX_RESULT
  90. NextGroupManager::GetCurrentGroup(UINT16& uCurrentGroup, IHXGroup*& pGroup)
  91. {
  92.     if (m_pGroup)
  93.     {
  94. uCurrentGroup   = m_uGroupNumber;
  95. pGroup = m_pGroup;
  96. pGroup->AddRef();
  97. return HXR_OK;
  98.     }
  99.     return HXR_NO_DATA;
  100. }
  101. HX_RESULT
  102. NextGroupManager::AddSource(SourceInfo* pSourceInfo)
  103. {
  104.     HX_ASSERT(pSourceInfo);
  105.     
  106.     m_pSourceList->AddTail(pSourceInfo);
  107.     return HXR_OK;
  108. }
  109. UINT16
  110. NextGroupManager::GetNumSources(void)
  111. {
  112.     return m_pSourceList->GetCount();
  113. }
  114. HX_RESULT
  115. NextGroupManager::GetSource(UINT16 uIndex, SourceInfo*& pSourceInfo)
  116. {
  117.     HX_ASSERT(uIndex < m_pSourceList->GetCount());
  118.     LISTPOSITION lPos = m_pSourceList->FindIndex((int) uIndex);
  119.     if (!lPos)
  120.     {
  121. pSourceInfo = NULL;
  122. return HXR_INVALID_PARAMETER;
  123.     }
  124.     pSourceInfo = (SourceInfo*) m_pSourceList->GetAt(lPos);
  125.     return HXR_OK;
  126. }
  127.     
  128. HX_RESULT
  129. NextGroupManager::RemoveSource(SourceInfo* pSourceInfo)
  130. {    
  131.     BOOL    bFound = FALSE;
  132.     UINT16  nIndex = 0;
  133.     LISTPOSITION lPos = 0;
  134.     CHXSimpleList::Iterator ndx = m_pSourceList->Begin();
  135.     for (; ndx != m_pSourceList->End(); ++ndx, nIndex++)
  136.     {
  137. SourceInfo* pSrcInfo = (SourceInfo*) (*ndx);
  138. if (pSrcInfo == pSourceInfo)
  139. {         
  140.     bFound = TRUE;
  141.     break;
  142. }
  143.     }
  144.     if (bFound)
  145.     {
  146. lPos = m_pSourceList->FindIndex(nIndex);
  147. m_pSourceList->RemoveAt(lPos);
  148.     }
  149.     m_LastError = HXR_OK;
  150.     return HXR_OK;
  151. }
  152. HX_RESULT
  153. NextGroupManager::RemoveSource(UINT16 uIndex, SourceInfo*& pSourceInfo)
  154. {
  155.     HX_ASSERT(uIndex < m_pSourceList->GetCount());
  156.     LISTPOSITION lPos = m_pSourceList->FindIndex((int) uIndex);
  157.     if (!lPos)
  158.     {
  159. pSourceInfo = NULL;
  160. return HXR_INVALID_PARAMETER;
  161.     }
  162.     pSourceInfo = (SourceInfo*) m_pSourceList->RemoveAt(lPos);
  163.     return HXR_OK;
  164. }
  165. void
  166. NextGroupManager::RemoveAllSources(void)
  167. {
  168.     m_pSourceList->RemoveAll();
  169. }
  170.     
  171. HX_RESULT
  172. NextGroupManager::ProcessIdle(void)
  173. {
  174.     UINT32 ulDuration = 0;
  175.     UINT32 ulDelay = 0;
  176.     if (m_bStopPrefetch)
  177.     {
  178. return HXR_OK;
  179.     }
  180.     HX_RESULT theErr = HXR_OK;
  181.     CHXSimpleList::Iterator ndx = m_pSourceList->Begin();
  182.     for (; !m_LastError && !theErr && ndx != m_pSourceList->End(); ++ndx)
  183.     {
  184. SourceInfo* pSourceInfo = (SourceInfo*)(*ndx);
  185. if (!pSourceInfo->m_pSource)
  186. {
  187.     continue;
  188. }
  189. if (pSourceInfo->m_bToBeResumed && 
  190.     pSourceInfo->m_pSource->IsInitialized() &&
  191.     !m_pInterruptState->AtInterruptTime())
  192. {
  193.     if (!pSourceInfo->m_bIsTrackDurationSet)
  194.     {
  195. if (pSourceInfo->m_pRendererAdviseSink)
  196. {
  197.     ulDuration = pSourceInfo->m_pSource->GetDuration();
  198.     ulDelay = pSourceInfo->m_pSource->GetDelay();
  199.     //Fixes PR 27831: make sure the total track dur is
  200.     // being set for all groups otherwise a duration of
  201.     // 0 results and SMIL's time-bounds checking for
  202.     // whether or not a hyperlink is active always
  203.     // results in false (for non-fill="freeze" sources).
  204.     // This line is copied from SourceInfo::SetupRenderer()
  205.     // inside its
  206.     //  if (!m_bIsTrackDurationSet)
  207.     // block of code:
  208.     pSourceInfo->m_ulTrackDuration = pSourceInfo->m_pSource->GetDuration();
  209.     pSourceInfo->m_pRendererAdviseSink->
  210. TrackDurationSet(pSourceInfo->m_uGroupID,
  211.        pSourceInfo->m_uTrackID,
  212.        ulDuration,
  213.        ulDelay,
  214.        pSourceInfo->m_pSource->IsLive());
  215.     //Moved this inside the if() because that's what makes
  216.     // sense; if the above if did not get entered, then we
  217.     // didn't call TrackDurationSet() and thus we shouldn't
  218.     // set the following BOOL to TRUE outside the if:
  219.     pSourceInfo->m_bIsTrackDurationSet = TRUE;
  220. }
  221. theErr = pSourceInfo->SetupStreams();
  222.     }
  223.     if (pSourceInfo->m_pSource && 
  224. (pSourceInfo->m_pSource->CanBeResumed() ||
  225. (pSourceInfo->m_pSource->IsDelayed() && pSourceInfo->m_pSource->TryResume())))
  226.     {   
  227. pSourceInfo->m_bToBeResumed = FALSE;
  228. pSourceInfo->Register();
  229. m_pPlayer->RegisterSourcesDone();
  230. theErr = pSourceInfo->m_pSource->DoResume();
  231.     }
  232. }
  233. if (pSourceInfo->m_bToBeResumed || !pSourceInfo->m_pSource->IsPreBufferingDone()
  234.     || pSourceInfo->m_pSource->IsLive())
  235. {
  236.     theErr = pSourceInfo->m_pSource->ProcessIdle();
  237. }
  238. else
  239. {
  240.     pSourceInfo->m_pSource->DoPause();
  241. }
  242.     }
  243.     if (theErr && !m_LastError)
  244.     {
  245. m_LastError = theErr;
  246.     }
  247.     return HXR_OK;
  248. }
  249. BOOL
  250. NextGroupManager::ReportError(HXSource* pSource, HX_RESULT theErr, 
  251.       const char* pUserString)
  252. {
  253.     CHXSimpleList::Iterator ndx = m_pSourceList->Begin();
  254.     for (; ndx != m_pSourceList->End(); ++ndx)
  255.     {
  256. SourceInfo* pSourceInfo = (SourceInfo*) (*ndx);
  257. if (pSourceInfo->m_pSource == pSource)
  258. {       
  259.     m_LastError     = theErr;
  260.     m_UserString    = pUserString;
  261.     m_pErrorSource  = pSource;
  262.     return TRUE;     
  263. }
  264.     }
  265.     return FALSE;
  266. }
  267. HX_RESULT
  268. NextGroupManager::CanBeStarted(HXSource* pSource, SourceInfo* pThisSourceInfo)
  269. {
  270.     UINT32 ulDelay = pSource->GetDelay();
  271.     if (ulDelay == 0 || !pThisSourceInfo)
  272.     {
  273. return TRUE;
  274.     }
  275.     CHXSimpleList::Iterator ndxSources = m_pSourceList->Begin();
  276.     /* Check if we are done. This may be TRUE for empty files */
  277.     for (; ndxSources != m_pSourceList->End(); ++ndxSources)
  278.     {
  279. SourceInfo* pSourceInfo = (SourceInfo*) (*ndxSources);
  280. if (!pSourceInfo->m_pSource || 
  281.     pSourceInfo->m_pSource->IsSourceDone() ||
  282.     !pSourceInfo->m_pSource->IsInitialized())
  283. {
  284.     continue;
  285. }
  286. #ifdef SEQ_DEPENDENCY
  287. int iRetVal = 0;
  288. if (!pSourceInfo->m_pSource->IsLive() &&
  289.     IsDependent(pThisSourceInfo, pSourceInfo) && 
  290.     !pSourceInfo->m_pSource->IsSourceDone())
  291. {
  292.     return FALSE;
  293. }
  294. #else
  295. if (!pSourceInfo->m_pSource->IsLive() &&
  296.      pSourceInfo->m_pSource->GetDuration() <= ulDelay &&
  297.     !pSourceInfo->m_pSource->IsSourceDone())
  298. {
  299.     return FALSE;
  300. }
  301. #endif /*SEQ_DEPENDENCY*/
  302.     }
  303.     return TRUE;
  304. }
  305.     
  306. BOOL
  307. NextGroupManager::Lookup(HXSource* pSource, SourceInfo*& pSourceInfo)
  308. {
  309.     BOOL bResult = FALSE;
  310.     pSourceInfo = NULL;
  311.     CHXSimpleList::Iterator ndx = m_pSourceList->Begin();
  312.     for (; ndx != m_pSourceList->End(); ++ndx)
  313.     {
  314. SourceInfo* pSrcInfo = (SourceInfo*) (*ndx);
  315. if (pSrcInfo->m_pSource == pSource)
  316. {
  317.     pSourceInfo = pSrcInfo;
  318.     bResult = TRUE;
  319.     break;
  320. }
  321.     }
  322.     return bResult;
  323. }
  324. void
  325. NextGroupManager::Cleanup(void)
  326. {
  327.     CHXSimpleList::Iterator ndx = m_pSourceList->Begin();
  328.     for (; ndx != m_pSourceList->End(); ++ndx)
  329.     {
  330. SourceInfo* pSourceInfo = (SourceInfo*) (*ndx);
  331. pSourceInfo->Stop();
  332. pSourceInfo->CloseRenderers();
  333. HX_RELEASE(pSourceInfo->m_pStatus);
  334. if (pSourceInfo->m_pSource)
  335. {
  336.     // cleanup (i.e. registry)
  337.     pSourceInfo->m_pSource->DoCleanup();
  338.     pSourceInfo->m_pSource->Release();
  339.     pSourceInfo->m_pSource = 0;
  340. }
  341. delete pSourceInfo;
  342.     }
  343.     m_pSourceList->RemoveAll();
  344.     HX_RELEASE(m_pGroup);
  345.     m_LastError     = HXR_OK;
  346.     m_UserString    = "";
  347.     m_pErrorSource  = NULL;
  348.     m_bStopPrefetch = FALSE;
  349. }
  350. void
  351. NextGroupManager::SetLastError(HX_RESULT theErr, HXSource* pSource, char* pUserString)
  352. {
  353.     if (!m_LastError)
  354.     {
  355. m_LastError = theErr;
  356. m_pErrorSource = pSource; 
  357. m_UserString = pUserString;
  358.     }
  359. }
  360. void
  361. NextGroupManager::StopPreFetch()
  362. {
  363.     if (m_bStopPrefetch)
  364.     {
  365. return;
  366.     }
  367.     m_bStopPrefetch = TRUE;
  368.     CHXSimpleList::Iterator ndx = m_pSourceList->Begin();
  369.     for (; ndx != m_pSourceList->End(); ++ndx)
  370.     {
  371. SourceInfo* pSourceInfo = (SourceInfo*)(*ndx);
  372. if (!pSourceInfo->m_pSource)
  373. {
  374.     continue;
  375. }
  376. if (!pSourceInfo->m_bToBeResumed)
  377. {
  378.     pSourceInfo->m_bToBeResumed = TRUE;
  379.     pSourceInfo->m_pSource->DoPause();
  380.     pSourceInfo->UnRegister();
  381. }
  382.     }
  383. }
  384. void
  385. NextGroupManager::ContinuePreFetch()
  386. {
  387.     m_bStopPrefetch = FALSE;
  388. }
  389. HX_RESULT
  390. NextGroupManager::AddRepeatTrack(UINT16 uTrackIndex, IHXValues* pTrack)
  391. {
  392.     SourceInfo* pSourceInfo = NULL;
  393.     if (HXR_OK == GetSourceInfo(uTrackIndex, pSourceInfo) && pSourceInfo)
  394.     {
  395. return pSourceInfo->AppendRepeatRequest(uTrackIndex, pTrack);
  396.     }
  397.     else
  398.     {
  399. HX_ASSERT(FALSE);
  400. return HXR_UNEXPECTED;
  401.     }
  402. }
  403. HX_RESULT
  404. NextGroupManager::GetSourceInfo(UINT16 uTrackIndex, SourceInfo*& pSourceInfo)
  405. {
  406.     HX_RESULT hr = HXR_OK;
  407.     SourceInfo* pTempSourceInfo = NULL;
  408.     CHXSimpleList::Iterator ndxSource;
  409.     pSourceInfo = NULL;
  410.     if (m_pSourceList)
  411.     {
  412. // find the sourceinfo
  413. ndxSource = m_pSourceList->Begin();
  414. for (; ndxSource != m_pSourceList->End(); ++ndxSource)
  415. {
  416.     pTempSourceInfo = (SourceInfo*)(*ndxSource);
  417.          if (pTempSourceInfo->m_uTrackID == uTrackIndex)
  418.     {
  419. pSourceInfo = pTempSourceInfo;
  420. break;
  421.     }
  422. }
  423.     }
  424.     return hr;
  425. }