diff options
Diffstat (limited to 'engine/audio/private/voice_wavefile.cpp')
| -rw-r--r-- | engine/audio/private/voice_wavefile.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/engine/audio/private/voice_wavefile.cpp b/engine/audio/private/voice_wavefile.cpp new file mode 100644 index 0000000..f4e554c --- /dev/null +++ b/engine/audio/private/voice_wavefile.cpp @@ -0,0 +1,119 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#undef fopen +#include <stdio.h> +#include "voice_wavefile.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +static unsigned long ReadDWord(FILE * fp) +{ + unsigned long ret; + fread( &ret, 4, 1, fp ); + return ret; +} + +static unsigned short ReadWord(FILE * fp) +{ + unsigned short ret; + fread( &ret, 2, 1, fp ); + return ret; +} + +static void WriteDWord(FILE * fp, unsigned long val) +{ + fwrite( &val, 4, 1, fp ); +} + +static void WriteWord(FILE * fp, unsigned short val) +{ + fwrite( &val, 2, 1, fp ); +} + + + +bool ReadWaveFile( + const char *pFilename, + char *&pData, + int &nDataBytes, + int &wBitsPerSample, + int &nChannels, + int &nSamplesPerSec) +{ + FILE * fp = fopen(pFilename, "rb"); + if(!fp) + return false; + + fseek( fp, 22, SEEK_SET ); + + nChannels = ReadWord(fp); + nSamplesPerSec = ReadDWord(fp); + + fseek(fp, 34, SEEK_SET); + wBitsPerSample = ReadWord(fp); + + fseek(fp, 40, SEEK_SET); + nDataBytes = ReadDWord(fp); + ReadDWord(fp); + pData = new char[nDataBytes]; + if(!pData) + { + fclose(fp); + return false; + } + fread(pData, nDataBytes, 1, fp); + fclose( fp ); + return true; +} + +bool WriteWaveFile( + const char *pFilename, + const char *pData, + int nBytes, + int wBitsPerSample, + int nChannels, + int nSamplesPerSec) +{ + FILE * fp = fopen(pFilename, "wb"); + if(!fp) + return false; + + // Write the RIFF chunk. + fwrite("RIFF", 4, 1, fp); + WriteDWord(fp, 0); + fwrite("WAVE", 4, 1, fp); + + + // Write the FORMAT chunk. + fwrite("fmt ", 4, 1, fp); + + WriteDWord(fp, 0x10); + WriteWord(fp, 1); // WAVE_FORMAT_PCM + WriteWord(fp, (unsigned short)nChannels); + WriteDWord(fp, (unsigned long)nSamplesPerSec); + WriteDWord(fp, (unsigned long)((wBitsPerSample / 8) * nChannels * nSamplesPerSec)); + WriteWord(fp, (unsigned short)((wBitsPerSample / 8) * nChannels)); + WriteWord(fp, (unsigned short)wBitsPerSample); + + // Write the DATA chunk. + fwrite("data", 4, 1, fp); + WriteDWord(fp, (unsigned long)nBytes); + fwrite(pData, nBytes, 1, fp); + + + // Go back and write the length of the riff file. + unsigned long dwVal = ftell(fp) - 8; + fseek( fp, 4, SEEK_SET ); + WriteDWord(fp, dwVal); + + fclose(fp); + return true; +} + + |