主要用来理解wav文件格式,
RIFF WAVE Chunk, Format Chunk, Fact Chunk, Data Chunk四个块的结构
未使用handle,CreateFile,ReadFile,感觉多余
//返回波形数据指针
LPSTR loadwav(char *filename,DWORD * blocksize,WAVEFORMATEX* wfx)
{
FILE *hFile;
DWORD size = 0;
char* block = NULL;
char id[5];
//以二进制打开文件
hFile = fopen(filename, "rb");
fseek(hFile, 16, SEEK_SET); //RIFF WAVE Chunk和Format Chunk的 ID共16字节,没什么大用,跳过
fread(&size, sizeof(long int), 1, hFile);//Format块的大小,由于可能是16或18,特别处理
//读取wfx结构
fread(&(wfx->wFormatTag), 2, 1, hFile);
fread(&(wfx->nChannels),2,1,hFile);
fread(&(wfx->nSamplesPerSec), 4, 1, hFile);
fread(&(wfx->nAvgBytesPerSec), 4, 1, hFile);
fread(&(wfx->nBlockAlign), 2, 1, hFile);
fread(&(wfx->wBitsPerSample), 2, 1, hFile);
//size决定了补充数据是否存在
if (size == 18)
fread(&(wfx->cbSize), 2, 1, hFile);
else
wfx->cbSize = 0;
//Fact块可能不存在,进行判断
fread(id, 4, 1 ,hFile);
if (strcmp(id, "data") != 0)//未优化的strcmp...
{
fread(&size, sizeof(int), 1, hFile);
fseek(hFile, size+4, SEEK_CUR);//跳过Data块ID
}
//下面读取data数据
fread(&size, sizeof(int), 1, hFile);//data大小
block = (char *)malloc(size);
fread(block, sizeof(unsigned char), size, hFile);
fclose(hFile);
*blocksize = size;//记录数据大小
return (char *)block;//返回数据指针地址
}