// CWaveFile.h: interface for the CWaveFile class.
//

/**///////////////////////////////////////////////////////////////////////
#pragma once

#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")

#define tStatus enum _enumStatus
#define tSeekOrigin enum _enumSeekOrigin
class CWaveFile

...{
public:

enum _enumStatus...{
status_close = 0,
status_write,
status_read,
};


enum _enumSeekOrigin...{
seek_begin,
seek_current,
seek_end,
};

public:
CWaveFile();
virtual ~CWaveFile();

public:
BOOL Create(LPCTSTR sFileName, WAVEFORMATEX * pFmt);
void Close();

BOOL WriteData(void * pData, DWORD dwSize, DWORD dwSamples = 0);
int Seek(int iOffset, tSeekOrigin origin = seek_begin);


DWORD GetSampleCount() ...{ return m_dwSamples; }

protected:
HMMIO m_hmmio;
tStatus m_nStatus;
MMCKINFO m_ckRIFF;
MMCKINFO m_ckData;
MMCKINFO m_ckFact;
DWORD m_dwSamples;
};

// WaveFile.cpp: implementation of the CWaveFile class.
//

/**///////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "WaveFile.h

#define MM_SUCC(x) (MMSYSERR_NOERROR == (x))
#define MM_FAILED(x) (MMSYSERR_NOERROR != (x))
#define CHECK_MMERR(x) CHECK_BOOL(MM_SUCC(x))
#define CHECK_BOOL(x) {if (!(x)) return FALSE; }


/**///////////////////////////////////////////////////////////////////////
// Construction/Destruction

/**///////////////////////////////////////////////////////////////////////
static FOURCC g_fccWave = mmioFOURCC('W', 'A', 'V', 'E');
static FOURCC g_fccFmt = mmioFOURCC('f', 'm', 't', ' ');
static FOURCC g_fccFact = mmioFOURCC('f', 'a', 'c', 't');
static FOURCC g_fccData = mmioFOURCC('d', 'a', 't', 'a');

CWaveFile::CWaveFile()

...{
m_hmmio = 0;
m_nStatus = status_close;
m_dwSamples = 0;
}

CWaveFile::~CWaveFile()

...{
}

BOOL CWaveFile::Create(LPCTSTR sFileName, WAVEFORMATEX * pFmt)

...{
Close();

m_hmmio = mmioOpen((char*) sFileName, NULL,MMIO_CREATE | MMIO_READWRITE | MMIO_EXCLUSIVE | MMIO_ALLOCBUF);
CHECK_BOOL(m_hmmio);

m_ckRIFF.fccType = g_fccWave;
m_ckRIFF.cksize = 0L;
CHECK_MMERR(mmioCreateChunk(m_hmmio, &m_ckRIFF, MMIO_CREATERIFF));

LONG lFmtSize = sizeof WAVEFORMATEX + pFmt->cbSize;
CopyMemory(m_bufFmt.GetBuf(lFmtSize), pFmt, lFmtSize);
MMCKINFO ckFmt;
ckFmt.ckid = g_fccFmt;
ckFmt.cksize = 0L;
CHECK_MMERR(mmioCreateChunk(m_hmmio, &ckFmt, 0));
CHECK_BOOL(lFmtSize == mmioWrite(m_hmmio, (HPSTR)m_bufFmt.GetData(), lFmtSize));
CHECK_MMERR(mmioAscend(m_hmmio, &ckFmt, 0));

m_ckFact.ckid = g_fccFact;
m_ckFact.cksize = 0L;
CHECK_MMERR(mmioCreateChunk(m_hmmio, &m_ckFact, 0));
m_dwSamples = 0L;
CHECK_BOOL(sizeof DWORD == mmioWrite(m_hmmio, (HPSTR)&m_dwSamples, sizeof DWORD));
CHECK_MMERR(mmioAscend(m_hmmio, &m_ckFact, 0));

m_ckData.ckid = g_fccData;
m_ckData.cksize = 0L;
CHECK_MMERR(mmioCreateChunk(m_hmmio, &m_ckData, 0));

m_nStatus = status_write;
return TRUE;
}

BOOL CWaveFile::WriteData(void * pData, DWORD dwSize, DWORD dwSamples)

...{
CHECK_BOOL(m_hmmio);
CHECK_BOOL((LONG) dwSize == mmioWrite(m_hmmio, (HPSTR)pData, dwSize));
m_dwSamples += dwSamples;
return TRUE;
}

int CWaveFile::Seek(int iOffset, tSeekOrigin origin)

...{
CHECK_BOOL(m_hmmio);
if (seek_begin == origin)
return mmioSeek(m_hmmio, iOffset + m_ckData.dwDataOffset, SEEK_SET);
else if (seek_current == origin)
return mmioSeek(m_hmmio, iOffset, SEEK_CUR);
else if (seek_current == origin)
return mmioSeek(m_hmmio, iOffset + m_ckData.dwDataOffset + m_ckData.cksize, SEEK_SET);
else;
return mmioSeek(m_hmmio, 0, SEEK_CUR);
}

void CWaveFile::Close()

...{
if (m_hmmio)

...{
if (status_write == m_nStatus)

...{
mmioAscend(m_hmmio, &m_ckData, 0);
mmioAscend(m_hmmio, &m_ckRIFF, 0);
mmioSeek(m_hmmio, m_ckFact.dwDataOffset, SEEK_SET);
mmioWrite(m_hmmio, (HPSTR)&m_dwSamples, sizeof(DWORD));
}
else if (status_read == m_nStatus)

...{
mmioAscend(m_hmmio, &m_ckData, 0);
mmioAscend(m_hmmio, &m_ckRIFF, 0);
}

mmioClose(m_hmmio, 0);
m_hmmio = 0;
m_nStatus = status_close;
m_dwSamples = 0;
}
}

这儿没有列出读WAV文件的代码. 具体的mmio系列函数的说明可参考MSDN.
具体用法:
CWaveFile waveFile;
waveFile.Create(fileName, &waveFormat);
waveFile.WriteData(buffer, length);
waveFile.Close();
发表于 @ 2007年06月15日 13:35:00|评论(loading...)|编辑