我现在的Cpp文件如下:
#include "stdafx.h" BOOL ReadWaveFile(LPCTSTR lpszFileName, MMCKINFO* lpMmck, WAVEFORMATEX* lpWaveFormatEx,
HPSTR* ppData, DWORD* lpDataLength);
BOOL WriteWaveFile(LPCTSTR lpszFileName, MMCKINFO* lpMmck, WAVEFORMATEX* lpWaveFormatEx,
HPSTR* ppData, DWORD* lpDataLength);
BOOL BindWaveData(HPSTR* ppData_Left, HPSTR* ppData_Right, HPSTR* ppData_BindCh, DWORD* lpDataLength);int _tmain(int argc, _TCHAR* argv[])
{
HPSTR* ppData_L = new HPSTR;
HPSTR* ppData_R = new HPSTR;
HPSTR* ppData_Bind = new HPSTR; DWORD* lpDataLength_L = new DWORD;
DWORD* lpDataLength_R = new DWORD;
DWORD* lpDataLength_Bind = new DWORD; WAVEFORMATEX* lpWaveFormatEx_L = new WAVEFORMATEX;
WAVEFORMATEX* lpWaveFormatEx_R = new WAVEFORMATEX;
WAVEFORMATEX* lpWaveFormatEx_Bind = new WAVEFORMATEX; MMCKINFO* lpMmck_L = new MMCKINFO[2];
MMCKINFO* lpMmck_R = new MMCKINFO[2];
MMCKINFO* lpMmck_Bind = new MMCKINFO[2]; ReadWaveFile("E:\\try\\x1.wav", lpMmck_L, lpWaveFormatEx_L, ppData_L, lpDataLength_L );
ReadWaveFile("E:\\try\\x2.wav", lpMmck_R, lpWaveFormatEx_R, ppData_R, lpDataLength_R ); *lpDataLength_Bind = (*lpDataLength_L)*2; memcpy(lpWaveFormatEx_Bind, lpWaveFormatEx_L, sizeof(WAVEFORMATEX));
(*lpWaveFormatEx_Bind).nChannels=2; memcpy(lpMmck_Bind, lpMmck_L, sizeof(MMCKINFO[2]));
lpMmck_Bind[1].cksize = (lpMmck_L[1].cksize)*2;
lpMmck_Bind[0].cksize = lpMmck_Bind[1].cksize+38; BindWaveData(ppData_L, ppData_R, ppData_Bind, lpDataLength_Bind);
WriteWaveFile("E:\\try\\x.wav", lpMmck_Bind, lpWaveFormatEx_Bind, ppData_Bind, lpDataLength_Bind ); delete[] lpMmck_L;
delete[] lpMmck_R;
delete[] lpMmck_Bind; delete lpWaveFormatEx_L;
delete lpWaveFormatEx_R;
delete lpWaveFormatEx_Bind; delete[] ppData_L;
delete[] ppData_R;
delete[] ppData_Bind; delete ppData_L;
delete ppData_R;
delete ppData_Bind; delete lpDataLength_L;
delete lpDataLength_R;
delete lpDataLength_Bind; return 0;
}BOOL ReadWaveFile(LPCTSTR lpszFileName, MMCKINFO* lpMmck, WAVEFORMATEX* lpWaveFormatEx,
HPSTR* ppData, DWORD* lpDataLength )
{
HMMIO hmmio; if(!(hmmio = mmioOpen((LPSTR)lpszFileName, NULL,
MMIO_READ | MMIO_ALLOCBUF)))
{
return FALSE;
}
lpMmck[0].fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (mmioDescend(hmmio, &lpMmck[0], NULL, MMIO_FINDRIFF))
{
mmioClose(hmmio, 0);
return FALSE;
}
lpMmck[1].ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(hmmio, &lpMmck[1], &lpMmck[0],
MMIO_FINDCHUNK))
{
mmioClose(hmmio, 0);
return FALSE;
}
long mmio1=mmioRead(hmmio, (HPSTR)lpWaveFormatEx, sizeof(WAVEFORMATEX));
if ( mmio1
!= (LONG) sizeof(WAVEFORMATEX))
{
mmioClose(hmmio, 0);
return FALSE;
}
if ((*lpWaveFormatEx).wFormatTag != WAVE_FORMAT_PCM)
{
mmioClose(hmmio, 0);
return FALSE;
}
mmioAscend(hmmio, &lpMmck[1], 0);
lpMmck[1].ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(hmmio, &lpMmck[1], &lpMmck[0],
MMIO_FINDCHUNK))
{
mmioClose(hmmio, 0);
return FALSE;
}
*lpDataLength = lpMmck[1].cksize;
if ((*lpDataLength) == 0L)
{
mmioClose(hmmio, 0);
return FALSE;
}
delete[] *ppData;
*ppData = new char[*lpDataLength];
if (!(*ppData))
{
mmioClose(hmmio, 0);
return FALSE;
}
unsigned long mmio=mmioRead(hmmio, *ppData, *lpDataLength);
if( mmio!= (LONG) (*lpDataLength))
{
mmioClose(hmmio, 0);
return FALSE;
}
mmioClose(hmmio, 0);
return TRUE;
}BOOL WriteWaveFile(LPCTSTR lpszFileName, MMCKINFO* lpMmck, WAVEFORMATEX* lpWaveFormatEx,
HPSTR* ppData, DWORD* lpDataLength)
{
HMMIO hmmio; if(!(hmmio = mmioOpen((LPSTR)lpszFileName, NULL,
MMIO_CREATE | MMIO_WRITE | MMIO_ALLOCBUF)))
{
return FALSE;
}
lpMmck[0].fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (MMSYSERR_NOERROR !=
mmioCreateChunk(hmmio, &lpMmck[0], MMIO_CREATERIFF))
{
mmioClose(hmmio, 0);
return FALSE;
}
lpMmck[1].ckid = mmioFOURCC('f', 'm', 't', ' ');
lpMmck[1].cksize = sizeof(*lpWaveFormatEx);
if (MMSYSERR_NOERROR !=
mmioCreateChunk(hmmio, &lpMmck[1], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
if (mmioWrite(hmmio, (HPSTR) lpWaveFormatEx, sizeof(*lpWaveFormatEx))
!= sizeof(*lpWaveFormatEx))
{
mmioClose(hmmio, 0);
return FALSE;
}
if (MMSYSERR_NOERROR != mmioAscend(hmmio, &lpMmck[1], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
lpMmck[1].ckid = mmioFOURCC('d', 'a', 't', 'a');
if (MMSYSERR_NOERROR != mmioCreateChunk(hmmio, &lpMmck[1], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
if (mmioWrite(hmmio, *ppData, *lpDataLength) != (LONG)(*lpDataLength))
{
mmioClose(hmmio, 0);
return FALSE;
}
if (MMSYSERR_NOERROR != mmioAscend(hmmio, &lpMmck[1], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
lpMmck[0].cksize=(*lpDataLength) + sizeof(WAVEFORMATEX);
if (MMSYSERR_NOERROR !=
mmioAscend(hmmio, &lpMmck[0], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
mmioClose(hmmio, 0); return TRUE;
}BOOL BindWaveData(HPSTR* ppData_Left, HPSTR* ppData_Right, HPSTR* ppData_BindCh, DWORD* lpDataLength)
{
int i, SofSHORT;
DWORD dwDataLength = (*lpDataLength)/2; SofSHORT = sizeof(SHORT);
*ppData_BindCh = new char[*lpDataLength];
for(i=0; i<dwDataLength;i += SofSHORT)
{
*(SHORT*)((*ppData_BindCh)+2*i) = *(SHORT*)((*ppData_Left)+i);
*(SHORT*)((*ppData_BindCh)+2*i+SofSHORT) = *(SHORT*)((*ppData_Right)+i);
}
return 0;
}Stdafx.h:
#pragma once
#include <iostream>
#include <tchar.h>
#include <memory.h>
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib")以上程序可以将两个单声道Wav文件合成为一个双声道Wav文件。在完成以上任务后,我进一步将Cpp文件规范化如上。但是在调试时,总是指示Free.c文件出错或是定义new的那个C文件中某一地方出错。如果将所有Delete语句删除编译就很正常。这是什么原因?
#include "stdafx.h" BOOL ReadWaveFile(LPCTSTR lpszFileName, MMCKINFO* lpMmck, WAVEFORMATEX* lpWaveFormatEx,
HPSTR* ppData, DWORD* lpDataLength);
BOOL WriteWaveFile(LPCTSTR lpszFileName, MMCKINFO* lpMmck, WAVEFORMATEX* lpWaveFormatEx,
HPSTR* ppData, DWORD* lpDataLength);
BOOL BindWaveData(HPSTR* ppData_Left, HPSTR* ppData_Right, HPSTR* ppData_BindCh, DWORD* lpDataLength);int _tmain(int argc, _TCHAR* argv[])
{
HPSTR* ppData_L = new HPSTR;
HPSTR* ppData_R = new HPSTR;
HPSTR* ppData_Bind = new HPSTR; DWORD* lpDataLength_L = new DWORD;
DWORD* lpDataLength_R = new DWORD;
DWORD* lpDataLength_Bind = new DWORD; WAVEFORMATEX* lpWaveFormatEx_L = new WAVEFORMATEX;
WAVEFORMATEX* lpWaveFormatEx_R = new WAVEFORMATEX;
WAVEFORMATEX* lpWaveFormatEx_Bind = new WAVEFORMATEX; MMCKINFO* lpMmck_L = new MMCKINFO[2];
MMCKINFO* lpMmck_R = new MMCKINFO[2];
MMCKINFO* lpMmck_Bind = new MMCKINFO[2]; ReadWaveFile("E:\\try\\x1.wav", lpMmck_L, lpWaveFormatEx_L, ppData_L, lpDataLength_L );
ReadWaveFile("E:\\try\\x2.wav", lpMmck_R, lpWaveFormatEx_R, ppData_R, lpDataLength_R ); *lpDataLength_Bind = (*lpDataLength_L)*2; memcpy(lpWaveFormatEx_Bind, lpWaveFormatEx_L, sizeof(WAVEFORMATEX));
(*lpWaveFormatEx_Bind).nChannels=2; memcpy(lpMmck_Bind, lpMmck_L, sizeof(MMCKINFO[2]));
lpMmck_Bind[1].cksize = (lpMmck_L[1].cksize)*2;
lpMmck_Bind[0].cksize = lpMmck_Bind[1].cksize+38; BindWaveData(ppData_L, ppData_R, ppData_Bind, lpDataLength_Bind);
WriteWaveFile("E:\\try\\x.wav", lpMmck_Bind, lpWaveFormatEx_Bind, ppData_Bind, lpDataLength_Bind ); delete[] lpMmck_L;
delete[] lpMmck_R;
delete[] lpMmck_Bind; delete lpWaveFormatEx_L;
delete lpWaveFormatEx_R;
delete lpWaveFormatEx_Bind; delete[] ppData_L;
delete[] ppData_R;
delete[] ppData_Bind; delete ppData_L;
delete ppData_R;
delete ppData_Bind; delete lpDataLength_L;
delete lpDataLength_R;
delete lpDataLength_Bind; return 0;
}BOOL ReadWaveFile(LPCTSTR lpszFileName, MMCKINFO* lpMmck, WAVEFORMATEX* lpWaveFormatEx,
HPSTR* ppData, DWORD* lpDataLength )
{
HMMIO hmmio; if(!(hmmio = mmioOpen((LPSTR)lpszFileName, NULL,
MMIO_READ | MMIO_ALLOCBUF)))
{
return FALSE;
}
lpMmck[0].fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (mmioDescend(hmmio, &lpMmck[0], NULL, MMIO_FINDRIFF))
{
mmioClose(hmmio, 0);
return FALSE;
}
lpMmck[1].ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(hmmio, &lpMmck[1], &lpMmck[0],
MMIO_FINDCHUNK))
{
mmioClose(hmmio, 0);
return FALSE;
}
long mmio1=mmioRead(hmmio, (HPSTR)lpWaveFormatEx, sizeof(WAVEFORMATEX));
if ( mmio1
!= (LONG) sizeof(WAVEFORMATEX))
{
mmioClose(hmmio, 0);
return FALSE;
}
if ((*lpWaveFormatEx).wFormatTag != WAVE_FORMAT_PCM)
{
mmioClose(hmmio, 0);
return FALSE;
}
mmioAscend(hmmio, &lpMmck[1], 0);
lpMmck[1].ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(hmmio, &lpMmck[1], &lpMmck[0],
MMIO_FINDCHUNK))
{
mmioClose(hmmio, 0);
return FALSE;
}
*lpDataLength = lpMmck[1].cksize;
if ((*lpDataLength) == 0L)
{
mmioClose(hmmio, 0);
return FALSE;
}
delete[] *ppData;
*ppData = new char[*lpDataLength];
if (!(*ppData))
{
mmioClose(hmmio, 0);
return FALSE;
}
unsigned long mmio=mmioRead(hmmio, *ppData, *lpDataLength);
if( mmio!= (LONG) (*lpDataLength))
{
mmioClose(hmmio, 0);
return FALSE;
}
mmioClose(hmmio, 0);
return TRUE;
}BOOL WriteWaveFile(LPCTSTR lpszFileName, MMCKINFO* lpMmck, WAVEFORMATEX* lpWaveFormatEx,
HPSTR* ppData, DWORD* lpDataLength)
{
HMMIO hmmio; if(!(hmmio = mmioOpen((LPSTR)lpszFileName, NULL,
MMIO_CREATE | MMIO_WRITE | MMIO_ALLOCBUF)))
{
return FALSE;
}
lpMmck[0].fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (MMSYSERR_NOERROR !=
mmioCreateChunk(hmmio, &lpMmck[0], MMIO_CREATERIFF))
{
mmioClose(hmmio, 0);
return FALSE;
}
lpMmck[1].ckid = mmioFOURCC('f', 'm', 't', ' ');
lpMmck[1].cksize = sizeof(*lpWaveFormatEx);
if (MMSYSERR_NOERROR !=
mmioCreateChunk(hmmio, &lpMmck[1], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
if (mmioWrite(hmmio, (HPSTR) lpWaveFormatEx, sizeof(*lpWaveFormatEx))
!= sizeof(*lpWaveFormatEx))
{
mmioClose(hmmio, 0);
return FALSE;
}
if (MMSYSERR_NOERROR != mmioAscend(hmmio, &lpMmck[1], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
lpMmck[1].ckid = mmioFOURCC('d', 'a', 't', 'a');
if (MMSYSERR_NOERROR != mmioCreateChunk(hmmio, &lpMmck[1], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
if (mmioWrite(hmmio, *ppData, *lpDataLength) != (LONG)(*lpDataLength))
{
mmioClose(hmmio, 0);
return FALSE;
}
if (MMSYSERR_NOERROR != mmioAscend(hmmio, &lpMmck[1], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
lpMmck[0].cksize=(*lpDataLength) + sizeof(WAVEFORMATEX);
if (MMSYSERR_NOERROR !=
mmioAscend(hmmio, &lpMmck[0], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
mmioClose(hmmio, 0); return TRUE;
}BOOL BindWaveData(HPSTR* ppData_Left, HPSTR* ppData_Right, HPSTR* ppData_BindCh, DWORD* lpDataLength)
{
int i, SofSHORT;
DWORD dwDataLength = (*lpDataLength)/2; SofSHORT = sizeof(SHORT);
*ppData_BindCh = new char[*lpDataLength];
for(i=0; i<dwDataLength;i += SofSHORT)
{
*(SHORT*)((*ppData_BindCh)+2*i) = *(SHORT*)((*ppData_Left)+i);
*(SHORT*)((*ppData_BindCh)+2*i+SofSHORT) = *(SHORT*)((*ppData_Right)+i);
}
return 0;
}Stdafx.h:
#pragma once
#include <iostream>
#include <tchar.h>
#include <memory.h>
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib")以上程序可以将两个单声道Wav文件合成为一个双声道Wav文件。在完成以上任务后,我进一步将Cpp文件规范化如上。但是在调试时,总是指示Free.c文件出错或是定义new的那个C文件中某一地方出错。如果将所有Delete语句删除编译就很正常。这是什么原因?
delete lpDataLength_L;
delete lpDataLength_R;
delete lpDataLength_Bind;
这三项只能delete一项。如果同时delete两项以上,就会报告free.c的void __cdecl _free_base (void * pBlock)函数中的HeapFree(_crtheap, 0, pBlock)出错。冲突发生在反汇编语句“004019A7 pop esi”。
我用的是Visual Studio .net 2003。
delete[] ppData_L;
delete[] ppData_R;
delete[] ppData_Bind;delete ppData_L;
delete ppData_R;
delete ppData_Bind;
改为
delete[] *ppData_L;
delete[] *ppData_R;
delete[] *ppData_Bind; *ppData_L=NULL;
*ppData_R=NULL;
*ppData_Bind=NULL; delete ppData_L;
delete ppData_R;
delete ppData_Bind;
就会一切正常。