錄製麥克風聲音,但不要windows音效卡上喇叭聲音
我要播放一段聲音給麥克風錄音,但遇到會同時錄製喇叭聲音的問題,想問要怎麼只錄麥克風聲音呢?
還有要怎麼讓麥克風插上後馬上power on enable後使用?
void CMPEGDlg::OnBnClickedRecord(){
UINT wDeviceID;
DWORD dwReturn;
MCI_OPEN_PARMS mciOpenParms;
// Opens a CD audio device by specifying a device-type constant.
mciOpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO;
if (dwReturn = mciSendCommand(NULL, MCI_OPEN,
MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)(LPVOID) &mciOpenParms))
{
AfxMessageBox("a");
}
// The device opened successfully; get the device ID.
wDeviceID = mciOpenParms.wDeviceID;
MCIWndClose(mciwav); //打开一个声音的之前关闭以前的声音
mciwav = MCIWndCreate(this->m_hWnd,AfxGetApp()->m_hInstance,WS_CAPTION,NULL);
//创建句柄,最后一个参数如果是NULL,就新建一个;如果是一个文件的路径就打开它。
//this->m_hWnd表示父句柄,AfxGetApp()获得当前应用进程的指针,进而取得实例
MCIWndNew(mciwav,"waveaudio"); //创建设备
//int a=MCIWndGetDeviceID(mciwav);
if(MCIWndCanRecord(mciwav)) //判断是否能够录音
{
/////////////////
MCI_WAVE_SET_PARMS set_parms;
set_parms.wFormatTag = WAVE_FORMAT_PCM;
set_parms.wBitsPerSample = 16;
set_parms.nChannels = 2;
set_parms.nBlockAlign = (set_parms.nChannels*set_parms.wBitsPerSample)/8;
set_parms.nSamplesPerSec = 44100;
set_parms.nAvgBytesPerSec = ((set_parms.wBitsPerSample) *
set_parms.nChannels *
set_parms.nSamplesPerSec)/8;
// now send the format changes with MCI_SET
int deviceID=MCIWndGetDeviceID(mciwav);
int result = mciSendCommand( deviceID, MCI_SET,
MCI_WAIT
| MCI_WAVE_SET_FORMATTAG
| MCI_WAVE_SET_BITSPERSAMPLE
| MCI_WAVE_SET_CHANNELS
| MCI_WAVE_SET_SAMPLESPERSEC
| MCI_WAVE_SET_AVGBYTESPERSEC
| MCI_WAVE_SET_BLOCKALIGN,
(DWORD)(LPVOID)&set_parms);
/////////////////////////
MCIWndRecord(mciwav);//开始录制
PlaySound(TEXT("1K16BIT.wav"), NULL, SND_FILENAME);
OnBnClickedSave();
}
void CMPEGDlg::OnBnClickedSave()
{
//MCIWndSave(mciwav,"a"); //保存成默认的名字a
//CopyFile("a","WW.wav",FALSE); //把a文件拷贝到另一路径和名字
CString m_Path="";
if(m_Path==""){
CFileDialog wav(FALSE,NULL,NULL,OFN_ALLOWMULTISELECT,"wav File (*.wav)|*.wav");
m_Path = wav.GetPathName()+"R.wav";
if(MCIWndCanSave(mciwav)&&m_Path!="")
{
MCIWndSave(mciwav, "a");//a作为中间文件,应为文件名超过1位出现乱码
CopyFile("a",m_Path,FALSE);
}else
AfxMessageBox("error save() in class waverecorder");
}
}