这是我以前写的代码,供参考,网上这种代码很多的
#define MAX_BUFFER 8
#include <Mmsystem.h>
/////////////////////////////////////////////////////////////////////////////
// CAudioDlg dialog
class CAudioDlg : public CDialog
{
// Construction
public:
void Log(int tag, char *buf);
CAudioDlg(CWnd* pParent = NULL); // standard constructor
void OnMmWimData(WPARAM wParam,LPARAM lParam);
void OnMmWomDone(WPARAM wParam,LPARAM lParam);
HWAVEIN m_hWaveIn;
HWAVEOUT m_hWaveOut;
WAVEHDR m_pWaveHdr[MAX_BUFFER];
WAVEHDR m_pWaveHdrOut[MAX_BUFFER];
int m_curHdr;
int m_curHdrOut;
WAVEFORMATEX m_waveformat;
。。。。。。
};
BEGIN_MESSAGE_MAP(CAudioDlg, CDialog)
//{{AFX_MSG_MAP(CAudioDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(MM_WIM_DATA, OnMmWimData)
ON_MESSAGE(MM_WOM_DONE, OnMmWomDone)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CAudioDlg::OnOK()
{
// TODO: Add extra validation here
DWORD datasize = 6400;
CreateMutex( NULL, false, "MyMutex");
if( GetLastError() == ERROR_ALREADY_EXISTS ) {
TRACE("Exists and Exit/n");
}
else{
TRACE("aaaaaaaa/n");
}
m_waveformat.wFormatTag=WAVE_FORMAT_PCM;
m_waveformat.nChannels=2;
m_waveformat.nSamplesPerSec=16000;
m_waveformat.nAvgBytesPerSec=16000;
m_waveformat.nBlockAlign=1;
m_waveformat.wBitsPerSample=16; //指定录音格式
m_waveformat.cbSize=0;
Log(waveInGetNumDevs(), "waveInGetNumDevs()");
TRACE("有%d个可以使用的 WaveOut 通道/n", waveOutGetNumDevs());
// waveOutGetDevCaps();
int res=waveInOpen(&m_hWaveIn,WAVE_MAPPER, &m_waveformat, (DWORD)m_hWnd,0L,CALLBACK_WINDOW);
if ( res == MMSYSERR_NOERROR ) {
TRACE("打开 waveIn 成功/n"); // 验证创建是否成功
}
else{
TRACE("打开 waveIn 通道失败,Error_Code = 0x%x/n", res );
} // End of 验证创建是否成功
res = waveOutOpen(&m_hWaveOut, -1, &m_waveformat, (DWORD)m_hWnd,0L,CALLBACK_WINDOW);
if ( res == MMSYSERR_NOERROR ) {
TRACE("打开 waveOut 成功/n"); // 验证创建是否成功
}
else{
TRACE("打开 waveOut 通道失败,Error_Code = 0x%x/n", res );
} // End of 验证创建是否成功
unsigned int DeviceID;
waveOutGetID(m_hWaveOut, &DeviceID);
for(int i=0;i<MAX_BUFFER;i++){
m_pWaveHdr[i].lpData = (char *)GlobalLock( GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, datasize) );
memset(m_pWaveHdr[i].lpData, 0, datasize );
m_pWaveHdr[i].dwBufferLength = datasize;
m_pWaveHdr[i].dwBytesRecorded = 0;
m_pWaveHdr[i].dwUser = 0;
m_pWaveHdr[i].dwFlags = 0;
m_pWaveHdr[i].dwLoops = 0;
m_pWaveHdrOut[i].lpData = (char *)GlobalLock( GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, datasize) );
memset(m_pWaveHdrOut[i].lpData, 0, datasize );
m_pWaveHdrOut[i].dwBufferLength = datasize;
m_pWaveHdrOut[i].dwBytesRecorded = 0;
m_pWaveHdrOut[i].dwUser = 0;
m_pWaveHdrOut[i].dwFlags = 0;
m_pWaveHdrOut[i].dwLoops = 0;
}
int resPrepare;
for(i=0;i<MAX_BUFFER-1;i++){
resPrepare = waveInPrepareHeader( m_hWaveIn, &m_pWaveHdr[i], sizeof(WAVEHDR) ); //准备内存块录音
if ( resPrepare == MMSYSERR_NOERROR){
TRACE("准备录音用头文件成功/n");
}
else{
TRACE("不能开辟录音头文件,Error_Code = 0x%03X/n", resPrepare );
} // End of 验证开辟缓冲
resPrepare = waveInAddBuffer( m_hWaveIn, &m_pWaveHdr[i], sizeof(WAVEHDR) );
if ( resPrepare == MMSYSERR_NOERROR) {
TRACE("准备录音用内存成功/n");
}
else{
TRACE("不能开辟录音用缓冲,Error_Code = 0x%03X/n", resPrepare );
} // End of 验证开辟缓冲
}
m_curHdr = 0;
if (! waveInStart(m_hWaveIn) ) {
TRACE("开始录音/n");
}
else {
TRACE("开始录音失败/n");
}
}
void CAudioDlg::OnMmWomDone(WPARAM wParam,LPARAM lParam)
{
// TRACE("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/n");
waveOutUnprepareHeader( m_hWaveOut, &m_pWaveHdrOut[m_curHdrOut], sizeof(WAVEHDR) );
}
void CAudioDlg::OnMmWimData(WPARAM wParam,LPARAM lParam)
{
int aa;
waveInUnprepareHeader( m_hWaveIn, &m_pWaveHdr[m_curHdr], sizeof(WAVEHDR) );
memcpy(m_pWaveHdrOut[m_curHdr].lpData, m_pWaveHdr[m_curHdr].lpData, m_pWaveHdr[m_curHdr].dwBufferLength );
m_pWaveHdrOut[m_curHdr].dwBufferLength = m_pWaveHdr[m_curHdr].dwBufferLength ;
m_pWaveHdrOut[m_curHdr].dwBytesRecorded = 0;
m_pWaveHdrOut[m_curHdr].dwUser = 0;
m_pWaveHdrOut[m_curHdr].dwFlags = 0;
m_pWaveHdrOut[m_curHdr].dwLoops = 0;
waveOutPrepareHeader( m_hWaveOut, &m_pWaveHdrOut[m_curHdr], sizeof(WAVEHDR) );
m_curHdrOut = m_curHdr;
Log(waveOutWrite(m_hWaveOut, &m_pWaveHdrOut[m_curHdr], sizeof(WAVEHDR)), "waveOutWrite()");
aa = m_curHdr==0?MAX_BUFFER-1:m_curHdr - 1;
waveInUnprepareHeader( m_hWaveIn, &m_pWaveHdr[aa], sizeof(WAVEHDR) );
Log(waveInPrepareHeader( m_hWaveIn, &m_pWaveHdr[aa], sizeof(WAVEHDR)), "waveInPrepareHeader()");
Log(waveInAddBuffer( m_hWaveIn, &m_pWaveHdr[aa], sizeof(WAVEHDR) ), "waveInAddBuffer()");
m_curHdr = m_curHdr==MAX_BUFFER-1 ? 0:m_curHdr+1;
return;
}
void CAudioDlg::Log(int tag, char *buf)
{
if ( strcmp(buf, "waveOutWrite()")==0 ){
if(tag== MMSYSERR_NOERROR){
TRACE("播放成功/n");
}
else{
TRACE("播放失败,Error_Code = 0x%x/n", tag);
}
}
else if ( strcmp(buf, "waveInPrepareHeader()")==0 ){
if(tag== MMSYSERR_NOERROR){
TRACE("准备录音用头文件成功/n");
}
else{
TRACE("不能开辟录音头文件,Error_Code = 0x%03X/n", tag);
}
}
else if ( strcmp(buf, "waveInAddBuffer()")==0 ){
if(tag== MMSYSERR_NOERROR){
TRACE("准备录音用内存成功/n");
}
else{
TRACE("不能开辟录音用缓冲, Error_Code = 0x%03X/n", tag);
}
}
else if ( strcmp(buf, "waveInGetNumDevs()")==0 ){
if(tag){
TRACE("有可以使用的 WaveIn 通道/n");
}
else{
TRACE("没有可以使用的 waveIn 通道/n");
}
}
}
void CAudioDlg::OnCancel()
{
// TODO: Add extra cleanup here
waveInClose(m_hWaveIn);
waveOutClose(m_hWaveOut);
CDialog::OnCancel();
}
BOOL CAudioDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::DestroyWindow();
}
怎样才能捕获声卡中的声音
最新推荐文章于 2022-01-01 15:39:28 发布