static void write_wav_header(UINT32 totalDataLen,UINT8 channels,UINT32 samplerate,UINT32 byterate,UINT32 totalAudioLen)
{
unsigned char header[44];
//RIFF WAVE Chunk
// RIFF标记占据四个字节
header[0] = 'R';
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
//数据大小表示,由于原始数据为long型,通过四次计算得到长度
header[4] = (unsigned char) (totalDataLen & 0xff);
header[5] = (unsigned char) ((totalDataLen >> 8) & 0xff);
header[6] = (unsigned char) ((totalDataLen >> 16) & 0xff);
header[7] = (unsigned char) ((totalDataLen >> 24) & 0xff);
//WAVE标记占据四个字节
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
//FMT Chunk
header[12] = 'f';
// 'fmt '标记符占据四个字节
header[13] = 'm';
header[14] = 't';
header[15] = ' ';//过渡字节
//数据大小
header[16] = 16; // 4 bytes: size of 'fmt ' chunk
header[17] = 0;
header[18] = 0;
header[19] = 0;
//编码方式 10H为PCM编码格式
header[20] = 1; // format = 1
header[21] = 0;
//通道数
header[22] = (unsigned char) channels;
header[23] = 0;
//采样率,每个通道的播放速度
header[24] = (unsigned char) (samplerate & 0xff);
header[25] = (unsigned char) ((samplerate >> 8) & 0xff);
header[26] = (unsigned char) ((samplerate >> 16) & 0xff);
header[27] = (unsigned char) ((samplerate >> 24) & 0xff);
//音频数据传送速率,采样率*通道数*采样深度/8
header[28] = (unsigned char) (byterate & 0xff);
header[29] = (unsigned char) ((byterate >> 8) & 0xff);
header[30] = (unsigned char) ((byterate >> 16) & 0xff);
header[31] = (unsigned char) ((byterate >> 24) & 0xff);
// 确定系统一次要处理多少个这样字节的数据,确定缓冲区,通道数*采样位数
header[32] = (unsigned char) (1 * 16 / 8);
header[33] = 0;
//每个样本的数据位数
header[34] = 16;
header[35] = 0;
//Data chunk
header[36] = 'd';//data标记符
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
//数据长度
header[40] = (unsigned char) (totalAudioLen & 0xff);
header[41] = (unsigned char) ((totalAudioLen >> 8) & 0xff);
header[42] = (unsigned char) ((totalAudioLen >> 16) & 0xff);
header[43] = (unsigned char) ((totalAudioLen >> 24) & 0xff);
write(fd,header,44);
}
在pcm的文件中插入以上的头就可以播放pcm数据,