通过waveInOpen等系列函数采集的声音,如何把保存为WAV格式的文件?谢谢

解决方案 »

  1.   

    http://www.codeproject.com/audio/fister.asp
      

  2.   

    #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);
    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;
    }
      

  3.   

    static FOURCC g_fccWave = mmioFOURCC('W', 'A', 'V', 'E');
    ....#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))