DentistryDoctor的专栏

欢迎大家指正其中的错误

原创 用mmio系列API函数来读写WAV文件收藏

 | 旧一篇: Singleton模式的几种实现方式

 

// 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...)|编辑

 | 旧一篇: Singleton模式的几种实现方式

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © DentistryDoctor