void CDlgTalk::OnButtonTalkStarttalk() { // 首先对讲模式为客户端模式 CLIENT_SetDeviceMode(m_lLoginID, DH_TALK_CLIENT_MODE, NULL); // 设置语音对讲编码格式 DHDEV_TALKDECODE_INFO stuParam; int ncbIndex = m_cbAudioFormate.GetCurSel(); int nIndex = m_cbAudioFormate.GetItemData(ncbIndex); stuParam.encodeType = m_stuAudioEncodeFormate.type[nIndex].encodeType; stuParam.dwSampleRate = m_stuAudioEncodeFormate.type[nIndex].dwSampleRate; stuParam.nAudioBit = m_stuAudioEncodeFormate.type[nIndex].nAudioBit; stuParam.nPacketPeriod = m_stuAudioEncodeFormate.type[nIndex].nPacketPeriod; CLIENT_SetDeviceMode(m_lLoginID, DH_TALK_ENCODE_TYPE, &stuParam); // 三代设备需要额外参数 //if (m_emDeviceType == NET_AF6016) { NET_TALK_EX stuTalk = {sizeof(stuTalk)}; stuTalk.nAudioPort = RECEIVER_AUDIO_PORT; // 本地收发音频数据的端口 stuTalk.nChannel = 0; stuTalk.nWaitTime = 5000; stuTalk.hVideoWnd = GetDlgItem(IDC_STATIC_TALK_VIDEO)->GetSafeHwnd(); stuTalk.stuVideoFmt.dwCompression = DH_CAPTURE_COMP_DIVX_MPEG4; stuTalk.stuVideoFmt.nFrequency = 8000; CLIENT_SetDeviceMode(m_lLoginID, DH_TALK_MODE3, &stuTalk); } // 向设备发起对讲 m_hTalkingHandle = CLIENT_StartTalkEx(m_lLoginID, AudioDataCallBack, (LDWORD)this); if (m_hTalkingHandle == 0) { // 对讲失败 CString csErr; csErr.Format("%s %08x", ConvertString("Start Talk error:", DLG_TALKING), CLIENT_GetLastError()); MessageBox(csErr, ConvertString("Prompt")); return; } // 开启本地录音 BOOL bRet = CLIENT_RecordStartEx(m_lLoginID); // 启动停止对讲按钮 ((CButton*)GetDlgItem(IDC_BUTTON_TALK_STOPTALK))->EnableWindow(TRUE); ((CButton*)GetDlgItem(IDC_BUTTON_TALK_STARTTALK))->EnableWindow(FALSE); m_wndInviteFlag.StopFlash(); }
static int dah_talk_open(struct service *srv, talk_info_t *talk, talk_handle_t *hdl, media_info_t *info) { int ret = -1; dah_service_t *dah_srv; DH_AUDIO_FORMAT aft; DHDEV_TALKDECODE_INFO cur_talk_mode; NMP_ASSERT(srv && talk); memset(&aft, 0, sizeof(DH_AUDIO_FORMAT)); memset(&cur_talk_mode, 0, sizeof(DHDEV_TALKDECODE_INFO)); aft.byFormatTag = 0; aft.nChannels = 1; aft.nSamplesPerSec = 8000; aft.wBitsPerSample = 16; dah_srv = (dah_service_t*)srv; talk->handle = dah_get_user_id(&dah_srv->parm); if(talk->frm) { nmp_dealloc(talk->frm, sizeof(frame_t) + MAX_ENCODE_BUFFER_LEN); talk->frm = NULL; } talk->frm = (frame_t *)nmp_alloc0(sizeof(frame_t) + MAX_ENCODE_BUFFER_LEN); if(!talk->frm) { return -1; } if (DAH_LOGOUT == dah_get_user_id(&dah_srv->parm)) { show_warn("dah device is disconnected.\n"); } else { ret = CLIENT_InitAudioEncode(aft); if(ret != 0) { show_error("CLIENT_InitAudioEncode error ret = %d\n", ret); if(talk->frm) { nmp_dealloc(talk->frm, sizeof(frame_t) + MAX_ENCODE_BUFFER_LEN); talk->frm = NULL; } return -1; } //查询设备支持的语音对讲列表 DHDEV_TALKFORMAT_LIST lstTalkEncode = {0}; int nRetlen = 0; BOOL bSuccess = CLIENT_QueryDevState(dah_get_user_id(&dah_srv->parm), DH_DEVSTATE_TALK_ECTYPE, (char*)&lstTalkEncode, sizeof(DHDEV_TALKFORMAT_LIST), &nRetlen, 2000); if (!(bSuccess&&nRetlen == sizeof(DHDEV_TALKFORMAT_LIST))) { show_error("query talk format failed, error = 0x%x\n", CLIENT_GetLastError()); if(talk->frm) { nmp_dealloc(talk->frm, sizeof(frame_t) + MAX_ENCODE_BUFFER_LEN); talk->frm = NULL; } return -1; } ret = set_audio_attr(info, &cur_talk_mode); if(ret != 0) { if(talk->frm) { nmp_dealloc(talk->frm, sizeof(frame_t) + MAX_ENCODE_BUFFER_LEN); talk->frm = NULL; } return -1; } // 设置服务器模式语音对讲模式 bSuccess = CLIENT_SetDeviceMode(dah_get_user_id(&dah_srv->parm), DH_TALK_ENCODE_TYPE, &cur_talk_mode); bSuccess = CLIENT_SetDeviceMode(dah_get_user_id(&dah_srv->parm), DH_TALK_SERVER_MODE, NULL); // 开始对讲 talk->talk_handle = CLIENT_StartTalkEx(dah_get_user_id(&dah_srv->parm), (pfAudioDataCallBack)dah_audio_data_callback, (LDWORD)talk); if(0 != talk->talk_handle) { show_info("Start talk success! talk_handle = %d\n", (int)talk->talk_handle); } else { show_error("Start talk failed!, error = 0x%x, user_id = %d\n", CLIENT_GetLastError(), dah_get_user_id(&dah_srv->parm)); if(talk->frm) { nmp_dealloc(talk->frm, sizeof(frame_t) + MAX_ENCODE_BUFFER_LEN); talk->frm = NULL; } return -1; } } return 0; }
void CClientDlg::OnBtnStarttalk() { // TODO: Add your control notification handler code here if(0 != m_lLoginHandle) { // First set audio encode format in audio talk m_curTalkMode.encodeType = DH_TALK_DEFAULT; // DH_TALK_DEFAULT is default way. Usually it is pcm type without head. m_curTalkMode.dwSampleRate = 8000; m_curTalkMode.nAudioBit = 8; int nIndex = m_ctlEncodeType.GetCurSel(); if (-1 != nIndex) { DWORD dwItemData = m_ctlEncodeType.GetItemData(nIndex); m_curTalkMode = m_lstTalkEncode.type[dwItemData]; } // m_curTalkMode.dwSampleRate = 16000; // m_curTalkMode.nAudioBit = 16; BOOL bSuccess = CLIENT_SetDeviceMode(m_lLoginHandle, DH_TALK_ENCODE_TYPE, &m_curTalkMode); // 设置喊话参数 NET_SPEAK_PARAM stSpeak = {sizeof(NET_SPEAK_PARAM)}; stSpeak.nMode = 0; stSpeak.nSpeakerChannel = 0; CButton* pButton = reinterpret_cast<CButton*>(GetDlgItem(IDC_CHECK_SPEAK)); if (0 != pButton) { if (BST_CHECKED == pButton->GetCheck()) { stSpeak.nMode = 1; // 喊话 // 喊话喇嘛通道 int nIndex = m_ctlSpeakerChl.GetCurSel(); if (-1 != nIndex) { stSpeak.nSpeakerChannel = m_ctlSpeakerChl.GetItemData(nIndex); } } } bSuccess = CLIENT_SetDeviceMode(m_lLoginHandle, DH_TALK_SPEAK_PARAM, &stSpeak); if (!bSuccess) { MessageBox(ConvertString("Set speaker param failure!"), ConvertString("Prompt")); } // Then enable audio talk LONG lTalkHandle = CLIENT_StartTalkEx(m_lLoginHandle, AudioDataCallBack, (DWORD)this); if(0 != lTalkHandle) { m_hTalkHandle = lTalkHandle; GetDlgItem(IDC_BTN_STARTTALK)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_STOPTALK)->EnableWindow(TRUE); // Then enbale local record function.(Does not call it if it is a one-direction audio talk.) BOOL bSuccess = CLIENT_RecordStart(); if(bSuccess) { m_bRecordStatus = TRUE; } else { CLIENT_StopTalkEx(m_hTalkHandle); MessageBox(ConvertString("Start local record failed!"), ConvertString("Prompt")); } } else { MessageBox(ConvertString("Open talk failed!"), ConvertString("Prompt")); } } else { MessageBox(ConvertString("Please login first!"), ConvertString("Prompt")); } }