//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $Workfile: $ // $Date: $ // //----------------------------------------------------------------------------- // $Log: $ // // $NoKeywords: $ //=============================================================================// #ifndef RIFF_H #define RIFF_H #pragma once #include "commonmacros.h" //----------------------------------------------------------------------------- // Purpose: This is a simple abstraction that the RIFF classes use to read from // files/memory //----------------------------------------------------------------------------- class IFileReadBinary { public: virtual int open(const char *pFileName) = 0; virtual int read(void *pOutput, int size, int file) = 0; virtual void close(int file) = 0; virtual void seek(int file, int pos) = 0; virtual unsigned int tell(int file) = 0; virtual unsigned int size(int file) = 0; }; //----------------------------------------------------------------------------- // Purpose: Used to read/parse a RIFF format file //----------------------------------------------------------------------------- class InFileRIFF { public: InFileRIFF(const char *pFileName, IFileReadBinary &io); ~InFileRIFF(void); unsigned int RIFFName(void) { return m_riffName; } unsigned int RIFFSize(void) { return m_riffSize; } int ReadInt(void); int ReadData(void *pOutput, int dataSize); int PositionGet(void); void PositionSet(int position); bool IsValid(void) { return m_file != 0; } private: const InFileRIFF &operator=(const InFileRIFF &); IFileReadBinary &m_io; int m_file; unsigned int m_riffName; unsigned int m_riffSize; }; //----------------------------------------------------------------------------- // Purpose: Used to iterate over an InFileRIFF //----------------------------------------------------------------------------- class IterateRIFF { public: IterateRIFF(InFileRIFF &riff, int size); IterateRIFF(IterateRIFF &parent); bool ChunkAvailable(void); bool ChunkNext(void); unsigned int ChunkName(void); unsigned int ChunkSize(void); int ChunkRead(void *pOutput); int ChunkReadPartial(void *pOutput, int dataSize); int ChunkReadInt(void); int ChunkFilePosition(void) { return m_chunkPosition; } private: const IterateRIFF &operator=(const IterateRIFF &); void ChunkSetup(void); void ChunkClear(void); InFileRIFF &m_riff; int m_start; int m_size; unsigned int m_chunkName; int m_chunkSize; int m_chunkPosition; }; class IFileWriteBinary { public: virtual int create(const char *pFileName) = 0; virtual int write(void *pData, int size, int file) = 0; virtual void close(int file) = 0; virtual void seek(int file, int pos) = 0; virtual unsigned int tell(int file) = 0; }; //----------------------------------------------------------------------------- // Purpose: Used to write a RIFF format file //----------------------------------------------------------------------------- class OutFileRIFF { public: OutFileRIFF(const char *pFileName, IFileWriteBinary &io); ~OutFileRIFF(void); bool WriteInt(int number); bool WriteData(void *pOutput, int dataSize); int PositionGet(void); void PositionSet(int position); bool IsValid(void) { return m_file != 0; } void HasLISETData(int position); private: const OutFileRIFF &operator=(const OutFileRIFF &); IFileWriteBinary &m_io; int m_file; unsigned int m_riffName; unsigned int m_riffSize; unsigned int m_nNamePos; // hack to make liset work correctly bool m_bUseIncorrectLISETLength; int m_nLISETSize; }; //----------------------------------------------------------------------------- // Purpose: Used to iterate over an InFileRIFF //----------------------------------------------------------------------------- class IterateOutputRIFF { public: IterateOutputRIFF(OutFileRIFF &riff); IterateOutputRIFF(IterateOutputRIFF &parent); void ChunkStart(unsigned int chunkname); void ChunkFinish(void); void ChunkWrite(unsigned int chunkname, void *pOutput, int size); void ChunkWriteInt(int number); void ChunkWriteData(void *pOutput, int size); int ChunkFilePosition(void) { return m_chunkPosition; } unsigned int ChunkGetPosition(void); void ChunkSetPosition(int position); void CopyChunkData(IterateRIFF &input); void SetLISETData(int position); private: const IterateOutputRIFF &operator=(const IterateOutputRIFF &); OutFileRIFF &m_riff; int m_start; int m_size; unsigned int m_chunkName; int m_chunkSize; int m_chunkPosition; int m_chunkStart; }; #define RIFF_ID MAKEID('R', 'I', 'F', 'F') #define RIFF_WAVE MAKEID('W', 'A', 'V', 'E') #define WAVE_FMT MAKEID('f', 'm', 't', ' ') #define WAVE_DATA MAKEID('d', 'a', 't', 'a') #define WAVE_FACT MAKEID('f', 'a', 'c', 't') #define WAVE_CUE MAKEID('c', 'u', 'e', ' ') #define WAVE_SAMPLER MAKEID('s', 'm', 'p', 'l') #define WAVE_VALVEDATA MAKEID('V', 'D', 'A', 'T') #define WAVE_PADD MAKEID('P', 'A', 'D', 'D') #define WAVE_LIST MAKEID('L', 'I', 'S', 'T') #ifndef WAVE_FORMAT_PCM #define WAVE_FORMAT_PCM 0x0001 #endif #ifndef WAVE_FORMAT_ADPCM #define WAVE_FORMAT_ADPCM 0x0002 #endif #define WAVE_FORMAT_XBOX_ADPCM 0x0069 #ifndef WAVE_FORMAT_XMA #define WAVE_FORMAT_XMA 0x0165 #endif #endif // RIFF_H