捕获电脑的声音放到手机播放
在pc上使用adb命令:adb forward tcp:4626 tcp:4883,在PC上建立4626端口通信数据将被重定向到手机端server的4883端口;然后初始化socket,连接到手机4626端口,进行socket通信。PC端代码如下:
[html]
DWORD WINAPI usbThreadFunc(LPVOID threadNum)
{
int length;
CString temp;
if(!initAdb())//adb init
{
MessageBox(0, L"初始化手机出错!", L"提示", MB_OK);
return 0;
}
if(!InItClientSock())//socket init
{
MessageBox(0, L"初始化IP地址出错!", L"提示", MB_OK);
return 0;
}
if(!USBConnectSock((HWND)threadNum))//connect socket
{
MessageBox(0, L"连接IP地址出错!", L"提示", MB_OK);
return 0;
}
//等待连接的时候,连接可能被取消。
if(clientThreadRun)
{
}
else
{
MessageBox(0, L"用户取消!", L"提示", MB_OK);
return 0;
}
SetDlgItemText( (HWND)threadNum, IDC_SOUNDFILE, TEXT("&USB Disconnect") );
EnableWindow( GetDlgItem( (HWND)threadNum, IDC_RECORD ), TRUE );
EnableWindow( GetDlgItem( (HWND)threadNum, IDC_BUTTON_WIFI ), FALSE );
while(clientThreadRun)
{
if( (length = recv(clientSock,(char*)recv_message_client,sizeof(recv_message_client),0))>0)
{
memset(recv_message_client, 0, sizeof(recv_message_client));
LogPrintf(recv_message_client);
}
}
return 0;
}
DWORD WINAPI usbThreadFunc(LPVOID threadNum)
{
int length;
CString temp;
if(!initAdb())//adb init
{
MessageBox(0, L"初始化手机出错!", L"提示", MB_OK);
return 0;
}
if(!InItClientSock())//socket init
{
MessageBox(0, L"初始化IP地址出错!", L"提示", MB_OK);
return 0;
}
if(!USBConnectSock((HWND)threadNum))//connect socket
{
MessageBox(0, L"连接IP地址出错!", L"提示", MB_OK);
return 0;
}
//等待连接的时候,连接可能被取消。
if(clientThreadRun)
{
}
else
{
MessageBox(0, L"用户取消!", L"提示", MB_OK);
return 0;
}
SetDlgItemText( (HWND)threadNum, IDC_SOUNDFILE, TEXT("&USB Disconnect") );
EnableWindow( GetDlgItem( (HWND)threadNum, IDC_RECORD ), TRUE );
EnableWindow( GetDlgItem( (HWND)threadNum, IDC_BUTTON_WIFI ), FALSE );
while(clientThreadRun)
{
if( (length = recv(clientSock,(char*)recv_message_client,sizeof(recv_message_client),0))>0)
{
memset(recv_message_client, 0, sizeof(recv_message_client));
LogPrintf(recv_message_client);
}
}
return 0;
}
这里说道最重要的是捕获声音,下面的代码启动了一个线程来处理捕获到的声音:
[html]
DWORD WINAPI captureThreadFunc(LPVOID hDlg)
{
DWORD dwResult;
while(g_bRecording)
{
dwResult = MsgWaitForMultipleObjects( 1, &g_hNotificationEvent, FALSE, INFINITE, QS_ALLEVENTS );
switch( dwResult )
{
case STATUS_WAIT_0://case WAIT_OBJECT_0 + 0:
RecordCapturedData();
break;
}
}
return 0;
}
DWORD WINAPI captureThreadFunc(LPVOID hDlg)
{
DWORD dwResult;
while(g_bRecording)
{
dwResult = MsgWaitForMultipleObjects( 1, &g_hNotificationEvent, FALSE, INFINITE, QS_ALLEVENTS );
switch( dwResult )
{
case STATUS_WAIT_0://case WAIT_OBJECT_0 + 0:
RecordCapturedData();
break;
}
}
return 0;
}
在创建捕获声音的设备的时候,会创建一个事件,这个事件就是捕获到一定长度的声音之后(比如2K大小的声音),会发出一个通知,告诉你去处理。上面的线程,就是一直待等待这个事件,然后再去处理捕获到的声音,把声音发送给socket,交给手机处理,代码:
[html]
HRESULT RecordCapturedData()
{
HRESULT hr;
VOID* pbCaptureData = NULL;
DWORD dwCaptureLength;
VOID* pbCaptureData2 = NULL;
DWORD dwCaptureLength2;
DWORD dwReadPos;
DWORD dwCapturePos;
LONG lLockSize;
if( NULL == g_pDSBCapture )
return S_FALSE;
if( FAILED( hr = g_pDSBCapture->GetCurrentPosition( &dwCapturePos, &dwReadPos ) ) )
return DXTRACE_ERR_MSGBOX( TEXT("GetCurrentPosition"), hr );
lLockSize = dwReadPos - g_dwNextCaptureOffset;
if( lLockSize < 0 )
lLockSize += g_dwCaptureBufferSize;
// Block align lock size so that we are always write on a boundary
lLockSize -= (lLockSize % g_dwNotifySize);
if( lLockSize == 0 )
return S_FALSE;
// Lock the capture buffer down
&n
补充:web前端 , HTML 5 ,