+void
+put_int4 (char* p, unsigned int n)
+{
+ *p = n & 0xFF;
+ *(p+1) = 0xFF & (n >> 8);
+ *(p+2) = 0xFF & (n >> 16);
+ *(p+3) = 0xFF & (n >> 24);
+}
+
+void
+put_int2 (char* p, unsigned short int n)
+{
+ *p = n & 0xFF;
+ *(p+1) = 0xFF & (n >> 8);
+}
+
+bool
+WavFile::fill_header ()
+{
+ char* pData = reinterpret_cast<char*> (m_data);
+
+ strncpy (pData, "RIFF", 4);
+
+ // Length of file after 8 byte header
+ put_int4 (pData + 4, 36 + m_nDataBytes);
+
+ strncpy (pData + 8, "WAVEfmt ", 8);
+
+ // Length of header block
+ put_int4 (pData + 16, 0x10);
+
+ // Always 1
+ put_int2 (pData + 20, 1);
+
+ /* Number of channels */
+ put_int2 (pData + 22, m_nChannels);
+
+ // Sample Rate
+ put_int4 (pData + 24, static_cast<int> (m_rate + 0.5));
+
+ // Bytes per second
+ put_int4 (pData + 28, static_cast<int> (m_rate * m_nBytesPerSample + 0.5));
+
+ // Bytes per sample
+ put_int2 (pData + 32, m_nBytesPerSample * m_nChannels);
+
+ // Bits per sample
+ put_int2 (pData + 34, m_nBitsPerSample);
+
+ strncpy (pData + 36, "data", 4);
+
+ put_int4 (pData + 40, m_nDataBytes);
+
+ return true;
+}
+