📄 wave(8).cpp
字号:
#include <windows.h>
#include "Wave.h"
#define WAVE_DATASIZE 8000 //缓冲区大小
#define WAVE_ERROR_NO_DEVICE -1 //找不到音频设备
#define WAVE_ERROR_WAVEINOPEM -2 //waveInOpen返回错误
#define WAVE_ERROR_SUCESS 0 //成功
#define WAVE_ERROR_WAVEINSTART -3 //成功
#define WAVE_ERROR_WAVEOUTOPEM -5;
HWAVEIN xxRecordeOpen(WAVEFORMATEX *pWaveFormatex)
//pWaveFormatex可为0
{
WAVEFORMATEX _WaveFormatex;
WAVEFORMATEX* _pWaveFormatex;
HWAVEIN hWaveIn;
_pWaveFormatex = pWaveFormatex;
if( NULL == pWaveFormatex )
{
_pWaveFormatex = &_WaveFormatex;
_WaveFormatex.wFormatTag=WAVE_FORMAT_PCM;
_WaveFormatex.nChannels=1;
_WaveFormatex.nSamplesPerSec=11025;
_WaveFormatex.wBitsPerSample=8; //指定录音格式
_WaveFormatex.nBlockAlign=_WaveFormatex.wBitsPerSample/8;
_WaveFormatex.nAvgBytesPerSec=_WaveFormatex.nSamplesPerSec*_WaveFormatex.nBlockAlign;
_WaveFormatex.cbSize=0;
}
if ( !waveInGetNumDevs() ) return (HWAVEIN)WAVE_ERROR_NO_DEVICE;
if (waveInOpen(&hWaveIn,
WAVE_MAPPER,
_pWaveFormatex,
(DWORD)xxWaveProcCallBack,
(HANDLE)GetModuleHandle(0),
CALLBACK_FUNCTION // CALLBACK_FUNCTION、CALL_BACKTHREAD、CALLBACK_WINDOW
)!= (HWAVEIN)MMSYSERR_NOERROR) {
return (HWAVEIN)WAVE_ERROR_WAVEINOPEM;
}
return hWaveIn;
}
long xxRecordeStart(HWAVEIN hWaveIn,DWORD dwDataSize)
//dwDataSize可为0
{
WAVEHDR WaveHdr1;
WAVEHDR WaveHdr2;
DWORD _dwDataSize;
_dwDataSize = dwDataSize;
if( 0 == dwDataSize )_dwDataSize = WAVE_DATASIZE;
WaveHdr1.lpData = (char *)GlobalLock( GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, _dwDataSize) );
WaveHdr1.dwBufferLength=_dwDataSize;
WaveHdr1.dwBytesRecorded=0;
WaveHdr1.dwUser=0;
WaveHdr1.dwFlags=0;
WaveHdr1.dwLoops=1;
WaveHdr1.lpNext=NULL;
WaveHdr1.reserved=0;
waveInPrepareHeader(hWaveIn,&WaveHdr1,sizeof(WAVEHDR));
waveInAddBuffer (hWaveIn, &WaveHdr1, sizeof (WAVEHDR)) ;
WaveHdr2.lpData = (char *)GlobalLock( GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, _dwDataSize) );
WaveHdr2.dwBufferLength=_dwDataSize;
WaveHdr2.dwBytesRecorded=0;
WaveHdr2.dwUser=0;
WaveHdr2.dwFlags=0;
WaveHdr2.dwLoops=1;
WaveHdr2.lpNext=NULL;
WaveHdr2.reserved=0;
waveInPrepareHeader(hWaveIn,&WaveHdr2,sizeof(WAVEHDR));
waveInAddBuffer (hWaveIn, &WaveHdr2, sizeof (WAVEHDR)) ;
if (waveInStart (hWaveIn) != MMSYSERR_NOERROR)return WAVE_ERROR_WAVEINSTART;
return WAVE_ERROR_SUCESS;
}
HWAVEOUT xxWaveOutOpen(WAVEFORMATEX *pWaveFormatex)
{
WAVEFORMATEX _WaveFormatex;
WAVEFORMATEX* _pWaveFormatex;
HWAVEOUT hWaveOut;
_pWaveFormatex = pWaveFormatex;
if( NULL == _pWaveFormatex )
{
_pWaveFormatex = &_WaveFormatex;
_WaveFormatex.wFormatTag=WAVE_FORMAT_PCM;
_WaveFormatex.nChannels=1;
_WaveFormatex.nSamplesPerSec=11025;
_WaveFormatex.wBitsPerSample=8; //指定录音格式
_WaveFormatex.nBlockAlign=_WaveFormatex.wBitsPerSample/8;
_WaveFormatex.nAvgBytesPerSec=_WaveFormatex.nSamplesPerSec*_WaveFormatex.nBlockAlign;
_WaveFormatex.cbSize=0;
}
if ( !waveInGetNumDevs() ) return (HWAVEOUT)WAVE_ERROR_NO_DEVICE;
if (waveOutOpen(&hWaveOut,
WAVE_MAPPER,
_pWaveFormatex,
(DWORD)xxWaveProcCallBack,
(DWORD)GetModuleHandle(0),
CALLBACK_FUNCTION // CALLBACK_FUNCTION、CALL_BACKTHREAD、CALLBACK_WINDOW
)!= (HWAVEOUT)MMSYSERR_NOERROR)return (HWAVEOUT)WAVE_ERROR_WAVEOUTOPEM;
return hWaveOut;
}
long xxPlay(HWAVEOUT hWaveOut,PVOID data,DWORD dwDataSize)
{
WAVEHDR WaveHdr;
WaveHdr.lpData = (char *)GlobalLock( GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, dwDataSize) );
CopyMemory(&WaveHdr.lpData,data,dwDataSize);
WaveHdr.dwBufferLength=dwDataSize;
WaveHdr.dwBytesRecorded=0;
WaveHdr.dwUser=0;
WaveHdr.dwFlags=0;
WaveHdr.dwLoops=1;
WaveHdr.lpNext=NULL;
WaveHdr.reserved=0;
waveOutPrepareHeader (hWaveOut, &WaveHdr, sizeof (WAVEHDR)) ;
waveOutWrite (hWaveOut, &WaveHdr, sizeof (WAVEHDR)) ;
}
void CALLBACK xxWaveProcCallBack(HWAVEIN hWaveIn,
UINT uMsg,
DWORD dwInstance,
DWORD wParam,
DWORD lParam)
{
switch(uMsg)
{
case MM_MIM_OPEN:
break;
case MM_WIM_DATA:
waveInAddBuffer (hWaveIn, (PWAVEHDR)wParam, sizeof (WAVEHDR));
break;
case MM_MIM_CLOSE:
GlobalFree((PWAVEHDR)wParam.lpNext.lpData);
GlobalFree((PWAVEHDR)wParam.lpData);
waveInUnprepareHeader (hWaveIn,(PWAVEHDR)wParam.lpNext, sizeof (WAVEHDR)) ;
waveInUnprepareHeader (hWaveIn,(PWAVEHDR)wParam, sizeof (WAVEHDR)) ;
break;
case MM_WOM_OPEN:
//waveInAddBuffer (hWaveIn, (PWAVEHDR)wParam, sizeof (WAVEHDR));
break;
case MM_WOM_DONE:
// WaveOut();
break;
case MM_WOM_CLOSE:
waveOutUnprepareHeader ((HWAVEOUT)hWaveIn,(PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -