在学习波形音频的使用的时候,我封装了一些API,封装类如下:
#include <mmsystem.h>
const int MAX_BUFFER_SIZE=2048;
class CWaveDlg;
class CSound
{
public:
CSound(void);
virtual ~CSound(void);
public:
void Init(CWaveDlg* dlg); //sound对象初始化
void Record(); //开始录音
void StopRecord(); //停止录音
void Closein(); //关闭输入设备
void Play(); //开始播放
void PausePlay(); //暂停播放
void StopPlay(); //停止播放
void SlowDown(); //减速播放
void SpeedUp(); //加速播放
void CloseOut(); //关闭输出设备
void FreeRecordBuffer(); //释放录音的BUFFER
void FreePlayBuffer(); //释放播放的BUFFER
void InBufferZero(); //让Buffer值都为0,未使用
void OutBufferZero(); //让Buffer值都为0,未使用
public:
CWaveDlg* m_dlg; //与之相关联的对话框
WAVEFORMATEX m_soundFormat; //指定录音和播放的格式
HWAVEIN m_hWaveIn; //标示波形音频输入设备缓冲区的句柄
HWAVEOUT m_hWaveOut; //标示波形音频输出设备缓冲区的句柄
WAVEHDR m_pWaveHdrIn[3]; //主要是定义了波形音频的Buffer,为其它API使用
WAVEHDR m_pWaveHdrOut[3];
CHAR m_cBufferIn[MAX_BUFFER_SIZE]; //为输入准备的内存
CHAR m_cBufferOut[MAX_BUFFER_SIZE]; //为输出准备的内存};
在.Cpp文件中有这样一个函数:#include "stdafx.h"
#include "Wave.h"
#include "Sound.h"
#include "WaveDlg.h"void CSound::Init(CWaveDlg* dlg)
{
int result;
m_dlg=dlg;
if(waveInGetNumDevs()==0)
{
AfxMessageBox("There is no Sound input deviec");
} if(waveOutGetNumDevs()==0)
{
AfxMessageBox("There is no Sound output deviec");
} 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 ;
} //为输入设备准备内存
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("Can't InPrepareHeader");
return;
}
result=waveInAddBuffer(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR));//增加内存块
if(result!=MMSYSERR_NOERROR)
{
AfxMessageBox("Can't InAddBuffer");
return;
}// waveOutPrepareHeader(
////为输出设备准备内存
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("Can't OutPrepareHeader");
return;
}
result=waveOutWrite(m_hWaveOut,&m_pWaveHdrOut[0],sizeof(WAVEHDR));//增加内存块
if(result!=MMSYSERR_NOERROR)
{
AfxMessageBox("Can't OutAddBuffer");
return;
}
}
在cpp文件中,凡是用到关于Wave的函数,全是出现:无法解析的外部符号的错误,这是怎么回事啊?
#include <mmsystem.h>
const int MAX_BUFFER_SIZE=2048;
class CWaveDlg;
class CSound
{
public:
CSound(void);
virtual ~CSound(void);
public:
void Init(CWaveDlg* dlg); //sound对象初始化
void Record(); //开始录音
void StopRecord(); //停止录音
void Closein(); //关闭输入设备
void Play(); //开始播放
void PausePlay(); //暂停播放
void StopPlay(); //停止播放
void SlowDown(); //减速播放
void SpeedUp(); //加速播放
void CloseOut(); //关闭输出设备
void FreeRecordBuffer(); //释放录音的BUFFER
void FreePlayBuffer(); //释放播放的BUFFER
void InBufferZero(); //让Buffer值都为0,未使用
void OutBufferZero(); //让Buffer值都为0,未使用
public:
CWaveDlg* m_dlg; //与之相关联的对话框
WAVEFORMATEX m_soundFormat; //指定录音和播放的格式
HWAVEIN m_hWaveIn; //标示波形音频输入设备缓冲区的句柄
HWAVEOUT m_hWaveOut; //标示波形音频输出设备缓冲区的句柄
WAVEHDR m_pWaveHdrIn[3]; //主要是定义了波形音频的Buffer,为其它API使用
WAVEHDR m_pWaveHdrOut[3];
CHAR m_cBufferIn[MAX_BUFFER_SIZE]; //为输入准备的内存
CHAR m_cBufferOut[MAX_BUFFER_SIZE]; //为输出准备的内存};
在.Cpp文件中有这样一个函数:#include "stdafx.h"
#include "Wave.h"
#include "Sound.h"
#include "WaveDlg.h"void CSound::Init(CWaveDlg* dlg)
{
int result;
m_dlg=dlg;
if(waveInGetNumDevs()==0)
{
AfxMessageBox("There is no Sound input deviec");
} if(waveOutGetNumDevs()==0)
{
AfxMessageBox("There is no Sound output deviec");
} 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 ;
} //为输入设备准备内存
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("Can't InPrepareHeader");
return;
}
result=waveInAddBuffer(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR));//增加内存块
if(result!=MMSYSERR_NOERROR)
{
AfxMessageBox("Can't InAddBuffer");
return;
}// waveOutPrepareHeader(
////为输出设备准备内存
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("Can't OutPrepareHeader");
return;
}
result=waveOutWrite(m_hWaveOut,&m_pWaveHdrOut[0],sizeof(WAVEHDR));//增加内存块
if(result!=MMSYSERR_NOERROR)
{
AfxMessageBox("Can't OutAddBuffer");
return;
}
}
在cpp文件中,凡是用到关于Wave的函数,全是出现:无法解析的外部符号的错误,这是怎么回事啊?
加上 #pragma comment(lib, "Winmm.lib")