// ------------------------------------------------------------------------------------------------ #pragma once // ------------------------------------------------------------------------------------------------ #ifdef _DEBUG #pragma comment(lib, "libMPG123_d.lib") #else #pragma comment(lib, "libMPG123.lib") #endif // ------------------------------------------------------------------------------------------------ #include "../DShowBase/streams.h" #include #include #include "../../libMPG123/MPG123.H" #include // ------------------------------------------------------------------------------------------------ #define WAVE_HEADER_LENGTH 44 // ------------------------------------------------------------------------------------------------ #define MP3_DECODE_LEN 0x4000 #define MP3_DECODE_BUF_LEN 0x8000 // ------------------------------------------------------------------------------------------------ namespace IIEP { class CMP3Stream : public CAsyncStream { public: CMP3Stream(void); ~CMP3Stream(void); void SetSeekFlag(void); bool Open(const WORD *pcwsFileName, CMediaType &coMT, DWORD dwKBPerSec = INFINITE); void Close(void); HRESULT SetPointer(LONGLONG llPos); HRESULT Read(PBYTE pucBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead); LONGLONG Size(LONGLONG *pSizeAvailable); DWORD Alignment(void); void Lock (void); void Unlock(void); bool DecodeFrame(void); // bool OpenFile(const WORD *pcwsFileName); DWORD ReadFile(PVOID pBuf , DWORD dwLen ); long SeekFile(long nOffset, int iOrigin); // private: CCritSec m_csLock; DWORD m_dwKBPerSec; DWORD m_dwTimeStart; mpg123_handle *m_pcoMH; DWORD m_dwTotalBlocks; DWORD m_dwAlignment; DWORD m_dwLength; DWORD m_dwPosition; BYTE m_ucHeader[WAVE_HEADER_LENGTH]; // DWORD m_dwDataBufPos; DWORD m_dwDataBufLen; BYTE m_ucDataBuffer[MP3_DECODE_BUF_LEN]; // bool m_bSeekFlag; // IIEP::CFileIn m_coFileIn; long m_nDataBegin; long m_nDataTotal; }; // ---------------------------------------------------------------------------------------------- class CMP3Reader : public CAsyncReader { public: // We're not going to be CoCreate'd so we don't need registration stuff etc STDMETHODIMP Register(void) { return S_OK; } STDMETHODIMP Unregister(void) { return S_OK; } CMP3Reader(CMP3Stream *pcoStream, CMediaType *pcoMT, HRESULT *phr) : CAsyncReader(NAME("MP3 Reader\0"), NULL, pcoStream, phr) { m_coMT = *pcoMT; } }; } // ------------------------------------------------------------------------------------------------