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

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 "hlxclib/string.h"
  36. #include "mp3format.h"
  37. #include "mp3queue.h"
  38. CMp3Queue::CMp3Queue(CMp3Format* pFmt, int nEntries)
  39.  :  m_ulDataBytes(0),
  40.     m_ulQueueSize(nEntries),
  41.     m_ulEntries(0),
  42.     m_ulHead(0),
  43.     m_ulAddIndex(0),
  44.     m_ulHeadDataRemnant(0),
  45.     m_ulNext(0),
  46.     m_pQueue(NULL),
  47.     m_pFmt(pFmt)
  48. {
  49.     m_pQueue = new tFrameInfo[m_ulQueueSize];
  50.     memset(m_pQueue, 0, sizeof(tFrameInfo) * m_ulQueueSize);
  51.     m_ulNext = m_ulHead + 1;
  52. }
  53. CMp3Queue::~CMp3Queue()
  54. {
  55.     RemoveAll();
  56.     if (m_pQueue)
  57.         delete [] m_pQueue;
  58. }
  59. int CMp3Queue::AddEntry(IHXPacket* pPacket)
  60. {
  61.     if (!pPacket)
  62.         return -1;
  63.     IHXBuffer *pBuf = pPacket->GetBuffer();
  64.     
  65.     m_pQueue[m_ulAddIndex].pPacket = pPacket;
  66.     m_pQueue[m_ulAddIndex].pPacket->AddRef();
  67.     m_pQueue[m_ulAddIndex].ulSize = pBuf->GetSize();
  68.     m_pQueue[m_ulAddIndex].pBuffer = pBuf->GetBuffer();
  69.     //m_pQueue[m_ulAddIndex].pBuffer = new UCHAR[pBuf->GetSize()];
  70.     //memcpy(m_pQueue[m_ulAddIndex].pBuffer, pBuf->GetBuffer(), pBuf->GetSize());
  71.     
  72.     m_pQueue[m_ulAddIndex].ulTime = pPacket->GetTime();
  73.     if (GenerateFrameInfo(&m_pQueue[m_ulAddIndex]))
  74.     {
  75.         int nOffset = m_ulAddIndex;
  76.         if (++m_ulAddIndex >= m_ulQueueSize)
  77.             m_ulAddIndex -= m_ulQueueSize;
  78.         ++m_ulEntries;
  79.         m_ulDataBytes += m_pQueue[nOffset].ulDataSize;
  80.         return nOffset;
  81.     }
  82.     else
  83.         return -1;
  84. }
  85. tFrameInfo* CMp3Queue::GetHead()
  86. {
  87.     m_ulNext = m_ulHead + 1;
  88.     if (m_ulNext >= m_ulQueueSize)
  89.         m_ulNext -= m_ulQueueSize;
  90.     return &m_pQueue[m_ulHead];
  91. }
  92. tFrameInfo* CMp3Queue::GetIndex(int nIndex)
  93. {
  94.     return &m_pQueue[nIndex];
  95. }
  96. tFrameInfo* CMp3Queue::Next()
  97. {
  98.     int nIndex = m_ulNext;
  99.     if (++m_ulNext >= m_ulQueueSize)
  100.         m_ulNext -= m_ulQueueSize;
  101.     return &m_pQueue[nIndex];
  102. }
  103. void CMp3Queue::RemoveAll()
  104. {
  105.     for (UINT32 i=0; i<m_ulQueueSize; i++)
  106.     {
  107.         HX_RELEASE(m_pQueue[i].pPacket);
  108.         //if (m_pQueue[i].pBuffer)
  109.         //{
  110.         //    delete [] m_pQueue[i].pBuffer;
  111.         //    m_pQueue[i].pBuffer = 0;
  112.         //}
  113.     }
  114.     m_ulHead = 0;
  115.     m_ulNext = m_ulHead + 1;
  116.     m_ulAddIndex = m_ulHead;
  117.     m_ulEntries = 0;
  118.     m_ulDataBytes = 0;
  119. }
  120. void CMp3Queue::RemoveHead()
  121. {
  122.     m_ulNext = m_ulHead + 1;
  123.     HX_RELEASE(m_pQueue[m_ulHead].pPacket);
  124.     //if (m_pQueue[m_ulHead].pBuffer)
  125.     //    delete [] m_pQueue[m_ulHead].pBuffer;
  126.     memset(&m_pQueue[m_ulHead], 0, sizeof(m_pQueue[m_ulHead]));
  127.     m_ulHead = m_ulNext;
  128.     if (m_ulHead >= m_ulQueueSize)
  129.         m_ulHead -= m_ulQueueSize;
  130.     if (++m_ulNext >= m_ulQueueSize)
  131.         m_ulNext -= m_ulQueueSize;
  132.     --m_ulEntries;
  133. }
  134. UCHAR CMp3Queue::GenerateFrameInfo(tFrameInfo* pInfo)
  135. {
  136.     UCHAR   *pBuffer = pInfo->pBuffer;
  137.     UINT32  ulSize = pInfo->ulSize;
  138.     if (!pBuffer || !ulSize)
  139.         return 0;
  140.     
  141.     if (m_ulHead == m_ulAddIndex)
  142.         m_pFmt->Init(pBuffer, ulSize);
  143.     int     nFrameSize,
  144.             nHdrSize,
  145.             nDataOffset;
  146.     m_pFmt->GetDataOffset(pBuffer,
  147.                           ulSize,
  148.                           nFrameSize,
  149.                           nHdrSize,
  150.                           nDataOffset);
  151.     pInfo->pHdr = pBuffer;
  152.     pInfo->ulHdrSize = nHdrSize;
  153.     pInfo->pData = pBuffer + nHdrSize;
  154.     pInfo->ulDataSize = ulSize - nHdrSize;
  155.     
  156.     // If main_data_begin on the head entry was greater than
  157.     // its data, skip the remaining data in future frames.
  158.     if (m_ulHeadDataRemnant)
  159.     {
  160.         int nCopy = min(m_ulHeadDataRemnant, pInfo->ulDataSize);
  161.         
  162.         pInfo->pData += nCopy;
  163.         pInfo->ulDataSize -= nCopy;
  164.         m_ulHeadDataRemnant -= nCopy;
  165.     }
  166.     // If this is the first frame in the queue, ensure pData points the
  167.     // the first byte of data for this syncword.
  168.     if (m_ulHead == m_ulAddIndex)
  169.     {
  170.         if ((UINT32)nDataOffset > pInfo->ulDataSize)
  171.         {
  172.             m_ulHeadDataRemnant = nDataOffset - pInfo->ulDataSize;
  173.             pInfo->pData += pInfo->ulDataSize;
  174.             pInfo->ulDataSize = 0;
  175.         }
  176.         else
  177.         {
  178.             pInfo->pData += nDataOffset;
  179.             pInfo->ulDataSize -= nDataOffset;
  180.         }
  181.     }
  182.     pInfo->ulFrameSize = nFrameSize;
  183.     pInfo->ulOffset = nDataOffset;
  184.     return 1;
  185. }