191 lines
5.4 KiB
C++
191 lines
5.4 KiB
C++
//========= 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
|