通过waveInOpen等系列函数采集的声音,如何把保存为WAV格式的文件?谢谢
解决方案 »
- VC SDK下如何设置对话框左上角的图标?
- Windows服务棘手问题
- Runtime Error!
- 点一个按钮弹出一个对话框,我想让对话框在屏幕上我指定的位置弹出来要怎么做啊?
- 使打开文件对话框的怪问题
- 如何将MSDN2003绑定到VC6.0的帮助中去?
- 请教先贤指点:C++和VC界面编程 的经典书籍----电子版(请带我入门!)在线等待!
- 《算法(C++)》读书会
- 一个在控件初始化上的问题。
- 怎么在mfc中实现检索数据的功能
- 为什么我的DrawItem()函数没有被调用?
- 100分求救,在线等。我扩展CListBox类,但MeasureItem函数死活不被触发,而drawitem函数能正常触发请问这是什么原因?
#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);
BOOL Open(LPCTSTR sFileName, WAVEFORMATEX *& pFmt, BOOL bWrite = FALSE);
void Close(); BOOL WriteData(void * pData, DWORD dwSize, DWORD dwSamples = 0);
DWORD ReadData(void * pData, DWORD dwSize);
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;
LDataBuf m_bufFmt;
};
BOOL LWaveFile::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;
}
....#define CHECK_BOOL(x) {if (!(x)) return FALSE; }
#define MM_SUCC(x) (MMSYSERR_NOERROR == (x))
#define MM_FAILED(x) (MMSYSERR_NOERROR != (x))
#define CHECK_MMERR(x) CHECK_BOOL(MM_SUCC(x))