网络录音程序的录音部分实现

先是初始化部分:

void CreateSock(void)
{
	closesocket(sock);
	sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	
	addr.sin_family=AF_INET;
	addr.sin_port=htons(2288);
	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	
	int iResult = connect(sock,(SOCKADDR*)&addr,sizeof(addr));	
	GetWave();//开始录音	
}

创建套接字,并开始启动录音

void GetWave(void)
{
	pWaveHdr1=reinterpret_cast<PWAVEHDR>(malloc(sizeof(WAVEHDR)));
	pWaveHdr2=reinterpret_cast<PWAVEHDR>(malloc(sizeof(WAVEHDR)));
	pSaveBuffer = reinterpret_cast<PBYTE>(malloc(1));
	
	pBuffer1=(PBYTE)malloc(INP_BUFFER_SIZE);
	pBuffer2=(PBYTE)malloc(INP_BUFFER_SIZE);
	if (!pBuffer1 || !pBuffer2) 
	{
		if (pBuffer1) free(pBuffer1);
		if (pBuffer2) free(pBuffer2);
		return;
	}
	
	//open waveform audo for input
	
	waveform.wFormatTag=WAVE_FORMAT_PCM;
	waveform.nChannels=1;
	waveform.nSamplesPerSec=11025;
	waveform.nAvgBytesPerSec=11025;
	waveform.nBlockAlign=1;
	waveform.wBitsPerSample=8;
	waveform.cbSize=0;
    
	
	if (waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)WaveS,0,CALLBACK_FUNCTION)) 
	{
		free(pBuffer1);
		free(pBuffer2);
		//MessageBox(NULL,"Open erro!",NULL,MB_OK);
		
	}//打开设备
	pWaveHdr1->lpData=(LPTSTR)pBuffer1;
	pWaveHdr1->dwBufferLength=INP_BUFFER_SIZE;
	pWaveHdr1->dwBytesRecorded=0;
	pWaveHdr1->dwUser=0;
	pWaveHdr1->dwFlags=0;
	pWaveHdr1->dwLoops=1;
	pWaveHdr1->lpNext=NULL;
	pWaveHdr1->reserved=0;
	
	waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));//准保内存块录音
	
	pWaveHdr2->lpData=(LPTSTR)pBuffer2;
	pWaveHdr2->dwBufferLength=INP_BUFFER_SIZE;
	pWaveHdr2->dwBytesRecorded=0;
	pWaveHdr2->dwUser=0;
	pWaveHdr2->dwFlags=0;
	pWaveHdr2->dwLoops=1;
	pWaveHdr2->lpNext=NULL;
	pWaveHdr2->reserved=0;
	
	waveInPrepareHeader(hWaveIn,pWaveHdr2,sizeof(WAVEHDR));
	
	//
	pSaveBuffer = (PBYTE)realloc (pSaveBuffer, 1) ;
	// Add the buffers
	
	waveInAddBuffer (hWaveIn, pWaveHdr1, sizeof (WAVEHDR));
	waveInAddBuffer (hWaveIn, pWaveHdr2, sizeof (WAVEHDR));	
	waveInStart (hWaveIn);	
}
static void CALLBACK WaveS(HWAVEIN waveIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
	switch(uMsg)
	{
	case MM_WIM_CLOSE:
		waveInUnprepareHeader (waveIn, pWaveHdr1, sizeof (WAVEHDR)) ;
		waveInUnprepareHeader (waveIn, pWaveHdr2, sizeof (WAVEHDR)) ;
		free(pBuffer1);
		free(pBuffer2);
		break;
	case MM_WIM_DATA:
		
		pNewBuffer = (PBYTE)realloc (pSaveBuffer,dwDataLength +((PWAVEHDR)dwParam1)->dwBytesRecorded);
		if (pNewBuffer == NULL)
		{
			waveInClose (waveIn) ;
			return ;
		}
		
		pSaveBuffer = pNewBuffer ;
		//
		CopyMemory (pSaveBuffer + dwDataLength, ((PWAVEHDR)dwParam1)->lpData,((PWAVEHDR)dwParam1)->dwBytesRecorded) ;
		dwDataLength += ((PWAVEHDR)dwParam1)->dwBytesRecorded ;
		
		if(dwDataLength>=11300)
		{
			
			int ret=send(sock,(char*)pSaveBuffer,dwDataLength,0);
			if(ret==SOCKET_ERROR)
			{
				m_close=TRUE;
				ResumeThread(m_handle);
				waveInClose(hWaveIn);
			}
			//Sleep(1000);
			free (pSaveBuffer);
			pSaveBuffer = reinterpret_cast<PBYTE>(malloc(1));
			dwDataLength=0;
		}
		// Send out a new buffer
		waveInAddBuffer (waveIn, (PWAVEHDR)dwParam1, sizeof (WAVEHDR)) ;
		break;
	}
	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值