📄 audiorcv.h
字号:
#include "mmsystem.h"
#pragma comment(lib,"winmm.lib")
#include "stdafx.h"
#define datasize 640
HWAVEIN m_hWaveIn ;
int m_bufblock ;
char *pAudioBuf ;
LPWAVEHDR m_pWaveHdr1,m_pWaveHdr2;
FILE *fp ;
unsigned int G722_enc_run(short *in, unsigned char *out, unsigned int sample) ;
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2) ;
class CSoundin
{
public:
WAVEHDR m_pWaveHdr;
WAVEFORMATEX waveformat;
bool m_bRecord ;
public:
BOOL Start(char *buf,DWORD dwBlockRecord)
{
fp=fopen("sound.mp4","wb") ;
pAudioBuf = buf ;
m_bufblock = dwBlockRecord ;
if (fp == NULL)
{
::MessageBox(NULL,"不能创建文件","",MB_OK) ;
}
m_hWaveIn = NULL ;
waveformat.wFormatTag=WAVE_FORMAT_PCM;
waveformat.nChannels=1;
waveformat.nSamplesPerSec=8000;
waveformat.nAvgBytesPerSec=16000;
waveformat.nBlockAlign=2;
waveformat.wBitsPerSample=16; //指定录音格式
waveformat.cbSize=0;
if ( !waveInGetNumDevs() ){
::MessageBox(NULL,"没有可以使用的录音通道","a",MB_OK) ;
return FALSE;
}
int res=waveInOpen(&m_hWaveIn,WAVE_MAPPER, &waveformat,(DWORD)waveInProc,(DWORD)this,CALLBACK_FUNCTION);
if ( res != MMSYSERR_NOERROR ){
::MessageBox(NULL,"打开waveIn失败","a",MB_OK) ;
return FALSE;
}
AddInputBufferToQueue();
if ( waveInStart(m_hWaveIn) ){
::MessageBox(NULL,"录音失败","a",MB_OK) ;
return FALSE;
}
m_bRecord=true ;
return 1 ;
}
void Stop()
{
MMRESULT mmReturn ;
mmReturn=0 ;
if (!m_bRecord)
{
return ;
}
else
{
m_bRecord = false ;
Sleep(500);
mmReturn = waveInClose(m_hWaveIn) ;
if(mmReturn)
{
::MessageBox(NULL,"Stop失败","",MB_OK);
}
delete m_pWaveHdr1->lpData;
delete m_pWaveHdr2->lpData;
delete m_pWaveHdr1;
delete m_pWaveHdr2;
if (fclose(fp) != 0 )
{
::MessageBox(NULL,"停止录音失败","",MB_OK);
}
}
}
void AddInputBufferToQueue()
{
m_pWaveHdr1 = new WAVEHDR;
m_pWaveHdr2 = new WAVEHDR;
if(m_pWaveHdr1 == NULL) return ;
if(m_pWaveHdr2 == NULL) return ;
ZeroMemory(m_pWaveHdr1, sizeof(WAVEHDR));
ZeroMemory(m_pWaveHdr2, sizeof(WAVEHDR));
m_pWaveHdr1->lpData = new char[datasize] ;
m_pWaveHdr1->dwBufferLength = datasize;
m_pWaveHdr2->lpData = new char[datasize] ;
m_pWaveHdr2->dwBufferLength = datasize;
int resPrepare1 = waveInPrepareHeader( m_hWaveIn, m_pWaveHdr1, sizeof(WAVEHDR) );
int resPrepare2 = waveInPrepareHeader( m_hWaveIn, m_pWaveHdr2, sizeof(WAVEHDR) );
if ( resPrepare1 != MMSYSERR_NOERROR||resPrepare2 != MMSYSERR_NOERROR)
{
::MessageBox(NULL,"不能开辟录音头文件","a",MB_OK) ;
return ;
}
resPrepare1 = waveInAddBuffer( m_hWaveIn, m_pWaveHdr1, sizeof(WAVEHDR) );
resPrepare2 = waveInAddBuffer( m_hWaveIn, m_pWaveHdr2, sizeof(WAVEHDR) );
if ( resPrepare1 != MMSYSERR_NOERROR||resPrepare2 != MMSYSERR_NOERROR)
{
::MessageBox(NULL,"不能开辟录音用缓冲1","a",MB_OK) ;
return ;
}
}
void Full(DWORD param)
{
m_bufblock-- ;
LPWAVEHDR pHdr = (LPWAVEHDR) param;
if (m_bRecord)
{
G722_enc_run((short* )pHdr->lpData,(unsigned char *)pAudioBuf,datasize) ;
fwrite(pAudioBuf,120,1,fp) ;
waveInAddBuffer(m_hWaveIn, pHdr, sizeof(WAVEHDR));
}
}
};
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
CSoundin *sound ;
sound = (CSoundin *)dwInstance ;
switch (uMsg) {
case WIM_OPEN :
break ;
case WIM_DATA :
sound->Full(dwParam1);
break ;
case WIM_CLOSE :
break ;
default :
break ;
}
}
#include "g722_enc.cpp"
unsigned int G722_enc_run(short *in, unsigned char *out, unsigned int sample)
{
unsigned short il,ih;
short xl,xh;
short *pRcvBuf = in;
unsigned char *pSendBuf = out ;
// 编码
for(int i=0;i<sample;i+= 16) {
// 0)
transmit_qmf(pRcvBuf[0],pRcvBuf[1],&xl,&xh);
lower_sb_encode(xl,&il);
higher_sb_encode(xh,&ih);
pSendBuf[0] = (il&0x3c)|(ih&0x3);
// 1)
transmit_qmf(pRcvBuf[2],pRcvBuf[3],&xl,&xh);
lower_sb_encode(xl,&il);
higher_sb_encode(xh,&ih);
pSendBuf[0] |= ih<<6;
pSendBuf[1] = (il&0x3c)>>2;
// 2)
transmit_qmf(pRcvBuf[4],pRcvBuf[5],&xl,&xh);
lower_sb_encode(xl,&il);
higher_sb_encode(xh,&ih);
pSendBuf[1] |= ((il&0x3c)|(ih&0x3))<<4;
pSendBuf[2] = (il>>4)&0x3;
// 3)
transmit_qmf(pRcvBuf[6],pRcvBuf[7],&xl,&xh);
lower_sb_encode(xl,&il);
higher_sb_encode(xh,&ih);
pSendBuf[2] |= ((il&0x3c)|(ih&0x3))<<2;
pRcvBuf += 8 ;
pSendBuf += 3 ;
}
return (unsigned int)((sample>>3)*3.0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -