summaryrefslogtreecommitdiff
path: root/engine/audio/private/voice_wavefile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/audio/private/voice_wavefile.cpp')
-rw-r--r--engine/audio/private/voice_wavefile.cpp119
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;
+}
+
+