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

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 "hxstrutl.h"
  38. #include "hxgroup.h"
  39. #include "hxcore.h"
  40. #include "hxengin.h"
  41. #include "hxslist.h"
  42. #include "hxstring.h"
  43. #include "hxplay.h"
  44. #include "hxbsrc.h"
  45. #include "hxsrc.h"
  46. #include "prefmgr.h"
  47. #include "srcinfo.h"
  48. #include "hxheap.h"
  49. #ifdef _DEBUG
  50. #undef HX_THIS_FILE
  51. static const char HX_THIS_FILE[] = __FILE__;
  52. #endif
  53. PrefetchManager::PrefetchManager(HXPlayer* pPlayer)
  54.     : m_bSourceMapUpdated(FALSE)
  55.     , m_uSourceCount(0)
  56.     , m_pPlayer(NULL)
  57.     , m_pInterruptState(NULL)
  58.     , m_pSourceMap(NULL)
  59. {
  60.     m_pPlayer = pPlayer;
  61.     if (m_pPlayer)
  62.     {
  63. m_pPlayer->AddRef();
  64. m_pPlayer->QueryInterface(IID_IHXInterruptState, (void**) &m_pInterruptState);
  65.     }
  66.     m_pSourceMap = new CHXMapLongToObj;
  67. }
  68. PrefetchManager::~PrefetchManager()
  69. {
  70.     HX_ASSERT(m_pSourceMap->GetCount() == 0);
  71.     HX_RELEASE(m_pPlayer);
  72.     HX_RELEASE(m_pInterruptState);
  73.     
  74.     HX_DELETE(m_pSourceMap);
  75. }
  76. HX_RESULT
  77. PrefetchManager::AddSource(SourceInfo* pSourceInfo)
  78. {
  79.     HX_RESULT hr = HXR_OK;
  80.     if (pSourceInfo)
  81.     {
  82. HX_ASSERT(pSourceInfo->m_bPrefetch);
  83. (*m_pSourceMap)[m_uSourceCount] = pSourceInfo;
  84. m_uSourceCount = m_pSourceMap->GetCount();
  85. m_bSourceMapUpdated = TRUE;
  86.     }
  87.     return hr;
  88. }
  89. UINT16
  90. PrefetchManager::GetNumSources(void)
  91. {
  92.     return m_uSourceCount;
  93. }
  94. HX_RESULT
  95. PrefetchManager::GetSource(UINT16 uSourceIndex, SourceInfo*& pSourceInfo)
  96. {
  97.     HX_RESULT hr = HXR_OK;
  98.     
  99.     pSourceInfo = NULL;
  100.     if (!m_pSourceMap->Lookup(uSourceIndex, (void*&)pSourceInfo))
  101.     {
  102. hr = HXR_UNEXPECTED;
  103. goto cleanup;
  104.     }
  105.     
  106. cleanup:
  107.     
  108.     return hr;
  109. }
  110. BOOL
  111. PrefetchManager::Lookup(IHXValues* pValues, SourceInfo*& pSourceInfo)
  112. {
  113.     HX_RESULT hr = HXR_OK;
  114.     BOOL bFound = FALSE;
  115.     char szUrl[] = "url";
  116.     char szSrc[] = "src";
  117.     char szStart[] = "Start";
  118.     char szDelay[] = "Delay";
  119.     const char* pszURL = NULL;
  120.     UINT32 ulStart = 0;
  121.     UINT32 ulDelay = 0;
  122.     SourceInfo* pSrcInfo = NULL;
  123.     HXSource*  pSource = NULL;
  124.     IHXBuffer* pBuffer = NULL;
  125.     CHXURL* pURL = NULL;
  126.     CHXMapLongToObj::Iterator i;
  127.     pSourceInfo = NULL;
  128.     hr = pValues->GetPropertyCString(szUrl,pBuffer);
  129.     /* temp - for now support both "src" & "url" */
  130.     if (hr)
  131.     {
  132. hr = pValues->GetPropertyCString(szSrc,pBuffer);
  133.     }
  134.     if (hr)
  135.     {
  136. goto cleanup;
  137.     }
  138.     pszURL = (const char*)pBuffer->GetBuffer();
  139.     if (!pszURL || !*pszURL)
  140.     {
  141. goto cleanup;
  142.     }
  143.     pURL = new CHXURL(pszURL); //parse the url
  144.     pszURL = pURL->GetURL();
  145.     pValues->GetPropertyULONG32(szStart, ulStart);
  146.     pValues->GetPropertyULONG32(szDelay, ulDelay);
  147.     i = m_pSourceMap->Begin();    
  148.     for (; i != m_pSourceMap->End(); ++i)
  149.     {
  150. pSrcInfo = (SourceInfo*)(*i);
  151. pSource = pSrcInfo->m_pSource;
  152. if (pSource &&
  153.     strcasecmp(pSource->GetURL(), pszURL) == 0 &&
  154.     pSource->GetStartTime() == ulStart &&
  155.     // XXX HP let's give 100ms windows to take care
  156.     // of the current play time gap between SMIL renderer
  157.     // and the core
  158.     pSource->GetDelay() <= (ulDelay + 100))
  159. {    
  160.     pSourceInfo = pSrcInfo;
  161.     bFound = TRUE;
  162.     break;
  163. }
  164.     }
  165. cleanup:
  166.     HX_DELETE(pURL);
  167.     HX_RELEASE(pBuffer);
  168.     return bFound;
  169. }
  170. BOOL
  171. PrefetchManager::Lookup(HXSource* pSource, SourceInfo*& pSourceInfo)
  172. {
  173.     BOOL bResult = FALSE;
  174.     pSourceInfo = NULL;
  175.     CHXMapLongToObj::Iterator i = m_pSourceMap->Begin();
  176.     for (; i != m_pSourceMap->End(); ++i)
  177.     {
  178. SourceInfo* pSrcInfo = (SourceInfo*) (*i);
  179. if (pSrcInfo->m_pSource == pSource)
  180. {
  181.     pSourceInfo = pSrcInfo;
  182.     bResult = TRUE;
  183.     break;
  184. }
  185.     }
  186.     return bResult;
  187. }
  188. HX_RESULT
  189. PrefetchManager::RemoveSource(SourceInfo* pSourceInfo)
  190. {    
  191.     HX_RESULT hr = HXR_OK;
  192.     int j = 0;
  193.     BOOL bRemoved = FALSE;
  194.     CHXMapLongToObj* pNewSourceMap = NULL;
  195.     SourceInfo* pSrcInfo = NULL;
  196.     
  197.     pNewSourceMap = new CHXMapLongToObj;
  198.     CHXMapLongToObj::Iterator i = m_pSourceMap->Begin();    
  199.     for (; i != m_pSourceMap->End(); ++i,j++)
  200.     {
  201. pSrcInfo = (SourceInfo*)(*i);
  202. if (pSrcInfo == pSourceInfo)
  203. {
  204.     bRemoved = TRUE;
  205.     m_bSourceMapUpdated = TRUE;
  206. }
  207. else if (bRemoved)
  208. {
  209.     (*pNewSourceMap)[j - 1] = pSrcInfo;
  210.     // track ID has to be consistent with the map ID
  211.     pSrcInfo->m_uTrackID = j - 1;
  212. }
  213. else
  214. {
  215.     (*pNewSourceMap)[j] = pSrcInfo;
  216. }
  217.     }
  218.     
  219.     HX_DELETE(m_pSourceMap);
  220.     m_pSourceMap = pNewSourceMap;
  221.     m_uSourceCount = m_pSourceMap->GetCount();
  222.     return hr;
  223. }
  224. HX_RESULT
  225. PrefetchManager::ProcessIdle(void)
  226. {
  227.     HX_RESULT hr = HXR_OK;
  228.     CHXMapLongToObj::Iterator i = m_pSourceMap->Begin();    
  229.     for (; i != m_pSourceMap->End(); ++i)
  230.     {
  231. SourceInfo* pSourceInfo = (SourceInfo*)(*i);
  232. HXSource*  pSource = pSourceInfo->m_pSource;
  233. if (!pSource || pSource->IsPrefetchDone())
  234. {
  235.     continue;
  236. }
  237. if (pSourceInfo->m_bToBeResumed     && 
  238.     pSource->IsInitialized()     &&
  239.     !m_pInterruptState->AtInterruptTime() )
  240. {
  241.     if (!pSourceInfo->m_bAreStreamsSetup)
  242.     {
  243. hr = pSourceInfo->SetupStreams();
  244. //m_pPlayer->m_ulPresentationDuration = max(m_pPlayer->m_ulPresentationDuration,
  245. //   pSourceInfo->GetActiveDuration());
  246.     }
  247.     if (pSource->CanBeResumed())
  248.     {   
  249. pSourceInfo->m_bToBeResumed = FALSE;
  250. pSourceInfo->Register();
  251. m_pPlayer->RegisterSourcesDone();
  252. hr = pSource->DoResume();
  253.     }
  254. }
  255. else
  256. {
  257.     hr = pSource->ProcessIdle();
  258. }
  259. if (m_bSourceMapUpdated)
  260. {
  261.     m_bSourceMapUpdated = FALSE;
  262.     break;
  263. }
  264.     }
  265.     return hr;
  266. }
  267. void
  268. PrefetchManager::Cleanup(void)
  269. {
  270.     SourceInfo* pSourceInfo = NULL;
  271.     CHXMapLongToObj::Iterator i = m_pSourceMap->Begin();    
  272.     for (; i != m_pSourceMap->End(); ++i)
  273.     {
  274. pSourceInfo = (SourceInfo*) (*i);
  275. pSourceInfo->Remove();
  276. HX_DELETE(pSourceInfo);
  277.     }
  278.     m_pSourceMap->RemoveAll();
  279.     return;
  280. }