对于录音来说最重要的就是CSoundIn类,下面就是该类的定义:
namespace perdubug { // prevent the name-space pollution
class CSoundIn
{
public:
BOOL __initMic(); // get the best wave format supported by your sound card
// and then i will use the format to capture sound.
void __closeMic();
BOOL __openMic(); // open device and begin to capture with the best format(when
// invoke __initMic function then you will get the best format
// supported by host's sound card
//
// if your want to capture sound and export into a wav file please invoke this function
// to tell me the full path then i will create the wav file.
//
void __createOutputWaveFile(const TCHAR * lpszFileName);
// if you invoke any member function return error/false please
// use this function to get the result...
DWORD __getLastError();
//
// when the capture buffer is filled please invoke this function to 'add buffer'(Actually
// you should create two-circular buffers,when 1st buffer is filled then switch to 2st,1st
// buffer will be wrote into wav file.
//
void AddBuffer();
virtual ~CSoundIn();
friend CSoundIn & theSoundCapture();
private:
BOOL GetBestWaveFormat(WAVEFORMATEX & waveFormatEx);
// because sound card is one and only so i must limit the number of CSoundIn object,
// but how to limit the class object nums?maybe put constructor into private scope is
// a good idea,:-)
CSoundIn();
private:
WAVEINCAPS m_WaveInDevCaps;
HWAVEIN m_WaveIn;
WAVEHDR m_WaveHeader;
WAVEFORMATEX m_WaveFormat;
UINT m_WaveInSampleRate;
int m_NbMaxSamples;
UINT m_SizeRecord;
DWORD m_dwLastError;
enum { MAX_SIZE_INPUT_BUFFER = 1 * 2 * 1024 }; // samples * voie * size_samples
public:
SHORT InputBuffer[MAX_SIZE_INPUT_BUFFER]; // used for int FFT,many GUI application
// want to display sound peak so..
BOOL m_bTerminateThread; // to 'kill' waveCallback function
BOOL m_bImportToWaveFile;
CWaveFile m_waveFile;
};
} // end namespace perdubug
对于将录音保存在WAV文件的工作主要是由CwaveFile类来完成.下面是该类的定义:
//
// Encapsulates reading or writing sound data to or from a wave file
//-----------------------------------------------------------------------------
class CWaveFile
{
public:
WAVEFORMATEX* m_pwfx; // Pointer to WAVEFORMATEX structure
HMMIO m_hmmio; // MM I/O handle for the WAVE
MMCKINFO m_ck; // Multimedia RIFF chunk
MMCKINFO m_ckRiff; // Use in opening a WAVE file
DWORD m_dwSize; // The size of the wave file
MMIOINFO m_mmioinfoOut;
DWORD m_dwFlags;
BOOL m_bIsReadingFromMemory;
BYTE* m_pbData;
BYTE* m_pbDataCur;
ULONG m_ulDataSize;
CHAR* m_pResourceBuffer;
protected:
HRESULT ReadMMIO();
HRESULT WriteMMIO( WAVEFORMATEX *pwfxDest );
public:
CWaveFile();
~CWaveFile();
HRESULT Open( LPCTSTR strFileName, WAVEFORMATEX* pwfx, DWORD dwFlags );
HRESULT OpenFromMemory( BYTE* pbData, ULONG ulDataSize,
WAVEFORMATEX* pwfx, DWORD dwFlags );
HRESULT Close();
HRESULT Read( BYTE* pBuffer, DWORD dwSizeToRead, DWORD* pdwSizeRead );
HRESULT Write( UINT nSizeToWrite, BYTE* pbData, UINT* pnSizeWrote );
DWORD GetSize();
HRESULT ResetFile();
WAVEFORMATEX* GetFormat() { return m_pwfx; };
};
本文地址:http://com.8s8s.com/it/it1196.htm