【VC开源代码栏目提醒】:以下是网学会员为您推荐的VC开源代码-WaveFile.cpp,希望本篇文章对您学习有所帮助。
#include "stdafx.h"
#include "WaveFile.h"
CWaveFile::CWaveFile():
hmmio(0), wfex(0)
{
}
CWaveFile::~CWaveFile()
{
Close();
}
bool CWaveFile::Open(const char *path)
{
hmmio = mmioOpen((char *)path, NULL, MMIO_ALLOCBUF | MMIO_READ);
if (hmmio == NULL)
return false;
// 将输入档移动到'RIFF'区块
if (mmioDescend(hmmio, &ckInRIFF, NULL, 0) != 0)
return false;
// 判断输入档是否为WAVE文件
if ((ckInRIFF.ckid != FOURCC_RIFF)
|| (ckInRIFF.fccType != mmioFOURCC('W', 'A', 'V', 'E')))
return false;
// 搜寻输入档的'fmt'区块
ckIn.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(hmmio, &ckIn, &ckInRIFF, MMIO_FINDCHUNK) != 0)
return false;
// 假设'fmt'区块的大小至少有<PCMWAVEFORMAT>的程度
if (ckIn.cksize < sizeof(PCMWAVEFORMAT))
return false; // 'fmt'区块太小
wfex = (WAVEFORMATEX *)new char[ckIn.cksize];
if (wfex == 0) // 因为VC++“不是标准”所以没有传回异常
return false;
// 将'fmt'区块读进<wfex>
if (mmioRead(hmmio, (HPSTR)wfex, ckIn.cksize) != (LONG)ckIn.cksize)
return false;
// 跳出'fmt'区块
if (mmioAscend(hmmio, &ckIn, 0) != 0)
return false;
return true;
}
bool CWaveFile::StartRead()
{
if (mmioSeek(hmmio, ckInRIFF.dwDataOffset + sizeof(FOURCC), SEEK_SET) == -1)
return false;
// 搜寻输入档的'data'区块
ckIn.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(hmmio, &ckIn, &ckInRIFF, MMIO_FINDCHUNK) != 0)
return false; // 没有data区块
return true;
}
bool CWaveFile::Read(unsigned long size, void *data, unsigned long *nread)
{
int result = mmioRead(hmmio, (HPSTR)data, size);
if (result == -1)
return false;
*nread = (unsigned)result;
return true;
}
bool CWaveFile::Close()
{
delete[] (char *)wfex;
wfex = 0;
if (hmmio != NULL)
return mmioClose(hmmio, 0) == 0;
return true;
}