在Windows下开发音频的方式有多种,但是最简单,也是最灵活的就是Wave系列API,今天我们一起用WaveIn和WaveOut实现一个音频录制和音频播放器,具体界面如下:
录制步骤如下:
void CcbdDlg::OnBnClickedButtonStartRec()
{
// TODO: 在此添加控件通知处理程序代码
m_iHour = 0;
m_iMinute = 0;
m_iSec = 0;
m_pDataBuff1 = NULL;
m_pDataBuff2 = NULL;
m_hWaveDev = NULL;
m_dwFileSize = 0;
CStringA strPathA;
strPathA = m_strPath;
m_fSave = fopen(strPathA.GetBuffer(strPathA.GetLength()), "ab+");
if (!m_fSave)
{
AfxMessageBox(_T("文件打开失败!"));
return;
}
WAVEFORMATEX waveCtx;
waveCtx.nSamplesPerSec = 44100; /* sample rate */
waveCtx.wBitsPerSample = 16; /* sample size */
waveCtx.nChannels = 2; /* channels*/
waveCtx.cbSize = 0; /* size of _extra_ info */
waveCtx.wFormatTag = WAVE_FORMAT_PCM;
waveCtx.nBlockAlign = (waveCtx.wBitsPerSample * waveCtx.nChannels) >> 3;
waveCtx.nAvgBytesPerSec = waveCtx.nBlockAlign * waveCtx.nSamplesPerSec;
MMRESULT iRet = waveInOpen(&m_hWaveDev, m_comboDevList.GetCurSel()/*WAVE_MAPPER*/, &waveCtx, (DWORD)(UINT)this->m_hWnd, NULL, CALLBACK_WINDOW);
if (MMSYSERR_NOERROR == iRet)
{
TRACE("yes,waveInOpen OK!\n");
}
else
{
AfxMessageBox(_T("设备打开失败!"));
return;
}
//准备第一个缓冲
m_pDataBuff1 = new BYTE[waveCtx.nAvgBytesPerSec];
memset(m_pDataBuff1, 0, waveCtx.nAvgBytesPerSec);
m_waveHdr1.lpData = (LPSTR)m_pDataBuff1;
m_waveHdr1.dwBufferLength = waveCtx.nAvgBytesPerSec;
m_waveHdr1.dwBytesRecorded = 0;
m_waveHdr1.dwFlags = 0;
iRet = waveInPrepareHeader(m_hWaveDev, &m_waveHdr1, sizeof(WAVEHDR));
if (MMSYSERR_NOERROR == iRet)
{
TRACE("yes,waveInPrepareHeader OK!\n");
}
else
{
if (m_pDataBuff1)
{
delete [] m_pDataBuff1;
m_pDataBuff1 = NULL;
}
AfxMessageBox(_T("内存分配失败!"));
return;
}
iRet = waveInAddBuffer(m_hWaveDev, &m_waveHdr1, sizeof(WAVEHDR));
if (MMSYSERR_NOERROR == iRet)
{
TRACE("yes,waveInAddBuffer OK!\n");
}
else
{
if (m_pDataBuff1)
{
delete [] m_pDataBuff1;
m_pDataBuff1