(六)读取波形文件的实例
1.打开文件后,可通过HMMO句柄获得文件中的波形部份:
MMCKINFO mmckinfo;
mmckinfo.fccType = mmioFOURCC('W','A','V','E');
mmioDescend(h, &mmckinfo, NULL, MMIO_FINDRIFF);
经上述调用,mmioDescend函数在句柄h所指向的文件中搜索构造类型为"WAVE"的块的信息,MMCKINFO结构用来接受波形部份信息,该函数调用时会通过检查MMCKINFO结构的fccType的数据来决定需要获得什么构造类型的信息,我们指定函数的wflags参数为MMIO_FINDRIFF,表示需要搜索"RIFF"块信息。
RIFF文件的块信息结构MMCKINFO的定义如下:
typedef struct
{
FOURCC ckid; // 记录块的标识
DWORD cksize; // 记录该块的数据长度,该长度不包含4字节的块标识长度
FOURCC fccType; // 记录块的类型
DWORD dwDataOffset; // 记录块数据成员的首地址距文件头的偏移量
DOWRD dwFlags; // 用来指定块的附加信息,一般为空或MMIO_DIRTY等标记
}MMCKINFO;
2. 得到波形部分的MMCKINFO结构指针后,下一步就是获得波形文件的信息部分:
MMCKINFO mmfmtckinfo;
mmfmtckinfo.ckid = mmioFOURCC('F','M','T',' ');
mmioDescend(h, &mmfmtckinfo, &mmckinfo, MMIO_FINDCHUNCK);
mmioDescend函数可以通过把"RIFF"块mmckinfo作为"父块",以块搜索块的方式搜索到构造类型为"fmt ";搜索到的块信息由mmfmtckinfo对象接受,MMIO_FINDCHUNCK标识表示搜索块信息;
MMCKINFO结构中的fccType成员为四字节数据,如果类型不满4个字符,应该往后面添加空格。
得到了fmt部分的MMCKINFO指针后需要通过mmfmtckinfo得到PCMWAVEFORMAT结构:
PCMWAVEROMAT wformat;
mmioRead(h, &wformat, mmfmtckinfo.cksize);
当文件指针指到多媒体文件的mmfmtckinfo部分,函数会自动搜索到需要读入的PCMWAVEFORMT结构首地址,并按首地址顺次向wformat填mmfmtckinfo.cksize大小的字符数。
3. 如果还需要得到波形文件的数据信息,也就是说,要得到data部分信息,也可以通过调用mmioDescend函数得以实现。实现的第一步使文件的当前位置退回到mmckinfo块的位置:
mmioAscend(h, &mmfmtckinfo, 0);
然后需要声明一个对象mmdatainfo,并把该对象的fccType成员设置为"data"类型。通过mmioDescend函数搜索到data部分的地址:
MMCKINFO mmdatainfo;
mmdatainfo.ckid = mmioFOURCC('d','a', 't', 'a');
mmioDescend(h, &mmdatainfo, &mmckinfo, MMIO_FINDCHUNK);
HGLOBAL hdata;
LPSTR pdata;
hdata = GlobalAlloc(GMEM_MOVEALBE, mmdatainfo.cksize);
pdata = (LPSTR)GlobalLock(hdata);
mmioRead(h, pdata, mmdatainfo.cksize);