diff options
Diffstat (limited to 'engine/audio/private/MPAFile.h')
| -rw-r--r-- | engine/audio/private/MPAFile.h | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/engine/audio/private/MPAFile.h b/engine/audio/private/MPAFile.h new file mode 100644 index 0000000..92d15ff --- /dev/null +++ b/engine/audio/private/MPAFile.h @@ -0,0 +1,125 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Uses mp3 code from: http://www.codeproject.com/audio/MPEGAudioInfo.asp +// +// There don't appear to be any licensing restrictions for using this code: +// +/* +- Readme - MPEG Audio Info Tool V2.0 - 2004-11-01 + +Description: +This tool can display information about MPEG audio files. It supports +MPEG1, MPEG2, MPEG2.5 in all three layers. You can get all the fields +from the MPEG audio frame in each frame of the file. Additionally you +can check the whole file for inconsistencies. + + +This tool was written as an example on how to use the classes: +CMPAFile, CMPAHeader, CVBRHeader and CMPAException. + +The article MPEG Audio Frame Header on Sourceproject +[http://www.codeproject.com/audio/MPEGAudioInfo.asp] +provides additional information about these classes and the frame header +in general. + +This tool was written with MS Visual C++ 7.1. The MFC library is +statically linked. +*/ +//============================================================================= + +#ifndef MPAFILE_H +#define MPAFILE_H +#ifdef _WIN32 +#pragma once +#endif + +#pragma once + +#include "VBRHeader.h" +#include "MPAHeader.h" +#include "filesystem.h" + +// exception class +class CMPAException +{ +public: + + enum ErrorIDs + { + ErrOpenFile, + ErrSetPosition, + ErrReadFile, + EndOfBuffer, + NoVBRHeader, + IncompleteVBRHeader, + NoFrameInTolerance, + NoFrame + }; + + CMPAException( ErrorIDs ErrorID, const char *szFile, const char *szFunction = NULL, bool bGetLastError=false ); + // copy constructor (necessary because of LPSTR members) + CMPAException(const CMPAException& Source); + ~CMPAException(void); + + ErrorIDs GetErrorID() { return m_ErrorID; } + + void ShowError(); + +private: + ErrorIDs m_ErrorID; + bool m_bGetLastError; + const char *m_szFunction; + const char *m_szFile; +}; + + +class CMPAFile +{ +public: + CMPAFile( const char *szFile, uint32 dwFileOffset, FileHandle_t hFile = FILESYSTEM_INVALID_HANDLE ); + ~CMPAFile(void); + + uint32 ExtractBytes( uint32 &dwOffset, uint32 dwNumBytes, bool bMoveOffset = true ); + const char *GetFilename() const { return m_szFile; }; + + bool GetNextFrame(); + bool GetPrevFrame(); + bool GetFirstFrame(); + bool GetLastFrame(); + +private: + static const uint32 m_dwInitBufferSize; + + // methods for file access + void Open( const char *szFilename ); + void SetPosition( int offset ); + uint32 Read( void *pData, uint32 dwSize, uint32 dwOffset ); + + void FillBuffer( uint32 dwOffsetToRead ); + + static uint32 m_dwBufferSizes[MAXTIMESREAD]; + + // concerning file itself + FileHandle_t m_hFile; + const char *m_szFile; + bool m_bMustReleaseFile; + +public: + uint32 m_dwBegin; // offset of first MPEG Audio frame + uint32 m_dwEnd; // offset of last MPEG Audio frame (estimated) + bool m_bVBRFile; + + uint32 m_dwBytesPerSec; + + CMPAHeader* m_pMPAHeader; + uint32 m_dwFrameNo; + + CVBRHeader* m_pVBRHeader; // XING or VBRI + + // concerning read-buffer + uint32 m_dwNumTimesRead; + char *m_pBuffer; + uint32 m_dwBufferSize; +}; + +#endif // MPAFILE_H |