VC 语音聊天室出现杂音 该如何消除

jojo_janis 2009-07-25 09:34:49
录音 和 发音的程序如下

#include "stdafx.h"
#include "Example2_ChatRoom.h"
#include "Sound.h"
#include "Example2_ChatRoomDlg.h"
#include <fstream>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSound::CSound()
{

}

CSound::~CSound()
{
waveInClose(m_hWaveIn); //关闭录音设备
waveOutClose(m_hWaveOut); //关闭录音设备
}

static int i=0;//CFile file=new CFile("temp.wav");
static int j=0;
void CSound::Init(CExample2_ChatRoomDlg *dlg)
{

int result;
m_dlg=dlg;
if(waveInGetNumDevs()==0)
{
AfxMessageBox("There is no sound input device");
}
if(waveOutGetNumDevs()==0)
{
AfxMessageBox("There is no sound output device");
}
m_soundFormat.wFormatTag=WAVE_FORMAT_PCM;
m_soundFormat.nChannels=1;
m_soundFormat.nSamplesPerSec=8000;
m_soundFormat.nAvgBytesPerSec=16000;
m_soundFormat.nBlockAlign=2;
m_soundFormat.cbSize=0;
m_soundFormat.wBitsPerSample=16; //指定录音格式

int res=waveInOpen(&m_hWaveIn,WAVE_MAPPER, &m_soundFormat, (DWORD)m_dlg->m_hWnd,0L,CALLBACK_WINDOW); //打开录音设备
if(res!= MMSYSERR_NOERROR)
{
AfxMessageBox("Error in waveInOpen function");
return ;
}
res=waveOutOpen(&m_hWaveOut,WAVE_MAPPER, &m_soundFormat, (DWORD)m_dlg->m_hWnd,0L,CALLBACK_WINDOW); //打开录音设备
if(res!= MMSYSERR_NOERROR)
{
AfxMessageBox("Error in waveOutOpen function");
return ;
}
//in
m_pWaveHdrIn[0].lpData=m_cBufferIn;
m_pWaveHdrIn[0].dwBufferLength=MAX_BUFFER_SIZE;
m_pWaveHdrIn[0].dwBytesRecorded=0;
m_pWaveHdrIn[0].dwFlags=0;
//m_pWaveHdrIn[0].dwFlags=WHDR_BEGINLOOP;

result=waveInPrepareHeader(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR)); //准备内存块录音
if (result!= MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Cannot InPrepareHeader !"));
return;
};

// ::waveInUnprepareHeader(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR));
result=waveInAddBuffer(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR)); //增加内存块
if (result!= MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Cannot InAddBuffer !"));
return;
};

//out
m_pWaveHdrOut[0].lpData=m_cBufferOut;
m_pWaveHdrOut[0].dwBufferLength=MAX_BUFFER_SIZE;
m_pWaveHdrOut[0].dwBytesRecorded=0;
m_pWaveHdrOut[0].dwFlags=0;
//m_pWaveHdrOut[0].dwFlags=WHDR_BEGINLOOP;

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

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

void CSound::Play()
{
// file=m_cBufferIn;
memcpy(m_cBufferOut,m_cBufferIn,MAX_BUFFER_SIZE);
}

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

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

//m_cBufferIn[MAX_BUFFER_SIZE-1]=NULL;
m_pWaveHdrIn[i].lpData=m_cBufferIn;
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("Cannot InPrepareHeader !"));
return;
}; //in
// ::waveInUnprepareHeader(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR));
result=waveInAddBuffer(m_hWaveIn,&m_pWaveHdrIn[i],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[j],sizeof(WAVEHDR));
j++;
if (j%3==0)
{
j=0;
}

m_pWaveHdrOut[j].lpData=m_cBufferOut;
m_pWaveHdrOut[j].dwBufferLength=MAX_BUFFER_SIZE;
m_pWaveHdrOut[j].dwBytesRecorded=0;
m_pWaveHdrOut[j].dwFlags=0;

result=waveOutPrepareHeader(m_hWaveOut,&m_pWaveHdrOut[j],sizeof(WAVEHDR)); //准备内存块录音
if (result!= MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Cannot OutPrepareHeader !"));
return;
}; //out
result=waveOutWrite(m_hWaveOut,&m_pWaveHdrOut[j],sizeof(WAVEHDR)); //增加内存块
if (result!= MMSYSERR_NOERROR)
{
AfxMessageBox(_T("Cannot OutWrite !"));
return;
}; //out
}
void CSound::InBufferZero()
{
int i;
for(i=0;i<MAX_BUFFER_SIZE;i++)
{
m_cBufferIn[i]=0;
}
}

void CSound::OutBufferZero()
{
int i;
for(i=0;i<MAX_BUFFER_SIZE;i++)
{
m_cBufferOut[i]=0;
}
}

本人菜鸟,希望大虾们帮帮我……
...全文
166 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
beautyloveme 2009-07-25
  • 打赏
  • 举报
回复
换高级的耳机和麦克风

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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