diff options
Diffstat (limited to 'public/xwvfile.h')
| -rw-r--r-- | public/xwvfile.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/public/xwvfile.h b/public/xwvfile.h new file mode 100644 index 0000000..c27bad0 --- /dev/null +++ b/public/xwvfile.h @@ -0,0 +1,85 @@ +//========= 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 |