|
发表于 2011-3-12 22:06:35
|
显示全部楼层
/*
RIFF WAVE Chunk
==================================
| |所占字节数| 具体内容 |
==================================
| ID | 4 Bytes | 'RIFF' |
----------------------------------
| Size | 4 Bytes | |
----------------------------------
| Type | 4 Bytes | 'WAVE' |
----------------------------------
*/
__packed struct stRiffHead {
BYTE riffID[4];
DWORD Size;
BYTE waveID[4];
};
/*
Format Chunk
====================================================================
| | 字节数 | 具体内容 |
====================================================================
| ID | 4 Bytes | 'fmt ' |
--------------------------------------------------------------------
| Size | 4 Bytes | 数值为16或18,18则最后又附加信息 |
-------------------------------------------------------------------- ----
| FormatTag | 2 Bytes | 编码方式,一般为0x0001 | |
-------------------------------------------------------------------- |
| Channels | 2 Bytes | 声道数目,1--单声道;2--双声道 | |
-------------------------------------------------------------------- |
| SamplesPerSec | 4 Bytes | 采样频率 | |
-------------------------------------------------------------------- |
| AvgBytesPerSec| 4 Bytes | 每秒所需字节数 | |===> WAVE_FORMAT
-------------------------------------------------------------------- |
| BlockAlign | 2 Bytes | 数据块对齐单位(每个采样需要的字节数) | |
-------------------------------------------------------------------- |
| BitsPerSample | 2 Bytes | 每个采样需要的bit数 | |
-------------------------------------------------------------------- |
| | 2 Bytes | 附加信息(可选,通过Size来判断有无) | |
-------------------------------------------------------------------- ----
*/
__packed struct stFmtChunk {
char fmtID[4];
DWORD Size;
WORD FormatTag;
WORD Channels;
DWORD SamplePerSec;
DWORD AvgBytesPerSec;
WORD BlockAlign;
WORD BitsPerSample;
char Addtional[2];
};
/*
Fact Chunk
==================================
| |所占字节数| 具体内容 |
==================================
| ID | 4 Bytes | 'fact' |
----------------------------------
| Size | 4 Bytes | 数值为4 |
----------------------------------
| data | 4 Bytes | |
----------------------------------
*/
__packed struct stFactBlock {
BYTE factID[4];
DWORD FactSize;
};
__packed struct stDataBlock {
BYTE dataID[4];
DWORD DataSize;
};
struct wavhead
{
struct stFmtChunk fmt;
struct stDataBlock data;
DWORD dataOffset;
};
typedef struct wavhead wavhead;
/********************************************************************************
读取WAV文件头
********************************************************************************/
void LoadWavHead(FIL *file1,wavhead * head)
{
struct stRiffHead riff;
struct stFactBlock fact;
UINT br;
//memcpy(head,0,sizeof(struct wavhead));
f_lseek (file1, 0 );
f_read(file1,(BYTE *)&(riff),sizeof(riff),&br);
if(strncmp((char *)riff.riffID, "RIFF", 4) || strncmp((char *)riff.waveID, "WAVE", 4)) return ;
f_read(file1,(BYTE *)(&head->fmt),sizeof(head->fmt)-2,&br);
if(head->fmt.Size==18)f_read(file1,head->fmt.Addtional,2,&br);
//fact block
f_read(file1,&fact,sizeof(fact),&br);
if(strncmp((char *)fact.factID, "fact", 4))
{
//not factblock,check for data
if(strncmp((char*)fact.factID,"data",4)==0)
{
memcpy(head->data.dataID,fact.factID,4);
head->data.DataSize=fact.FactSize;
head->dataOffset=28+head->fmt.Size;
return ;
}
else return;
}
else {
f_lseek(file1,file1->fptr+fact.FactSize);
}
f_read(file1,&head->data,sizeof(head->data),&br);
if(strncmp((char*)head->data.dataID,"data",4))return;
head->dataOffset=36 + head->fmt.Size + fact.FactSize;
} |
|