|
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 |
// ------------------------------------------------------------------------------------------------
|