86 lines
2.2 KiB
C
86 lines
2.2 KiB
C
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
//=============================================================================
|
||
|
|
||
|
#ifndef XWVFILE_H
|
||
|
#define XWVFILE_H
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#pragma pack(1)
|
||
|
|
||
|
#define XWV_ID (('X'<<24)|('W'<<16)|('V'<<8)|(' '<<0))
|
||
|
#define XWV_VERSION 4
|
||
|
|
||
|
enum xwvSampleRate_t
|
||
|
{
|
||
|
XWV_RATE_11025 = 0,
|
||
|
XWV_RATE_22050 = 1,
|
||
|
XWV_RATE_44100 = 2,
|
||
|
};
|
||
|
|
||
|
enum xwvFormat_t
|
||
|
{
|
||
|
XWV_FORMAT_PCM = 0,
|
||
|
XWV_FORMAT_XMA = 1,
|
||
|
XWV_FORMAT_ADPCM = 2,
|
||
|
};
|
||
|
|
||
|
// generated in big-endian
|
||
|
struct xwvHeader_t
|
||
|
{
|
||
|
unsigned int id;
|
||
|
unsigned int version;
|
||
|
unsigned int headerSize; // header only
|
||
|
unsigned int staticDataSize; // follows header
|
||
|
unsigned int dataOffset; // start of samples, possibly sector aligned
|
||
|
unsigned int dataSize; // length of samples in bytes
|
||
|
unsigned int numDecodedSamples; // for duration calcs
|
||
|
int loopStart; // -1 = no loop, offset of loop in samples
|
||
|
unsigned short loopBlock; // the xma block where the loop starts
|
||
|
unsigned short numLeadingSamples; // number of leading samples in the loop block to discard
|
||
|
unsigned short numTrailingSamples; // number of trailing samples at the final block to discard
|
||
|
unsigned short vdatSize; // follows seek table
|
||
|
byte format;
|
||
|
byte bitsPerSample;
|
||
|
byte sampleRate;
|
||
|
byte channels;
|
||
|
byte quality;
|
||
|
byte bHasSeekTable; // indicates presence, follows header
|
||
|
byte padding[2]; // created as 0
|
||
|
|
||
|
inline unsigned int GetPreloadSize() { return headerSize + staticDataSize; }
|
||
|
|
||
|
inline int GetBitsPerSample() const { return bitsPerSample; }
|
||
|
|
||
|
int GetSampleRate() const
|
||
|
{
|
||
|
int rates[] = {11025, 22050, 44100};
|
||
|
int rate = sampleRate;
|
||
|
return rates[rate];
|
||
|
}
|
||
|
|
||
|
inline int GetChannels() const { return channels; }
|
||
|
|
||
|
void SetSampleRate( int sampleRateIn )
|
||
|
{
|
||
|
byte rate = ( sampleRateIn == 11025 ) ? XWV_RATE_11025 : ( sampleRateIn==22050 )? XWV_RATE_22050 : XWV_RATE_44100;
|
||
|
sampleRate = rate;
|
||
|
}
|
||
|
|
||
|
inline void SetChannels( int channelsIn ) { channels = channelsIn; }
|
||
|
|
||
|
inline int GetSeekTableSize()
|
||
|
{
|
||
|
// seek table is indexed by packets
|
||
|
return bHasSeekTable ? ( dataSize / 2048 ) * sizeof( int ) : 0;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
#pragma pack()
|
||
|
|
||
|
#endif // XWVFILE_H
|