100分,求解答,windows 音频开发,使用了wavex函数族

xs767461 2012-11-01 11:37:46
小软件的功能很简单,就是从mic说话从耳机立即播放出来,现在的问题是延迟太大了,使用了buffer:320(160*2),
#include "stdafx.h"

#include "Sound.h"
#include "iMReset.h"
#include "iMResetDlg.h"

CSound::CSound()
{
insound = 0 ;
outsound = 0 ;
flag = 0 ;
}

CSound::~CSound()
{
waveInClose(m_hWaveIn);
waveOutClose(m_hWaveOut);
}

UINT CSound::Init(CiMResetDlg *dlg)//设置waveformatex ,寻找指定音频IO,打开音频IO设备
{
int result ;
int NumdevIn;
int NumdevOut ;

m_dlg = dlg ;



m_soundFormat.wFormatTag = WAVE_FORMAT_PCM ;
m_soundFormat.nChannels = 1 ;
m_soundFormat.nSamplesPerSec = 16000;
m_soundFormat.nAvgBytesPerSec = 32000 ;
m_soundFormat.nBlockAlign=2 ;
m_soundFormat.cbSize = 0 ;
m_soundFormat.wBitsPerSample = 16 ;

int res = waveInOpen(&m_hWaveIn,uID,&m_soundFormat,(DWORD)m_dlg->m_hWnd,0L,CALLBACK_WINDOW);//打开录音设备
if(res!= MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Error in waveInOpen"));
return 0;
}


res=waveOutOpen(&m_hWaveOut,outID, &m_soundFormat, (DWORD)m_dlg->m_hWnd,0L,CALLBACK_WINDOW);
if(res!= MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Error in waveOutOpen function"));
return 0;
}
//in
for(int i = 0 ; i < BLOCKS ; i++)
{
m_pWaveHdrIn[i].lpData = m_cBufferIn[i] ;
m_pWaveHdrIn[i].dwBufferLength = MAX_BUFFER_SIZE ;
m_pWaveHdrIn[i].dwBytesRecorded = 0 ;
m_pWaveHdrIn[i].dwFlags = 0 ;

result = waveInPrepareHeader(m_hWaveIn,&m_pWaveHdrIn[i],sizeof(WAVEHDR));
if(result != MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Can't InprePareHeader !"));
return 0;
}
result=waveInAddBuffer(m_hWaveIn,&m_pWaveHdrIn[i],sizeof(WAVEHDR)); //增加内存块
if (result!= MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Cannot InAddBuffer !"));
return 0;
}
}
for(int i = 0 ; i < BLOCKS ;i++)
{
m_pWaveHdrOut[i].lpData=m_cBufferIn[i];
m_pWaveHdrOut[i].dwBufferLength=MAX_BUFFER_SIZE;
m_pWaveHdrOut[i].dwBytesRecorded=0;
m_pWaveHdrOut[i].dwFlags=0;

waveOutPrepareHeader(m_hWaveOut,&m_pWaveHdrIn[i],sizeof(WAVEHDR)); //准备内存块录音
}
waveOutWrite(m_hWaveOut,&m_pWaveHdrOut[0],sizeof(WAVEHDR));
return 0 ;
}

void CSound::Record()
{
waveInStart(m_hWaveIn);//开始录音
}

void CSound::StopRecord()
{
waveInStop(m_hWaveIn); //停止录音
waveInReset(m_hWaveIn); //清空内存块
}

void CSound::FreeRecordBuffer()
{
insound = (insound+1)%BLOCKS ;
int result=waveInUnprepareHeader(m_hWaveIn,&m_pWaveHdrIn[insound],sizeof(WAVEHDR));
if (result!= MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Cannot UnInPrepareHeader !"));
return;
}; //in

m_pWaveHdrIn[insound].lpData=m_cBufferIn[insound];
m_pWaveHdrIn[insound].dwBufferLength=MAX_BUFFER_SIZE;
m_pWaveHdrIn[insound].dwBytesRecorded=0;
m_pWaveHdrIn[insound].dwFlags=0;

result=waveInPrepareHeader(m_hWaveIn,&m_pWaveHdrIn[insound],sizeof(WAVEHDR)); //准备内存块录音
if (result!= MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Cannot InPrepareHeader !"));
return;
}; //in
result=waveInAddBuffer(m_hWaveIn,&m_pWaveHdrIn[insound],sizeof(WAVEHDR)); //增加内存块
if (result!= MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Cannot InAddBuffer !"));
return;
}; //in
}
void CSound::FreePlayBuffer()
{
static bool once=true;
int result;

result=waveOutUnprepareHeader(m_hWaveOut,&m_pWaveHdrOut[outsound],sizeof(WAVEHDR));

outsound = (outsound+1)%BLOCKS ;
m_pWaveHdrOut[outsound].lpData=m_cBufferIn[outsound];
m_pWaveHdrOut[outsound].dwBufferLength=MAX_BUFFER_SIZE;
m_pWaveHdrOut[outsound].dwBytesRecorded=0;
m_pWaveHdrOut[outsound].dwFlags=0;

result=waveOutPrepareHeader(m_hWaveOut,&m_pWaveHdrOut[outsound],sizeof(WAVEHDR)); //准备内存块录音
if (result!= MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Cannot OutPrepareHeader !"));
return;
}; //out
result=waveOutWrite(m_hWaveOut,&m_pWaveHdrOut[outsound],sizeof(WAVEHDR)); //增加内存块
if (result!= MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Cannot OutWrite !"));
return;
}; //out
flag++;
if(flag == 20)
{
AfxMessageBox(_T("暂停!!!"));
}
}


LRESULT CiMResetDlg::WriteBufferFull(WPARAM wp,LPARAM lp)//DONE
{
::AfxBeginThread(Audio_Record_Thread,this);
::AfxBeginThread(Audio_Play_Thread,this);

return 0 ;
}
...全文
187 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xusen1013 2012-11-06
  • 打赏
  • 举报
回复
你还我已发到有邮箱一份了!!!你看看
fang 2012-11-02
  • 打赏
  • 举报
回复
m_soundFormat.wFormatTag = WAVE_FORMAT_PCM ;
m_soundFormat.nChannels = 1 ;
m_soundFormat.nSamplesPerSec = 16000;
m_soundFormat.nAvgBytesPerSec = 32000 ;
m_soundFormat.nBlockAlign=2 ;
m_soundFormat.cbSize = 0 ;
m_soundFormat.wBitsPerSample = 16 ;
楼主语音采集格式是单通道、16位、16000的采样率是吧,如果是这样的话
m_soundFormat.nAvgBytesPerSec = 32000 ;这个值是不是不对啊。你换成64000试下。
傻X 2012-11-02
  • 打赏
  • 举报
回复
内容是不是贴少了?

一般延迟大的原因是CPU跟不上处理速度。一般都是缓冲区循环拷贝,做无用功导致CPU能率被耗尽。
LiuYinChina 2012-11-01
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/RobertBaker/3184342

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧