函数描述:完成写wave文件头功能
参数说明:buffer---保存文件头信息的内存
dwSize---返回头信息的长度
dwDataLength---wave数据的长度
waveformatex---WAVEFORMATEX结构体,文件格式描述
void WriteWavHeader(BYTE* buffer, DWORD& dwSize, DWORD dwDataLength, const WAVEFORMATEX& waveformatex)
{
BYTE* tempBuffer = buffer;
DWORD dwOffset = 0;
memcpy(tempBuffer, "RIFF", 4);
tempBuffer += 4;
dwOffset += 4;
DWORD dwWaveBlockLen = dwDataLength + 20 + sizeof(WAVEFORMATEX);
BYTE szWaveBlockLen[4] = {0};
szWaveBlockLen[0] = (BYTE)dwWaveBlockLen;
szWaveBlockLen[1] = (BYTE)(dwWaveBlockLen>>8);
szWaveBlockLen[2] = (BYTE)(dwWaveBlockLen>>16);
szWaveBlockLen[3] = (BYTE)(dwWaveBlockLen>>24);
memcpy(tempBuffer, szWaveBlockLen, 4);
tempBuffer += 4;
dwOffset += 4;
memcpy(tempBuffer, "WAVE", 4);
tempBuffer += 4;
dwOffset += 4;
BYTE szWaveFlag[4] = {0x66, 0x6D, 0x74, 0x20}; // "FMT"
memcpy(tempBuffer, szWaveFlag, 4);
tempBuffer += 4;
dwOffset += 4;
DWORD dwFormatLen = sizeof(WAVEFORMATEX);
BYTE szFormatLen[4] = {0}; // 长度为18
szFormatLen[0] = (BYTE)dwFormatLen;
szFormatLen[1] = (BYTE)(dwFormatLen>>8);
szFormatLen[2] = (BYTE)(dwFormatLen>>16);
szFormatLen[3] = (BYTE)(dwFormatLen>>24);
memcpy(tempBuffer, szFormatLen, 4);
tempBuffer += 4;
dwOffset += 4;
BYTE szFormatTag[2] = {0x01, 0x00};
szFormatTag[0] = (BYTE)waveformatex.wFormatTag;
szFormatTag[1] = (BYTE)(waveformatex.wFormatTag>>8);
memcpy(tempBuffer, szFormatTag, 2);
tempBuffer += 2;
dwOffset += 2;
BYTE szChannels[2] = {0x01, 0x00};
szChannels[0] = (BYTE)waveformatex.nChannels;
szChannels[1] = (BYTE)(waveformatex.nChannels>>8);
memcpy(tempBuffer, szChannels, 2);
tempBuffer += 2;
dwOffset += 2;
BYTE szSamplesPerSec[4] = {0};
szSamplesPerSec[0] = (BYTE)waveformatex.nSamplesPerSec;
szSamplesPerSec[1] = (BYTE)(waveformatex.nSamplesPerSec >> 8);
szSamplesPerSec[2] = (BYTE)(waveformatex.nSamplesPerSec >> 16);
szSamplesPerSec[3] = (BYTE)(waveformatex.nSamplesPerSec >> 24);
memcpy(tempBuffer, szSamplesPerSec, 4);
tempBuffer += 4;
dwOffset += 4;
BYTE szAvgBytesPerSec[4] = {0};
szAvgBytesPerSec[0] = (BYTE)waveformatex.nAvgBytesPerSec;
szAvgBytesPerSec[1] = (BYTE)(waveformatex.nAvgBytesPerSec >> 8);
szAvgBytesPerSec[2] = (BYTE)(waveformatex.nAvgBytesPerSec >> 16);
szAvgBytesPerSec[3] = (BYTE)(waveformatex.nAvgBytesPerSec >> 24);
memcpy(tempBuffer, szAvgBytesPerSec, 4);
tempBuffer += 4;
dwOffset += 4;
BYTE szBlockAlign[2] = {0};
szBlockAlign[0] = (BYTE)waveformatex.nBlockAlign;
szBlockAlign[1] = (BYTE)(waveformatex.nBlockAlign >> 8);
memcpy(tempBuffer, szBlockAlign, 2);
tempBuffer += 2;
dwOffset += 2;
BYTE szBitsPerSample[2] = {0};
szBitsPerSample[0] = (BYTE)waveformatex.wBitsPerSample;
szBitsPerSample[1] = (BYTE)(waveformatex.wBitsPerSample >> 8);
memcpy(tempBuffer, szBitsPerSample, 2);
tempBuffer += 2;
dwOffset += 2;
BYTE szSize[2] = {0};
szSize[0] = (BYTE)waveformatex.cbSize;
szSize[1] = (BYTE)(waveformatex.cbSize >> 8);
memcpy(tempBuffer, szSize, 2);
tempBuffer += 2;
dwOffset += 2;
memcpy(tempBuffer, "data", 4);
tempBuffer += 4;
dwOffset += 4;
BYTE szDataLen[4] = {0};
szDataLen[0] = (BYTE)(dwDataLength);
szDataLen[1] = (BYTE)(dwDataLength>>8);
szDataLen[2] = (BYTE)(dwDataLength>>16);
szDataLen[3] = (BYTE)(dwDataLength>>24);
memcpy(tempBuffer, szDataLen, 4);
tempBuffer += 4;
dwOffset += 4;
dwSize = dwOffset;
}