www.pudn.com > AudioWave.rar > WaveBase.cpp


// WaveBass.cpp : implementation file 
// 
#include  
#include "stdafx.h" 
#include "WaveBase.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CWaveBass 
 
IMPLEMENT_DYNCREATE(CWaveBase, CCmdTarget) 
 
CWaveBase::CWaveBase() 
{ 
	m_Readhmmio=NULL; 
	m_bFileExist=FALSE; 
} 
 
CWaveBase::~CWaveBase() 
{ 
	if(m_bFileExist) 
	{ 
		mmioClose(m_Readhmmio,0); 
	} 
} 
 
 
BEGIN_MESSAGE_MAP(CWaveBase, CCmdTarget) 
	//{{AFX_MSG_MAP(CWaveBass) 
		// NOTE - the ClassWizard will add and remove mapping macros here. 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CWaveBass message handlers 
 
void CWaveBase::Wave_SaveWaveData(char*p, DWORD dataSize) 
{ 
	mmioWrite(m_Savehmmio,p,dataSize); 
} 
/* 
The mmioWrite function writes a specified number of 
bytes to a file opened by using the mmioOpen function. 
LONG mmioWrite( 
  HMMIO hmmio,       
  char _huge* pch,   
  LONG cch           
); 
Parameters 
hmmio  
File handle of the file.  
pch  
Address of the buffer to be written to the file.  
cch  
Number of bytes to write to the file.  
Return Values 
Returns the number of bytes actually written. If there is an error writing to the file, the return value is -1. 
*/ 
 
void CWaveBase::Wave_ReadWaveData(char *p, DWORD &dataSize) 
{ 
	mmioSeek(m_Readhmmio,m_ReadFileOffset,SEEK_SET); 
	dataSize=mmioRead(m_Readhmmio,(HPSTR)p,dataSize); 
	m_ReadFileOffset+=dataSize; 
} 
/* 
function changes the current file position in a file opened by using the mmioOpen function.  
LONG mmioSeek(  HMMIO hmmio,    LONG lOffset,   int iOrigin   );  
Parameters hmmio File handle of the file to seek in.  
lOffset Offset to change the file position.  
iOrigin Flags indicating how the offset specified by  
lOffset is interpreted 
*/ 
/* 
mmioRead function reads a specified number of bytes from  
a file opened by using the mmioOpen function. 
LONG mmioRead(  HMMIO hmmio,    HPSTR pch,      LONG cch      );  
Parameters 
hmmio File handle of the file to be read.  
pch Address of a buffer to contain the data read from the file.  
cch Number of bytes to read from the file.  
*/ 
 
void CWaveBase::Wave_CloseSaveFile()  
{ 
	mmioAscend(m_Savehmmio,&m_mmckinfoData,0); 
	//调mmioAscend函数回填文件头  
	mmioAscend(m_Savehmmio,&m_mmckinfoWave,0); 
	mmioClose(m_Savehmmio,0l); 
} 
/* 
 * The mmioClose function closes a file that was opened by using the mmioOpen function. 
 * MMRESULT mmioClose(  HMMIO hmmio,   UINT wFlags  );  
 * Parameters 
 * hmmio File handle of the file to close.  
 * wFlags Flags for the close operation.  
*/ 
 
BOOL CWaveBase::Wave_PrepareSaveFile(CString mFileName) 
{ 
	//创建声音文件 
    m_Savehmmio=mmioOpen((char *)LPCTSTR(mFileName), 
		NULL, MMIO_CREATE|MMIO_ALLOCBUF|MMIO_WRITE); 
    if (NULL == m_Savehmmio) 
	{ 
		AfxMessageBox("文件名或路径错误"); 
		return (-1); 
	} 
	//写声音文件头 
	m_mmckinfoWave.fccType=mmioFOURCC('W','A','V','E'); 
	m_mmckinfoWave.cksize=0l; 
	mmioCreateChunk(m_Savehmmio,&m_mmckinfoWave,MMIO_CREATERIFF); 
	//创建并初始化fmt子块 
	m_mmckinfoFmt.ckid=mmioFOURCC('f','m','t',' '); 
	m_mmckinfoFmt.cksize=0l; 
	mmioCreateChunk(m_Savehmmio,&m_mmckinfoFmt,0); 
	mmioWrite(m_Savehmmio,(char _huge *)(&m_WaveFormat),(LONG)sizeof(WAVEFORMATEX)); 
	mmioAscend(m_Savehmmio,&m_mmckinfoFmt,0); 
	// 创建fact块 
//	m_mmckinfoFact.ckid=mmioFOURCC('f','a','c','t'); 
//	m_mmckinfoFact.cksize=4; 
//	mmioCreateChunk(m_Savehmmio,&m_mmckinfoFact,0); 
//	mmioWrite(m_Savehmmio,(char _huge *)&m_dwDataSamples,sizeof(DWORD)); 
	//创建data块 
	m_mmckinfoData.ckid=mmioFOURCC('d','a','t','a'); 
	m_mmckinfoData.cksize=m_dwDataSize; 
	mmioCreateChunk(m_Savehmmio,&m_mmckinfoData,0); 
	return TRUE; 
} 
 
BOOL CWaveBase::Wave_OpenFile() 
{ 
	BOOL		werr; 
    MMCKINFO    ckRIFF; 
/* 
	The MMCKINFO structure contains information about a chunk in a RIFF file. 
	typedef struct {  
		FOURCC ckid;  
		DWORD  cksize;  
		FOURCC fccType;  
		DWORD  dwDataOffset;  
		DWORD  dwFlags;  
	} MMCKINFO;  
*/ 
    MMCKINFO    ck; 
    DWORD       dw; 
	if(m_bFileExist) 
	{ 
		mmioClose(m_Readhmmio, 0l); 
	} 
 
	//打开WAV文件 
    werr = FALSE; 
    m_Readhmmio = mmioOpen((char *)LPCTSTR(m_WaveFileName),NULL, MMIO_READ|MMIO_ALLOCBUF); 
    if (NULL == m_Readhmmio) 
	{ 
		goto wio_End; 
	} 
    ckRIFF.fccType = mmioFOURCC('W', 'A', 'V', 'E'); 
 
	//The mmioFOURCC macro converts four characters into a four-character code. 
    if (mmioDescend(m_Readhmmio, &ckRIFF, NULL, MMIO_FINDRIFF)) 
	{ 
		goto wio_Close_End; 
	} 
	m_dFileSize = ckRIFF.cksize; 
 
	//寻找RRIF块 
    while (MMSYSERR_NOERROR == mmioDescend(m_Readhmmio, &ck, &ckRIFF, 0)) 
    { 
        if ((ck.dwDataOffset + ck.cksize) > (ckRIFF.dwDataOffset + ckRIFF.cksize)) 
		{ 
			goto wio_Close_End; 
		} 
		//RRIF的子块 其子块类型可能为:LIST\DISP\FMT\FACT\DATA 
        switch (ck.ckid) 
        { 
            case mmioFOURCC('L', 'I', 'S', 'T'): 
				break; 
            case mmioFOURCC('D', 'I', 'S', 'P'): 
                break; 
            case mmioFOURCC('f', 'm', 't', ' '): 
                //WAV格式参数 
                dw = ck.cksize; 
                if (dw < sizeof(WAVEFORMATEX)) 
                    dw = sizeof(WAVEFORMATEX); 
                dw = ck.cksize; 
                if (mmioRead(m_Readhmmio, (HPSTR)&(m_WaveFormat), dw) != (LONG)dw)goto wio_Close_End; 
                break; 
            case mmioFOURCC('d', 'a', 't', 'a'): 
				m_dwDataOffset=m_ReadFileOffset=ck.dwDataOffset; 
				m_dwDataSize=ck.cksize; 
				werr=TRUE; 
				goto wio_End; 
            case mmioFOURCC('f', 'a', 'c', 't'): 
                break; 
        } 
        mmioAscend(m_Readhmmio, &ck, 0); 
    } 
	wio_Close_End: 
	mmioClose(m_Readhmmio,0l); 
	wio_End: 
	m_bFileExist=werr; 
    return (werr); 
} 
 
void CWaveBase::Wave_CloseReadFile() 
{ 
	mmioClose(m_Readhmmio,0l); 
}