//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $Workfile: $ // $Date: $ // //----------------------------------------------------------------------------- // $Log: $ // // $NoKeywords: $ //=============================================================================// #ifndef RIFF_H #define RIFF_H #pragma once #include "filesystem.h" #include "commonmacros.h" //----------------------------------------------------------------------------- // Purpose: This is a simple abstraction that the RIFF classes use to read from // files/memory //----------------------------------------------------------------------------- class IFileReadBinary { public: virtual FileHandle_t open( const char *pFileName ) = 0; virtual int read( void *pOutput, int size, FileHandle_t file ) = 0; virtual void close( FileHandle_t file ) = 0; virtual void seek( FileHandle_t file, int pos ) = 0; virtual unsigned int tell( FileHandle_t file ) = 0; virtual unsigned int size( FileHandle_t 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; } unsigned int GetFileSize() const { return m_nFileSize; } 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; FileHandle_t m_file; unsigned int m_riffName; unsigned int m_riffSize; unsigned int m_nFileSize; }; //----------------------------------------------------------------------------- // 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 FileHandle_t create( const char *pFileName ) = 0; virtual int write( void *pData, int size, FileHandle_t file ) = 0; virtual void close( FileHandle_t file ) = 0; virtual void seek( FileHandle_t file, int pos ) = 0; virtual unsigned int tell( FileHandle_t 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; FileHandle_t 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 #ifndef WAVE_FORMAT_MP3 #define WAVE_FORMAT_MP3 0x0003 #endif // Used when doing some tests #ifndef WAVE_FORMAT_TEMP #define WAVE_FORMAT_TEMP 0x0004 #endif #endif // RIFF_H