使用WaveIn录制音频并且使用WaveOut播放音频

本文介绍了如何在Windows下使用WaveIn和WaveOut API来创建一个简单的音频录制及播放器。通过监听MM_WIM_DATA消息保存录音,并在用户请求播放时读取文件,初始化缓冲区提交给声卡进行播放。当播放结束,释放相关资源。
摘要由CSDN通过智能技术生成

在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟建行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值