📄 rectestdlg.cpp
字号:
{
ret = m_Client.Send((pdlg->m_AudioDataIn[pdlg->nSend].lpdata+dwSent),(length-dwSent));
if(ret==SOCKET_ERROR)//检错
{
AfxMessageBox("声音文件传输错误!"+pdlg->GetError(GetLastError()));
pdlg->OnOK();
break;
}
else //发送未发送完的
{
dwSent += ret;
if(dwSent ==length)
{
free(pdlg->m_AudioDataIn[pdlg->nSend].lpdata);
pdlg->m_AudioDataIn[pdlg->nSend].dwLength = 0;
break;
}
}
} //======================================发送声音文件结束
}
pdlg->nSend = (pdlg->nSend +1)% InBlocks;
}
}
else
AfxMessageBox("Socket连接失败"+pdlg->GetError(GetLastError()));
m_Client.Close();
return 0;
}
CString CRecTestDlg::GetError(DWORD error) //返回错误信息
{
CString strError;
switch(error)
{
case WSANOTINITIALISED:
strError="初始化错误";
break;
case WSAENOTCONN:
strError="对方没有启动";
break;
case WSAEWOULDBLOCK :
strError="对方已经关闭";
break;
case WSAECONNREFUSED:
strError="连接的尝试被拒绝";
break;
case WSAENOTSOCK:
strError="在一个非套接字上尝试了一个操作";
break;
case WSAEADDRINUSE:
strError="特定的地址已在使用中";
break;
case WSAECONNRESET:
strError="与主机的连接被关闭";
break;
default:
strError="一般错误";
}
return strError;
}
void CRecTestDlg::OnBegin()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_BEGIN)->EnableWindow(false);
//allocate buffer memory
pBuffer1=(PBYTE)malloc(INP_BUFFER_SIZE);
pBuffer2=(PBYTE)malloc(INP_BUFFER_SIZE);
if (!pBuffer1 || !pBuffer2)
{
if (pBuffer1)
free(pBuffer1);
if (pBuffer2)
free(pBuffer2);
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox("Memory erro!");
return ;
}
//open waveform audio for input
m_waveformin.wFormatTag=WAVE_FORMAT_PCM;
m_waveformin.nChannels=1;
m_waveformin.nSamplesPerSec=11025;//采样频率
m_waveformin.nAvgBytesPerSec=11025;
m_waveformin.nBlockAlign=1;
m_waveformin.wBitsPerSample=8;
m_waveformin.cbSize=0;
if (waveInOpen(&hWaveIn,WAVE_MAPPER,&m_waveformin,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW))
{ // 打开录音设备函数
free(pBuffer1);
free(pBuffer2);
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox("Audio can not be open!");
}
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));
// Add the buffers
waveInAddBuffer (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ;
waveInAddBuffer (hWaveIn, pWaveHdr2, sizeof (WAVEHDR)) ;
// Begin sampling
waveInStart (hWaveIn) ;
UpdateData(true);
g_ServerIp=m_ServerIp;
m_waveformout.wFormatTag = WAVE_FORMAT_PCM;
m_waveformout.nChannels =1;
m_waveformout.nSamplesPerSec =11025;
m_waveformout.nAvgBytesPerSec =11025;
m_waveformout.nBlockAlign =1;
m_waveformout.wBitsPerSample =8;
m_waveformout.cbSize =0;
// 下面函数的调用会触发另一个函数
if (waveOutOpen(&hWaveOut,WAVE_MAPPER,&m_waveformout,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW)) {
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox("Audio output erro");
}
// run the thread
::AfxBeginThread(Audio_Send_Thread,this);
//::AfxBeginThread(Audio_Listen_Thread,this);
return ;
}
void CRecTestDlg::OnMM_WIM_DATA(UINT wParam,LONG lParam)
{
int nextBlock = (nAudioIn+1)% InBlocks;
// 在发送线程函数中,如果发送完一块,他会置0
// 如果下一“块”没发走只有是index回到了头
if(m_AudioDataIn[nextBlock].dwLength!=0)//下一“块”没发走
{ // 把PWAVEHDR(即pBUfferi)里的数据拷贝到当前“块”中
m_AudioDataIn[nAudioIn].lpdata
= (PBYTE)realloc (m_AudioDataIn[nAudioIn].lpdata , (((PWAVEHDR) lParam)->dwBytesRecorded+m_AudioDataIn[nAudioIn].dwLength)) ;
if (m_AudioDataIn[nAudioIn].lpdata == NULL)
{
waveInClose (hWaveIn) ;
MessageBeep (MB_ICONEXCLAMATION) ;
AfxMessageBox("erro memory OnMM_WIM_DATA");
return ;
}
CopyMemory (
(m_AudioDataIn[nAudioIn].lpdata+m_AudioDataIn[nAudioIn].dwLength),
((PWAVEHDR) lParam)->lpData,
((PWAVEHDR) lParam)->dwBytesRecorded
) ;//(*destination,*resource,nLen);
m_AudioDataIn[nAudioIn].dwLength +=((PWAVEHDR) lParam)->dwBytesRecorded;
}
else //把PWAVEHDR(即pBUfferi)里的数据拷贝到下一“块”中
{
nAudioIn = (nAudioIn+1)% InBlocks;
m_AudioDataIn[nAudioIn].lpdata = (PBYTE)realloc
(0,((PWAVEHDR) lParam)->dwBytesRecorded);
CopyMemory(m_AudioDataIn[nAudioIn].lpdata,
((PWAVEHDR) lParam)->lpData,
((PWAVEHDR) lParam)->dwBytesRecorded) ;
m_AudioDataIn[nAudioIn].dwLength =((PWAVEHDR) lParam)->dwBytesRecorded;
}
// Send out a new buffer
waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
return ;
}
void CRecTestDlg::OnMM_WIM_CLOSE(UINT wParam,LONG lParam)
{
// You must call this function before freeing the buffer
waveInUnprepareHeader (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ;
waveInUnprepareHeader (hWaveIn, pWaveHdr2, sizeof (WAVEHDR)) ;
free (pBuffer1) ;
free (pBuffer2) ;
return ;
}
// 打开输出时时自动调用这个函数
void CRecTestDlg::OnMM_WOM_OPEN(UINT wParam,LONG lParam)
{
// Set up header
pWaveHdrOut->lpData = (LPTSTR)m_AudioDataOut[nAudioOut].lpdata ;
pWaveHdrOut->dwBufferLength = m_AudioDataOut[nAudioOut].dwLength ;
pWaveHdrOut->dwBytesRecorded = 0 ;
pWaveHdrOut->dwUser = 0 ;
pWaveHdrOut->dwFlags = WHDR_BEGINLOOP ;
pWaveHdrOut->dwLoops = 1 ;
pWaveHdrOut->lpNext = NULL ;
pWaveHdrOut->reserved = 0 ;
// Prepare and write
waveOutPrepareHeader (hWaveOut, pWaveHdrOut, sizeof (WAVEHDR)) ;
waveOutWrite (hWaveOut, pWaveHdrOut, sizeof (WAVEHDR)) ;
return;
}
//数据已经播放完时才会触发这个消息函数
void CRecTestDlg::OnMM_WOM_DONE(UINT wParam,LONG lParam)
{
free(m_AudioDataOut[nAudioOut].lpdata);
m_AudioDataOut[nAudioOut].lpdata = reinterpret_cast<PBYTE>(malloc(1));
m_AudioDataOut[nAudioOut].dwLength = 0;
//一块已经播放完毕,这时让其指向另一块缓冲区进行播放
nAudioOut= (nAudioOut+1)%OutBlocks;
((PWAVEHDR)lParam)->lpData = (LPTSTR)m_AudioDataOut[nAudioOut].lpdata ;
((PWAVEHDR)lParam)->dwBufferLength = m_AudioDataOut[nAudioOut].dwLength ;
TRACE("the next length %d\n",((PWAVEHDR)lParam)->dwBufferLength);
/////////////////////////////////////////////////////////////////////////////
// Prepare and write
waveOutPrepareHeader (hWaveOut,(PWAVEHDR)lParam,sizeof(WAVEHDR));
waveOutWrite(hWaveOut,(PWAVEHDR)lParam,sizeof(WAVEHDR));//cut
return;
}
void CRecTestDlg::OnMM_WOM_CLOSE(UINT wParam,LONG lParam)
{
waveOutUnprepareHeader (hWaveOut, pWaveHdrOut, sizeof (WAVEHDR)) ;
//release all the memory of the AudioData
for(int i=0;i<InBlocks;i++)
{
if(m_AudioDataIn[i].dwLength != 0)
free(m_AudioDataIn[i].lpdata);
}
for(i=0;i<OutBlocks;i++)
{
if(m_AudioDataOut[i].dwLength != 0)
free(m_AudioDataOut[i].lpdata);
}
}
// 退出
void CRecTestDlg::OnOK()
{
// TODO: Add extra validation here
// stops input on the given waveform-audio input device
// and resets the current position to zero
waveInReset(hWaveIn);
waveInClose(hWaveIn);
waveOutReset(hWaveOut);
waveOutClose (hWaveOut);
CDialog::OnOK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -