首先将问题一分为两:
(1)目标:我想创建一个wav文件,用mmio系列低级函数或用CFile(2)我自己写了个函数aa(...),在按钮的响应函数里调用,每次按两下都会出错:
---------------------------
aa: aa.exe - 应用程序错误
---------------------------
"0x7c95426d" 指令引用的 "0x00000000" 内存。该内存不能为 "read"。
要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定 取消
---------------------------
bool bb::cc(char* pFile,char* pData,int nChannel)
{
int SizeOfFile=strlen(pData);
//pFile中是保存的文件名,pData中的是波形数据,,nChannle指明保存为单/双通道?,
//下面一些未申明的数据是类的成员变量,未做说明
WAVEFORMATEX wf;
MMCKINFO* lpMmck;
HMMIO hmmio;
lpMmck=new MMCKINFO;
memset(lpMmck,0,sizeof(MMCKINFO));
hmmio=mmioOpen((LPSTR)pFile, NULL,MMIO_CREATE | MMIO_WRITE | MMIO_ALLOCBUF);
if(!hmmio){
return false;
}
/////////////////////////////////////////////////////////////////////////////// lpMmck[0].fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (MMSYSERR_NOERROR != mmioCreateChunk(hmmio, &lpMmck[0], MMIO_CREATERIFF)){
//创建块
mmioClose(hmmio, 0);
return false;
}//创建后,文件指针移动到块头偏移12Bytes处,因创建的是RIFF块,即“WAVE”后///////////////////////////////////////////////////////////////////////////////
lpMmck[1].ckid = mmioFOURCC('f', 'm', 't', ' ');
lpMmck[1].cksize = sizeof(WAVEFORMATEX);
if (MMSYSERR_NOERROR != mmioCreateChunk(hmmio, &lpMmck[1], 0)){
//创建块
mmioClose(hmmio, 0);
return false;
}//创建后,文件指针移动到块头偏移8Bytes处,因创建的不是RIFF或LIST块,
return true;
}
(1)目标:我想创建一个wav文件,用mmio系列低级函数或用CFile(2)我自己写了个函数aa(...),在按钮的响应函数里调用,每次按两下都会出错:
---------------------------
aa: aa.exe - 应用程序错误
---------------------------
"0x7c95426d" 指令引用的 "0x00000000" 内存。该内存不能为 "read"。
要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定 取消
---------------------------
bool bb::cc(char* pFile,char* pData,int nChannel)
{
int SizeOfFile=strlen(pData);
//pFile中是保存的文件名,pData中的是波形数据,,nChannle指明保存为单/双通道?,
//下面一些未申明的数据是类的成员变量,未做说明
WAVEFORMATEX wf;
MMCKINFO* lpMmck;
HMMIO hmmio;
lpMmck=new MMCKINFO;
memset(lpMmck,0,sizeof(MMCKINFO));
hmmio=mmioOpen((LPSTR)pFile, NULL,MMIO_CREATE | MMIO_WRITE | MMIO_ALLOCBUF);
if(!hmmio){
return false;
}
/////////////////////////////////////////////////////////////////////////////// lpMmck[0].fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (MMSYSERR_NOERROR != mmioCreateChunk(hmmio, &lpMmck[0], MMIO_CREATERIFF)){
//创建块
mmioClose(hmmio, 0);
return false;
}//创建后,文件指针移动到块头偏移12Bytes处,因创建的是RIFF块,即“WAVE”后///////////////////////////////////////////////////////////////////////////////
lpMmck[1].ckid = mmioFOURCC('f', 'm', 't', ' ');
lpMmck[1].cksize = sizeof(WAVEFORMATEX);
if (MMSYSERR_NOERROR != mmioCreateChunk(hmmio, &lpMmck[1], 0)){
//创建块
mmioClose(hmmio, 0);
return false;
}//创建后,文件指针移动到块头偏移8Bytes处,因创建的不是RIFF或LIST块,
return true;
}
偏移量 字节 资料
0000 4 「RIFF」
0004 4 波形块的大小(文件大小减8)
0008 4 「WAVE」
000C 4 「fmt 」
0010 4 格式块的大小(16字节)
0014 2 wf.wFormatTag = WAVE_FORMAT_PCM = 1
0016 2 wf.nChannels
0018 4 wf.nSamplesPerSec
001C 4 wf.nAvgBytesPerSec
0020 2 wf.nBlockAlign
0022 2 wf.wBitsPerSample
0024 4 「data」
0028 4 波形资料的大小
002C 波形资料
=====================================================
. . .
mmioSeek(hmmio,0,SEEK_END);
mmioWrite(hmmio,pData,SizeOfFile);
//以上最后一句竟不能定位到已有的wav末尾插入...而是插入在了头文件之后,就算mmioWrite具有
覆特性,但至少mmioSeek已经定位到后面去了呀.