⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audiorcv.h

📁 实时监控
💻 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 + -