www.pudn.com > ÓïÒôAudioCap.rar > WaveIn.cpp
// WaveIn.cpp: implementation of the CWaveIn class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "WaveForm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CWaveIn::CWaveIn()
{
m_iRecordDeviceNumber = waveInGetNumDevs();
m_hWaveIn = NULL;
}
CWaveIn::~CWaveIn()
{
}
BOOL CWaveIn::Init(HWND hWnd, int iTime, int iRecordDeviceID, int iSamplingRate, int iChannel, int iBits)
{
int i;
m_hWnd = hWnd;
m_iRecordDeviceID = iRecordDeviceID;
m_bRecord = (m_iRecordDeviceID >= 0) ? TRUE : FALSE;
m_wavFormat.wFormatTag = WAVE_FORMAT_PCM;
m_wavFormat.nChannels = iChannel;
m_wavFormat.nSamplesPerSec = iSamplingRate;
m_wavFormat.nAvgBytesPerSec = iSamplingRate * iChannel * iBits / 8;
m_wavFormat.nBlockAlign = iChannel * iBits / 8;
m_wavFormat.wBitsPerSample = iBits;
m_iWaveLength = iSamplingRate * iChannel * (iBits / 8) * iTime / 1000;
for (i = 0; i < WAVE_FORM_BUFFER_NUMBER; i ++)
{
m_hWaveInHeader[i] = m_pWaveInHeader[i] = NULL;
m_hWaveInData[i] = NULL;
m_pWaveInData[i] = NULL;
}
if (m_bRecord)
{
if (m_iRecordDeviceNumber < m_iRecordDeviceID + 1)
{
OutputDebugString("WaveIn: No device available\n");
goto Error;
}
// return 0 is supported; device is NOT opened after calling;
if (waveInOpen(NULL, m_iRecordDeviceID, &m_wavFormat, NULL, NULL, WAVE_FORMAT_QUERY) != 0)
{
OutputDebugString("WaveIn: Format not surportted\n");
goto Error;
}
for (i = 0; i < WAVE_FORM_BUFFER_NUMBER; i ++)
{
m_hWaveInData[i] = GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, m_iWaveLength);
if (m_hWaveInData[i] == NULL) goto Error;
m_pWaveInData[i] = (LPSTR)GlobalLock(m_hWaveInData[i]);
if (m_pWaveInData[i] == NULL) goto Error;
m_hWaveInHeader[i] = GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, sizeof(WAVEHDR));
if (m_hWaveInHeader[i] == NULL) goto Error;
m_pWaveInHeader[i] = (LPWAVEHDR)GlobalLock(m_hWaveInHeader[i]);
if (m_pWaveInHeader[i] == NULL) goto Error;
}
}
return TRUE;
Error:
Free();
return FALSE;
}
void CWaveIn::Free()
{
int i;
if (m_hWaveIn != NULL)
{
Stop();
}
for (i = 0; i < WAVE_FORM_BUFFER_NUMBER; i ++)
{
if (m_pWaveInHeader[i] != NULL) GlobalUnlock(m_hWaveInHeader[i]);
if (m_hWaveInHeader[i] != NULL)
{
GlobalFree(m_hWaveInHeader[i]);
m_hWaveInHeader[i] = NULL;
}
if (m_pWaveInData[i] != NULL) GlobalUnlock(m_hWaveInData[i]);
if (m_hWaveInData[i] != NULL)
{
GlobalFree(m_hWaveInData[i]);
m_hWaveInData[i] = NULL;
}
}
m_hWaveIn = NULL;
m_hWnd = NULL;
}
BOOL CWaveIn::Start()
{
int i;
if (m_hWnd == NULL || m_hWaveIn != NULL)
{
return FALSE;
}
m_iWaveInNextBuffer = 0;
if (m_bRecord)
{
m_bRecord = FALSE;
if (waveInOpen(&m_hWaveIn, m_iRecordDeviceID, &m_wavFormat, (DWORD)m_hWnd, NULL, CALLBACK_WINDOW) != 0)
{
OutputDebugString("WaveIn: Open device failed\n");
m_hWaveIn = NULL;
goto Error;
}
for (i = 0; i < WAVE_FORM_BUFFER_NUMBER; i ++)
{
m_pWaveInHeader[i]->lpData = m_pWaveInData[i];
m_pWaveInHeader[i]->dwBufferLength = m_iWaveLength;
m_pWaveInHeader[i]->dwFlags = 0;
m_pWaveInHeader[i]->dwLoops = 0;
if (waveInPrepareHeader(m_hWaveIn, m_pWaveInHeader[i], sizeof(WAVEHDR)) != 0)
{
OutputDebugString("WaveIn: Prepare head failed\n");
goto Error;
}
if (waveInAddBuffer(m_hWaveIn, m_pWaveInHeader[i], sizeof(WAVEHDR)) != 0)
{
OutputDebugString("WaveIn: Add buffer fail\n");
goto Error;
}
}
if (waveInStart(m_hWaveIn) != 0)
{
OutputDebugString("WaveIn: Start fail\n");
goto Error;
}
m_bRecord = TRUE;
}
OutputDebugString("WaveIn started ok\n");
return TRUE;
Error:
Stop();
return FALSE;
}
void CWaveIn::Stop()
{
int i;
if (m_bRecord)
{
m_bRecord = FALSE;
if (m_hWaveIn != NULL)
{
waveInReset(m_hWaveIn);
waveInStop(m_hWaveIn);
for (i = 0; i < WAVE_FORM_BUFFER_NUMBER; i ++)
{
waveInUnprepareHeader(m_hWaveIn, m_pWaveInHeader[i], sizeof(WAVEHDR));
}
waveInClose(m_hWaveIn);
m_hWaveIn = NULL;
m_bRecord = TRUE;
}
}
OutputDebugString("WaveIn stopped\n");
}
BOOL CWaveIn::ContinueRecording()
{
if (m_hWaveIn == NULL || m_bRecord == FALSE)
{
OutputDebugString("Recording not ready\n");
return FALSE;
}
if (waveInUnprepareHeader(m_hWaveIn, m_pWaveInHeader[m_iWaveInNextBuffer], sizeof(WAVEHDR)) != 0)
{
OutputDebugString("WaveIn: Unprepare head failed\n");
return FALSE;
}
m_pWaveInHeader[m_iWaveInNextBuffer]->lpData = m_pWaveInData[m_iWaveInNextBuffer];
m_pWaveInHeader[m_iWaveInNextBuffer]->dwBufferLength = m_iWaveLength;
m_pWaveInHeader[m_iWaveInNextBuffer]->dwFlags = 0;
m_pWaveInHeader[m_iWaveInNextBuffer]->dwLoops = 0;
if (waveInPrepareHeader(m_hWaveIn, m_pWaveInHeader[m_iWaveInNextBuffer], sizeof(WAVEHDR)) == 0)
{
if (waveInAddBuffer(m_hWaveIn, m_pWaveInHeader[m_iWaveInNextBuffer], sizeof(WAVEHDR)) != 0)
{
OutputDebugString("WaveIn: Write data failed\n");
return FALSE;
}
}
else
{
OutputDebugString("WaveIn: Prepare head failed\n");
return FALSE;
}
m_iWaveInNextBuffer ++;
if (m_iWaveInNextBuffer == WAVE_FORM_BUFFER_NUMBER) m_iWaveInNextBuffer = 0;
return TRUE;
}
void CWaveIn::GetRecordDeviceNames(CStringList& strList)
{
int i;
WAVEINCAPS cap;
for (i = 0; i < m_iRecordDeviceNumber; i++)
{
waveInGetDevCaps(i, &cap, sizeof(WAVEINCAPS));
if(cap.dwFormats)
{
CString index;
index.Format("number %d: \t",i);
strList.AddTail(index+cap.szPname);
}
}
}