Exemplo n.º 1
0
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();
}
Exemplo n.º 2
0
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; 
}
Exemplo n.º 3
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"));
	}
}