欲实现录音功能,自己写的一个 CSound 类如下,但调用 m_sound.Init(this); m_sound.Record(); 后,在 WM_WIM_DATA 消息的事件理调用 m_sound.Play(); 却没反应, 请教原因#define MAX_BUFFER_SIZE 2048class CSoundChatDlg;class CSound  
{
public:
//operations
void FreeRecordBuffer();
void StopRecord();
void Play();
void Record();
void Init( CSoundChatDlg *dlg );
public:
//variables
CSoundChatDlg *m_dlg;
WAVEFORMATEX m_soundFormat;
HWAVEIN m_hWaveIn;
HWAVEOUT m_hWaveOut;
WAVEHDR m_pWaveHdrIn[3];
WAVEHDR m_pWaveHdrOut[3];
CHAR m_cBufferIn[MAX_BUFFER_SIZE];
CHAR m_cBufferOut[MAX_BUFFER_SIZE];
public:
void FreePlayBuffer();

CSound();
virtual ~CSound();};//
CSound::CSound()
{}CSound::~CSound()
{}void CSound::Init(CSoundChatDlg *dlg)
{
int result; m_dlg = dlg; if( waveInGetNumDevs()==0 )
{
AfxMessageBox( "没有音频输入设备" );
}
if( waveOutGetNumDevs()==0 )
{
AfxMessageBox( "没有音频输出设备" );
} m_soundFormat.wFormatTag = WAVE_FORMAT_PCM;
m_soundFormat.nChannels = 1;
m_soundFormat.nSamplesPerSec = 8000;
m_soundFormat.nAvgBytesPerSec   = 16000;
m_soundFormat.nBlockAlign = 2;
m_soundFormat.wBitsPerSample = 16;
m_soundFormat.cbSize = 0; //打开录音设备
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; //准备内存录音
result = waveInPrepareHeader( m_hWaveIn, &m_pWaveHdrIn[0], sizeof(WAVEHDR) );
if( result!=MMSYSERR_NOERROR )
{
AfxMessageBox( "Error in waveInPrepareHeader function" );
return;
} //增加内存块
result = waveInAddBuffer( m_hWaveIn, &m_pWaveHdrIn[0], sizeof(WAVEHDR) );
if( result!=MMSYSERR_NOERROR )
{
AfxMessageBox( "Error in waveInAddBuffer function" );
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; //准备内存块????
waveOutPrepareHeader( m_hWaveOut, &m_pWaveHdrOut[0], sizeof(WAVEHDR) );
if( result!=MMSYSERR_NOERROR )
{
AfxMessageBox( "Error in waveOutPrepareHeader function" );
return;
}
result = waveOutWrite( m_hWaveOut, &m_pWaveHdrOut[0], sizeof(WAVEHDR) );
if( result!=MMSYSERR_NOERROR )
{
AfxMessageBox( "Error in waveOutWrite function" );
return;
}
}void CSound::Record()
{
//开始录音
waveInStart( m_hWaveIn );
}void CSound::Play()
{
//播放,   实际上就是将 m_cufferIn的内容拷贝到 m_cBufferOut 中
memcpy( m_cBufferOut, m_cBufferIn, MAX_BUFFER_SIZE );
}void CSound::StopRecord()
{
//停止录音
waveInStop( m_hWaveIn );
}//当录音的buffer漫时会发送一个消息到窗口,从而窗口消息处理函数调用该函数并释放buffer
void CSound::FreeRecordBuffer()
{
int result = waveInUnprepareHeader( m_hWaveIn, &m_pWaveHdrIn[0], sizeof(WAVEHDR) );
if( result!=MMSYSERR_NOERROR )
{
AfxMessageBox( "Error in waveInUnprepareHeader 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;

//准备内存录音
result = waveInPrepareHeader( m_hWaveIn, &m_pWaveHdrIn[0], sizeof(WAVEHDR) );
if( result!=MMSYSERR_NOERROR )
{
AfxMessageBox( "Error in waveInPrepareHeader function" );
return;
} //增加内存块
result = waveInAddBuffer( m_hWaveIn, &m_pWaveHdrIn[0], sizeof(WAVEHDR) );
if( result!=MMSYSERR_NOERROR )
{
AfxMessageBox( "Error in waveInAddBuffer function" );
return;
}
}void CSound::FreePlayBuffer()
{
int result;

result = waveOutUnprepareHeader( m_hWaveOut, &m_pWaveHdrOut[0], sizeof(WAVEHDR) );
if( result!=MMSYSERR_NOERROR )
{
AfxMessageBox( "Error in waveOutUnprepareHeader function" );
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; //准备内存块
result = waveOutPrepareHeader( m_hWaveOut, &m_pWaveHdrOut[0], sizeof(WAVEHDR) );
if( result!=MMSYSERR_NOERROR )
{
AfxMessageBox( "Error in waveOutPrepareHeader function" );
return;
}
result = waveOutWrite( m_hWaveOut, &m_pWaveHdrOut[0], sizeof(WAVEHDR) );
if( result!=MMSYSERR_NOERROR )
{
AfxMessageBox( "Error in waveOutWrite function" );
return;
}
}

解决方案 »

  1.   

    你的FreePlayBuffer()倒是播放的代码。
      

  2.   

    你的FreePlayBuffer()倒是播放的代码//
    怎么会?
      

  3.   

    没有播放。//
    m_sound.Play(); 不是播放么
      

  4.   

    我不知道你的代码是怎么回事。
    录音:waveInPrepareHeader(), waveInAddBuffer
    播放:waveOutPrepareHeader(),waveOutWrite()
    去看看Msdn就知道了。
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_example_of_writing_waveform_data.asp
      

  5.   

    http://www.vckbase.com/document/viewdoc/?id=904