Wave文件读取(纯C版)

主要用来理解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;//返回数据指针地址
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值