Blame ports/MSVC++/CMP3Stream/SOURCE/SourceFilter_MP3Stream.CPP

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
#include <IIEP_Def.H>
Packit c32a2d

Packit c32a2d
#include <CORE/SourceFilter_MP3.H>
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
extern BYTE g_ucWaveHeader[WAVE_HEADER_LENGTH];
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: CMP3Stream()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
static size_t read_sub(int fd, void *pBuf, size_t nSize)
Packit c32a2d
{
Packit c32a2d
  if (fd)
Packit c32a2d
  {
Packit c32a2d
    IIEP::CMP3Stream *pcoStream = (IIEP::CMP3Stream *) fd;
Packit c32a2d

Packit c32a2d
    return pcoStream -> ReadFile(pBuf, nSize);
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  return 0;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: CMP3Stream()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
static off_t seek_sub(int fd, off_t nOffset, int iOrigin)
Packit c32a2d
{
Packit c32a2d
  if (fd)
Packit c32a2d
  {
Packit c32a2d
    IIEP::CMP3Stream *pcoStream = (IIEP::CMP3Stream *) fd;
Packit c32a2d

Packit c32a2d
    return pcoStream -> SeekFile(nOffset, iOrigin);
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  return 0;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: CMP3Stream()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
IIEP::CMP3Stream::CMP3Stream(void)
Packit c32a2d
{
Packit c32a2d
  m_dwKBPerSec    = INFINITE;
Packit c32a2d
  m_dwTimeStart   = 0;
Packit c32a2d

Packit c32a2d
  m_pcoMH         = 0;
Packit c32a2d

Packit c32a2d
  m_dwTotalBlocks = 0;
Packit c32a2d
  m_dwAlignment   = 4;
Packit c32a2d

Packit c32a2d
  m_dwLength      = 0;
Packit c32a2d
  m_dwPosition    = 0;
Packit c32a2d

Packit c32a2d
  memcpy(m_ucHeader, g_ucWaveHeader, WAVE_HEADER_LENGTH);
Packit c32a2d

Packit c32a2d
  m_dwDataBufPos  = 0;
Packit c32a2d
  m_dwDataBufLen  = 0;
Packit c32a2d

Packit c32a2d
  m_bSeekFlag     = false;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: ~CMP3Stream()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
IIEP::CMP3Stream::~CMP3Stream(void)
Packit c32a2d
{
Packit c32a2d
  Close();
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: SetSeekFlag()
Packit c32a2d
// desc: called by IIEP::CPlayer::SetMediaPosition(QWORD qwPosition)
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
void IIEP::CMP3Stream::SetSeekFlag(void)
Packit c32a2d
{
Packit c32a2d
  m_bSeekFlag = true;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: Open()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
bool IIEP::CMP3Stream::Open(const WORD *pcwsFileName, CMediaType &coMT, DWORD dwKBPerSec)
Packit c32a2d
{
Packit c32a2d
  Close();
Packit c32a2d

Packit c32a2d
  //
Packit c32a2d

Packit c32a2d
  if (MPG123_OK != mpg123_init())
Packit c32a2d
  {
Packit c32a2d
    goto OPEN_FAIL;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  m_pcoMH = mpg123_new(NULL, NULL);
Packit c32a2d

Packit c32a2d
  if (0 == m_pcoMH)
Packit c32a2d
  {
Packit c32a2d
    goto OPEN_FAIL;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  if (false == OpenFile(pcwsFileName))
Packit c32a2d
  {
Packit c32a2d
    goto OPEN_FAIL;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  if (MPG123_OK != mpg123_replace_reader(m_pcoMH, read_sub, seek_sub))
Packit c32a2d
  {
Packit c32a2d
    goto OPEN_FAIL;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  if (MPG123_OK != mpg123_open_fd(m_pcoMH, (int) this))
Packit c32a2d
  {
Packit c32a2d
    goto OPEN_FAIL;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  long nRate;
Packit c32a2d
  int  iChannels;
Packit c32a2d
  int  iEncoding;
Packit c32a2d

Packit c32a2d
  if (MPG123_OK != mpg123_getformat(m_pcoMH, &nRate, &iChannels, &iEncoding))
Packit c32a2d
  {
Packit c32a2d
    goto OPEN_FAIL;
Packit c32a2d
  }
Packit c32a2d
Packit c32a2d
  //  Ensure that this output format will not change (it could, when we allow it)
Packit c32a2d
Packit c32a2d
  mpg123_format_none(m_pcoMH);
Packit c32a2d
	mpg123_format(m_pcoMH, nRate, iChannels, iEncoding);
Packit c32a2d
Packit c32a2d
  // scan & get total samples
Packit c32a2d

Packit c32a2d
  mpg123_scan(m_pcoMH);
Packit c32a2d

Packit c32a2d
  off_t nOff = mpg123_length(m_pcoMH); 
Packit c32a2d

Packit c32a2d
  if (nOff < 0)
Packit c32a2d
  {
Packit c32a2d
    goto OPEN_FAIL;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  m_dwTotalBlocks = (DWORD) nOff;
Packit c32a2d

Packit c32a2d
  // set other format
Packit c32a2d

Packit c32a2d
  m_dwAlignment = iChannels * 2;
Packit c32a2d
  
Packit c32a2d
  if (0 == m_dwAlignment)
Packit c32a2d
  {
Packit c32a2d
    m_dwAlignment = 4;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  m_dwLength = m_dwTotalBlocks * m_dwAlignment + WAVE_HEADER_LENGTH;
Packit c32a2d

Packit c32a2d
  WORD  wChannels        = (WORD ) iChannels;
Packit c32a2d
  DWORD dwSamplesPerSec  = (DWORD) nRate;
Packit c32a2d
  DWORD dwAvgBytesPerSec =         m_dwAlignment * dwSamplesPerSec;
Packit c32a2d
  WORD  wBlockAlign      = (WORD ) m_dwAlignment;
Packit c32a2d
  WORD  wBitsPerSample   =         16;
Packit c32a2d

Packit c32a2d
  PWORD  pwData;
Packit c32a2d
  PDWORD pdwData;
Packit c32a2d
  
Packit c32a2d
  pdwData = (PDWORD) &m_ucHeader[0x04];
Packit c32a2d
 *pdwData = m_dwTotalBlocks * m_dwAlignment + WAVE_HEADER_LENGTH - 8;
Packit c32a2d

Packit c32a2d
  pwData = (PWORD) &m_ucHeader[0x16];
Packit c32a2d
 *pwData = wChannels;
Packit c32a2d

Packit c32a2d
  pdwData = (PDWORD) &m_ucHeader[0x18];
Packit c32a2d
 *pdwData = dwSamplesPerSec;
Packit c32a2d

Packit c32a2d
  pdwData = (PDWORD) &m_ucHeader[0x1C];
Packit c32a2d
 *pdwData = dwAvgBytesPerSec;
Packit c32a2d

Packit c32a2d
  pwData = (PWORD) &m_ucHeader[0x20];
Packit c32a2d
 *pwData = wBlockAlign;
Packit c32a2d

Packit c32a2d
  pwData = (PWORD) &m_ucHeader[0x22];
Packit c32a2d
 *pwData = wBitsPerSample;
Packit c32a2d

Packit c32a2d
  pdwData = (PDWORD) &m_ucHeader[0x28];
Packit c32a2d
 *pdwData = m_dwTotalBlocks * m_dwAlignment;
Packit c32a2d

Packit c32a2d
  coMT.majortype = MEDIATYPE_Stream;
Packit c32a2d
  coMT.subtype   = MEDIASUBTYPE_WAVE;
Packit c32a2d

Packit c32a2d
  SetPointer(0);
Packit c32a2d

Packit c32a2d
  m_dwTimeStart = ::timeGetTime();
Packit c32a2d

Packit c32a2d
  return true;
Packit c32a2d

Packit c32a2d
OPEN_FAIL:
Packit c32a2d

Packit c32a2d
  Close();
Packit c32a2d

Packit c32a2d
  return false;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: Close()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
void IIEP::CMP3Stream::Close(void)
Packit c32a2d
{
Packit c32a2d
  m_coFileIn.Close();
Packit c32a2d

Packit c32a2d
  if (m_pcoMH)
Packit c32a2d
  {
Packit c32a2d
	  mpg123_close (m_pcoMH);
Packit c32a2d
	  mpg123_delete(m_pcoMH);
Packit c32a2d

Packit c32a2d
    m_pcoMH = 0;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  mpg123_exit(); 
Packit c32a2d

Packit c32a2d
  m_dwTimeStart   = 0;
Packit c32a2d
  m_dwTotalBlocks = 0;
Packit c32a2d

Packit c32a2d
  m_dwLength   = 0;
Packit c32a2d
  m_dwPosition = 0;
Packit c32a2d

Packit c32a2d
  m_bSeekFlag = false;
Packit c32a2d

Packit c32a2d
  m_nDataBegin = 0;
Packit c32a2d
  m_nDataTotal = 0;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: SetPointer()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
HRESULT IIEP::CMP3Stream::SetPointer(LONGLONG llPos)
Packit c32a2d
{
Packit c32a2d
  if (llPos < 0 || llPos > (LONGLONG) m_dwLength)
Packit c32a2d
  {
Packit c32a2d
    return S_FALSE;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  m_dwPosition = (DWORD) llPos;
Packit c32a2d

Packit c32a2d
  if (llPos < WAVE_HEADER_LENGTH)
Packit c32a2d
  {
Packit c32a2d
    mpg123_seek(m_pcoMH, 0, SEEK_SET);
Packit c32a2d

Packit c32a2d
    m_dwDataBufLen = 0;
Packit c32a2d
  }
Packit c32a2d
  else
Packit c32a2d
  {
Packit c32a2d
    if (m_bSeekFlag && m_dwAlignment > 0)
Packit c32a2d
    {
Packit c32a2d
      m_bSeekFlag = false;
Packit c32a2d

Packit c32a2d
      mpg123_seek(m_pcoMH, (long) (m_dwPosition - WAVE_HEADER_LENGTH) / m_dwAlignment, SEEK_SET);
Packit c32a2d

Packit c32a2d
      m_dwDataBufLen = 0;
Packit c32a2d
    }
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  return S_OK;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: Read()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
HRESULT IIEP::CMP3Stream::Read(PBYTE   pucBuffer,
Packit c32a2d
                               DWORD   dwBytesToRead,
Packit c32a2d
                               BOOL    bAlign,
Packit c32a2d
                               LPDWORD pdwBytesRead)
Packit c32a2d
{
Packit c32a2d
  if (0 == m_pcoMH) return S_FALSE;
Packit c32a2d

Packit c32a2d
  CAutoLock lck(&m_csLock);
Packit c32a2d

Packit c32a2d
  DWORD dwReadLength;
Packit c32a2d

Packit c32a2d
  // wait until the bytes are here
Packit c32a2d

Packit c32a2d
  DWORD dwTime = ::timeGetTime();
Packit c32a2d

Packit c32a2d
  if (m_dwPosition + dwBytesToRead > m_dwLength)
Packit c32a2d
  {
Packit c32a2d
    dwReadLength = m_dwLength - m_dwPosition;
Packit c32a2d
  }
Packit c32a2d
  else
Packit c32a2d
  {
Packit c32a2d
    dwReadLength = dwBytesToRead;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  DWORD dwTimeToArrive = (m_dwPosition + dwReadLength) / m_dwKBPerSec;
Packit c32a2d

Packit c32a2d
  if (dwTime - m_dwTimeStart < dwTimeToArrive)
Packit c32a2d
  {
Packit c32a2d
    ::Sleep(dwTimeToArrive - dwTime + m_dwTimeStart);
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  // read data
Packit c32a2d
	
Packit c32a2d
  DWORD dwRead = 0;
Packit c32a2d

Packit c32a2d
  if (m_dwPosition < WAVE_HEADER_LENGTH)
Packit c32a2d
  {
Packit c32a2d
    DWORD dwPatchLen = WAVE_HEADER_LENGTH - m_dwPosition;
Packit c32a2d

Packit c32a2d
    if (dwReadLength < dwPatchLen)
Packit c32a2d
    {
Packit c32a2d
      dwPatchLen = dwReadLength;
Packit c32a2d
    }
Packit c32a2d

Packit c32a2d
    memcpy(pucBuffer, m_ucHeader + m_dwPosition, dwPatchLen);
Packit c32a2d

Packit c32a2d
    m_dwPosition += dwPatchLen;
Packit c32a2d
    dwReadLength -= dwPatchLen;
Packit c32a2d

Packit c32a2d
    pucBuffer += dwPatchLen;
Packit c32a2d
    dwRead    += dwPatchLen;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  if (dwReadLength > 0)
Packit c32a2d
  {
Packit c32a2d
    while (m_dwDataBufLen < dwReadLength)
Packit c32a2d
    {
Packit c32a2d
      if (m_dwDataBufLen > 0)
Packit c32a2d
      {
Packit c32a2d
        memcpy(pucBuffer, m_ucDataBuffer + m_dwDataBufPos, m_dwDataBufLen);
Packit c32a2d

Packit c32a2d
        dwRead         += m_dwDataBufLen;
Packit c32a2d

Packit c32a2d
        dwReadLength   -= m_dwDataBufLen;
Packit c32a2d

Packit c32a2d
        pucBuffer      += m_dwDataBufLen;
Packit c32a2d
        m_dwDataBufPos += m_dwDataBufLen;
Packit c32a2d
        m_dwDataBufLen =  0;
Packit c32a2d
      }
Packit c32a2d

Packit c32a2d
      if (DecodeFrame() == false) break;
Packit c32a2d
    }
Packit c32a2d

Packit c32a2d
    if (dwReadLength > 0)
Packit c32a2d
    {
Packit c32a2d
      if (m_dwDataBufLen >= dwReadLength)
Packit c32a2d
      {
Packit c32a2d
        memcpy(pucBuffer, m_ucDataBuffer + m_dwDataBufPos, dwReadLength);
Packit c32a2d

Packit c32a2d
        dwRead         += dwReadLength;
Packit c32a2d

Packit c32a2d
        m_dwDataBufPos += dwReadLength;
Packit c32a2d
        m_dwDataBufLen -= dwReadLength;
Packit c32a2d
      }
Packit c32a2d
    }
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  m_dwPosition += dwRead;
Packit c32a2d
  *pdwBytesRead = dwRead;
Packit c32a2d

Packit c32a2d
  return S_OK;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: Size()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
LONGLONG IIEP::CMP3Stream::Size(LONGLONG *pSizeAvailable)
Packit c32a2d
{
Packit c32a2d
//  LONGLONG llCurrentAvailable = Int32x32To64((::timeGetTime() - m_dwTimeStart), m_dwKBPerSec);
Packit c32a2d
  LONGLONG llLength = (LONGLONG) m_dwTotalBlocks * m_dwAlignment + WAVE_HEADER_LENGTH;
Packit c32a2d

Packit c32a2d
  if (pSizeAvailable)
Packit c32a2d
  {
Packit c32a2d
//  *pSizeAvailable = min(llLength, llCurrentAvailable);
Packit c32a2d
    *pSizeAvailable = llLength;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  return llLength;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: Alignment()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
DWORD IIEP::CMP3Stream::Alignment(void)
Packit c32a2d
{
Packit c32a2d
  return m_dwAlignment;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: Lock()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
void IIEP::CMP3Stream::Lock(void)
Packit c32a2d
{
Packit c32a2d
  m_csLock.Lock();
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: Unlock()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
void IIEP::CMP3Stream::Unlock(void)
Packit c32a2d
{
Packit c32a2d
  m_csLock.Unlock();
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: DecodeFrame()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
bool IIEP::CMP3Stream::DecodeFrame(void)
Packit c32a2d
{
Packit c32a2d
  if (0 == m_dwDataBufLen)
Packit c32a2d
  {
Packit c32a2d
    m_dwDataBufPos = 0;
Packit c32a2d
  }
Packit c32a2d
Packit c32a2d
  if (m_dwDataBufPos + m_dwDataBufLen + MP3_DECODE_LEN > MP3_DECODE_BUF_LEN)
Packit c32a2d
  {
Packit c32a2d
    return true;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  size_t nBytesRead = 0;
Packit c32a2d

Packit c32a2d
  mpg123_read(m_pcoMH, m_ucDataBuffer + m_dwDataBufPos + m_dwDataBufLen, MP3_DECODE_LEN, &nBytesRead);
Packit c32a2d

Packit c32a2d
  m_dwDataBufLen += (DWORD) nBytesRead;
Packit c32a2d

Packit c32a2d
  return (m_dwDataBufLen > 0);
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: OpenFile()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
bool IIEP::CMP3Stream::OpenFile(const WORD *pcwsFileName)
Packit c32a2d
{
Packit c32a2d
  if (m_coFileIn.Open(pcwsFileName))
Packit c32a2d
  {
Packit c32a2d
    m_nDataBegin = 0;
Packit c32a2d
    m_nDataTotal = m_coFileIn.GetFileSize();
Packit c32a2d

Packit c32a2d
    // check ID3 Tag V2.x
Packit c32a2d

Packit c32a2d
    BYTE ucBuffer[8];
Packit c32a2d
    bool bFound;
Packit c32a2d

Packit c32a2d
TRY_ID3_AGAIN:
Packit c32a2d

Packit c32a2d
    bFound = false;
Packit c32a2d

Packit c32a2d
    if (6 == m_coFileIn.Read(ucBuffer, 6))
Packit c32a2d
    {
Packit c32a2d
      if (ucBuffer[0] == 'I' &&
Packit c32a2d
          ucBuffer[1] == 'D' &&
Packit c32a2d
          ucBuffer[2] == '3')
Packit c32a2d
      {
Packit c32a2d
        bFound = true;
Packit c32a2d

Packit c32a2d
        DWORD dwHeaderSize;
Packit c32a2d

Packit c32a2d
        if (m_coFileIn.ReadInverseDW(dwHeaderSize))
Packit c32a2d
        {
Packit c32a2d
          dwHeaderSize = ((dwHeaderSize & 0x7F000000) >> 3) +
Packit c32a2d
                         ((dwHeaderSize & 0x007F0000) >> 2) +
Packit c32a2d
                         ((dwHeaderSize & 0x00007F00) >> 1) +
Packit c32a2d
                         ((dwHeaderSize & 0x0000007F)     );
Packit c32a2d

Packit c32a2d
          dwHeaderSize += 10;
Packit c32a2d

Packit c32a2d
          m_nDataBegin += dwHeaderSize;
Packit c32a2d
          m_nDataTotal -= dwHeaderSize;
Packit c32a2d

Packit c32a2d
          if (ucBuffer[3] >= 0x03)  // ID3 Tag version >= 2.3
Packit c32a2d
          {
Packit c32a2d
            if (ucBuffer[5] & 0x40) // has extended header
Packit c32a2d
            {
Packit c32a2d
              if (m_coFileIn.ReadInverseDW(dwHeaderSize))
Packit c32a2d
              {
Packit c32a2d
                dwHeaderSize = ((dwHeaderSize & 0x7F000000) >> 3) +
Packit c32a2d
                               ((dwHeaderSize & 0x007F0000) >> 2) +
Packit c32a2d
                               ((dwHeaderSize & 0x00007F00) >> 1) +
Packit c32a2d
                               ((dwHeaderSize & 0x0000007F)     );
Packit c32a2d

Packit c32a2d
                dwHeaderSize += 4;
Packit c32a2d

Packit c32a2d
                m_nDataBegin += dwHeaderSize;
Packit c32a2d
                m_nDataTotal -= dwHeaderSize;
Packit c32a2d
              }
Packit c32a2d
            }
Packit c32a2d
          }
Packit c32a2d
        }
Packit c32a2d
      }
Packit c32a2d
    }
Packit c32a2d

Packit c32a2d
    SeekFile(0, SEEK_SET);
Packit c32a2d

Packit c32a2d
    if (bFound)
Packit c32a2d
    {
Packit c32a2d
      goto TRY_ID3_AGAIN;
Packit c32a2d
    }
Packit c32a2d
/*
Packit c32a2d
    m_coFileIn.Read(ucBuffer, 2);
Packit c32a2d

Packit c32a2d
    if (ucBuffer[0] != 0xFF || ucBuffer[1] < 0xF0)
Packit c32a2d
    {
Packit c32a2d
      m_nDataBegin ++;
Packit c32a2d
      m_nDataTotal --;
Packit c32a2d

Packit c32a2d
      SeekFile(0, SEEK_SET);
Packit c32a2d

Packit c32a2d
      goto TRY_ID3_AGAIN;
Packit c32a2d
    }
Packit c32a2d

Packit c32a2d
    SeekFile(0, SEEK_SET);
Packit c32a2d
*/
Packit c32a2d
    return true;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  return false;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: ReadFile()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
DWORD IIEP::CMP3Stream::ReadFile(PVOID pBuf, DWORD dwLen)
Packit c32a2d
{
Packit c32a2d
  return m_coFileIn.Read(pBuf, dwLen);
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d
// name: SeekFile()
Packit c32a2d
// desc:
Packit c32a2d
// ------------------------------------------------------------------------------------------------
Packit c32a2d

Packit c32a2d
long IIEP::CMP3Stream::SeekFile(long nOffset, int iOrigin)
Packit c32a2d
{
Packit c32a2d
  switch (iOrigin)
Packit c32a2d
  {
Packit c32a2d
  case SEEK_SET:
Packit c32a2d
    if (nOffset < 0 || nOffset >= m_nDataTotal) return -1;
Packit c32a2d
    break;
Packit c32a2d

Packit c32a2d
  case SEEK_CUR:
Packit c32a2d
    nOffset += (m_coFileIn.GetReadPosition() - m_nDataBegin);
Packit c32a2d
    if (nOffset < 0 || nOffset >= m_nDataTotal) return -1;
Packit c32a2d
    break;
Packit c32a2d

Packit c32a2d
  case SEEK_END:
Packit c32a2d
    nOffset = m_nDataTotal - 1 + nOffset;
Packit c32a2d
    if (nOffset < 0 || nOffset >= m_nDataTotal) return -1;
Packit c32a2d
    break;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  if (m_coFileIn.Seek(nOffset + m_nDataBegin, SEEK_SET))
Packit c32a2d
  {
Packit c32a2d
    return nOffset;
Packit c32a2d
  }
Packit c32a2d

Packit c32a2d
  return -1;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// ------------------------------------------------------------------------------------------------