nxtgrmgr.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:13k
源码类别:

Symbian

开发平台:

Visual C++

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