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

85 lines
2.5 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