📄 record(4).cpp
字号:
#include <windows.h>
#include "Record.h"
#define NSAMPLESPERSEC 16000
#define WBITESPERSAMPLE 16
#define WAVE_DATASIZE 16000*10 //缓冲区大小
#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;
WAVEHDR WaveInHdr1;
WAVEHDR WaveInHdr2;
HWAVEIN hWaveIn;
DWORD FCC(LPSTR lpStr)
{
DWORD Number = lpStr[0] + lpStr[1] *0x100 + lpStr[2] *0x10000 + lpStr[3] *0x1000000 ;
return Number;
}
void DealWave(LPTSTR pSaveBuffer,DWORD dwDataLength)
{
int i;
//_asm int 3
for(i=0;i<dwDataLength/2-NSAMPLESPERSEC;i++)
{
//if( (*(unsigned short int *)(pSaveBuffer+i))&0x7FFF > (*(unsigned short int *)(pSaveBuffer+i+NSAMPLESPERSEC))&0x7FFF)
*((short *)pSaveBuffer+i)=*((short *)pSaveBuffer+i+NSAMPLESPERSEC);
}
}
void SavePCMFile(LPTSTR pSaveBuffer,DWORD dwDataLength)
{
WAVEFORMATEX _WaveFormatex;
HANDLE FileHandle;
DWORD NumToWrite=0;
DWORD dwNumber = 0;
FileHandle =CreateFile( "myTest.wav", GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
_WaveFormatex.wFormatTag=WAVE_FORMAT_PCM;
_WaveFormatex.nChannels=1;
_WaveFormatex.nSamplesPerSec=NSAMPLESPERSEC;
_WaveFormatex.wBitsPerSample=WBITESPERSAMPLE; //指定录音格式
_WaveFormatex.nBlockAlign=_WaveFormatex.wBitsPerSample/8;
_WaveFormatex.nAvgBytesPerSec=_WaveFormatex.nSamplesPerSec*_WaveFormatex.nBlockAlign;
_WaveFormatex.cbSize=0;
DealWave(pSaveBuffer,dwDataLength);
dwNumber = FCC("RIFF");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = dwDataLength + 18 + 20;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = FCC("WAVE");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = FCC("fmt ");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = 18L;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
WriteFile(FileHandle, &_WaveFormatex, sizeof(WAVEFORMATEX), &NumToWrite, NULL);
dwNumber = FCC("data");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = dwDataLength;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
WriteFile(FileHandle, pSaveBuffer, dwNumber, &NumToWrite, NULL);
//waveout
SetEndOfFile(FileHandle);
CloseHandle( FileHandle ); FileHandle = INVALID_HANDLE_VALUE; // 收尾关闭句柄
}
HWAVEIN RecordStart()
//pWaveFormatex可为0
{
WAVEFORMATEX _WaveFormatex;
_WaveFormatex.wFormatTag=WAVE_FORMAT_PCM;
_WaveFormatex.nChannels=1;
_WaveFormatex.nSamplesPerSec=NSAMPLESPERSEC;
_WaveFormatex.wBitsPerSample=WBITESPERSAMPLE; //指定录音格式
_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,
&_WaveFormatex,
(DWORD)RecordCallBack,
(DWORD)GetModuleHandle(0),
CALLBACK_FUNCTION // CALLBACK_FUNCTION、CALL_BACKTHREAD、CALLBACK_WINDOW
)!= MMSYSERR_NOERROR) {
return (HWAVEIN)WAVE_ERROR_WAVEINOPEM;
}
WaveInHdr1.lpData = (char *)malloc(WAVE_DATASIZE);
WaveInHdr1.dwBufferLength=WAVE_DATASIZE;
WaveInHdr1.dwBytesRecorded=0;
WaveInHdr1.dwUser=0;
WaveInHdr1.dwFlags=0;
WaveInHdr1.dwLoops=1;
WaveInHdr1.lpNext=NULL;
WaveInHdr1.reserved=0;
waveInPrepareHeader(hWaveIn,&WaveInHdr1,sizeof(WAVEHDR));
waveInAddBuffer (hWaveIn, &WaveInHdr1, sizeof (WAVEHDR)) ;
WaveInHdr2.lpData = (char *)malloc(WAVE_DATASIZE);
WaveInHdr2.dwBufferLength=WAVE_DATASIZE;
WaveInHdr2.dwBytesRecorded=0;
WaveInHdr2.dwUser=0;
WaveInHdr2.dwFlags=0;
WaveInHdr2.dwLoops=1;
WaveInHdr2.lpNext=NULL;
WaveInHdr2.reserved=0;
waveInPrepareHeader(hWaveIn,&WaveInHdr2,sizeof(WAVEHDR));
waveInAddBuffer (hWaveIn, &WaveInHdr2, sizeof (WAVEHDR)) ;
//
//开始录音
//
if (waveInStart (hWaveIn) != MMSYSERR_NOERROR)return WAVE_ERROR_WAVEINSTART;
return WAVE_ERROR_SUCESS;
}
void CALLBACK RecordCallBack(HWAVEIN hWaveIn,
UINT uMsg,
DWORD dwInstance,
DWORD wParam,
DWORD lParam)
{
switch(uMsg)
{
case WIM_OPEN:
break;
case WIM_DATA:
//_asm int 3
SavePCMFile(((PWAVEHDR)wParam)->lpData,((PWAVEHDR)wParam)->dwBytesRecorded);
//waveInAddBuffer (hWaveIn, (PWAVEHDR)wParam, sizeof (WAVEHDR));
//_asm int 3
//waveInReset(hWaveIn);
waveInClose(hWaveIn);
MessageBox(0,"录音结束","",MB_OK);
break;
case MM_MIM_CLOSE:
free(((PWAVEHDR)wParam)->lpNext->lpData);
free(((PWAVEHDR)wParam)->lpData);
waveInUnprepareHeader (hWaveIn,((PWAVEHDR)wParam)->lpNext, sizeof (WAVEHDR)) ;
waveInUnprepareHeader (hWaveIn,(PWAVEHDR)wParam, sizeof (WAVEHDR)) ;
break;
case MM_WOM_OPEN:
break;
case MM_WOM_DONE:
break;
case MM_WOM_CLOSE:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -