首先将问题一分为两:
(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.   

    1、建立WAV文件,按它的标准格式即可,如下;2、空白内容可以用静音表示,8位时为 128,16位时为 0。具体的可以看《Windows程序设计》的第21章:声音与音乐=====================================================
    偏移量 字节 资料
    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 波形资料
    =====================================================
      

  2.   

    我有代码,给我发e-mail:[email protected]
      

  3.   

    lpMmck[1].ckid = mmioFOURCC('d', 'a', 't', 'a');
     .  .  .
     mmioSeek(hmmio,0,SEEK_END);
     mmioWrite(hmmio,pData,SizeOfFile);
     //以上最后一句竟不能定位到已有的wav末尾插入...而是插入在了头文件之后,就算mmioWrite具有
     覆特性,但至少mmioSeek已经定位到后面去了呀.