This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

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