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

Symbian

开发平台:

Visual C++

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