⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hmp_test_cpp-c++.cpp

📁 列出了通过语音卡打电话和发传真的源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		print("drop_call()...");
		if (already_connect_fax)
			restore_voice();
		print_gc_error_info("gc_DropCall", gc_DropCall(crn, GC_NORMAL_CLEARING, EV_ASYNC));
	}

	void blind_xfer(const char* xferred_to) {
		print("blind_xfer(->%s)...", xferred_to);
		print_gc_error_info("InvokeXfer", gc_InvokeXfer(crn, 0, (char*)xferred_to, 0, 0, EV_ASYNC));
	}

	void init_super_xfer(int secondary_ch_index) {
		print("init_super_xfer(with %d)...", secondary_ch_index);
		channls[secondary_ch_index]->super_xfer_primary_ch_index = id;
		print_gc_error_info("g_InitXfer", gc_InitXfer(channls[secondary_ch_index]->crn, NULL, NULL, EV_ASYNC));
	}

	void super_xfer() {
		print("super_xfer()...");
		print_gc_error_info("gc_InvokeXfer", gc_InvokeXfer(channls[super_xfer_primary_ch_index]->crn, crn, 0, 0, 0, EV_ASYNC));
	}
	
	void accept_xfer(METAEVENT meta_evt) {
		GC_REROUTING_INFO* gc_rerouting_infop = (GC_REROUTING_INFO*)meta_evt.extevtdatap;
		print("accept_xfer(Refer-To address = %s)...", gc_rerouting_infop->rerouting_num);
		rerouting_addrblkp = gc_rerouting_infop->rerouting_addrblkp;
		print_gc_error_info("gc_AcceptXfer", gc_AcceptXfer(crn, 0, EV_ASYNC));
	}
	
	void make_xfer_call() {
		GC_PARM_BLKP gc_parm_blkp = NULL;
		GC_MAKECALL_BLK gc_mk_blk = {0};
		GCLIB_MAKECALL_BLK gclib_mk_blk = {0};
		int xfer_ch_index = get_idle_channel_id();
		
		print("make_xfer_call(xfer_ch_index=%d)...", xfer_ch_index);
		gc_mk_blk.cclib = NULL;
		gc_mk_blk.gclib = &gclib_mk_blk;
		
		gc_util_insert_parm_val(&gc_parm_blkp, GCSET_SUPP_XFER, GCPARM_PRIMARYCALL_CRN, sizeof(unsigned long), crn);
		gclib_mk_blk.ext_datap = gc_parm_blkp;
		gclib_mk_blk.destination = *rerouting_addrblkp;
		print_gc_error_info("gc_MakeCall", gc_MakeCall(channls[xfer_ch_index]->gc_dev, &channls[xfer_ch_index]->crn,
			NULL, &gc_mk_blk, 30, EV_ASYNC));
		gc_util_delete_parm_blk(gc_parm_blkp);
	}

	void release_call() {
		print("release_call()...");
		print_gc_error_info("gc_ReleaseCallEx", gc_ReleaseCallEx(crn, EV_ASYNC));
	}

	void req_modify_call() {
		GC_PARM_BLKP gc_parm_blkp = NULL;
		char sip_header[1024] = "";
		sprintf(sip_header, "Contact: %s by %s<sip:%s@%s:%d>", USER_AGENT, USER_DISPLAY, alias, local_ip, HMP_SIP_PORT); //Contact header
		print("req_modify_call(->%s)...", sip_header);
		gc_util_insert_parm_ref_ex(&gc_parm_blkp, IPSET_SIP_MSGINFO, IPPARM_SIP_HDR, (unsigned long)(strlen(sip_header)+1), sip_header);
		print_gc_error_info("gc_ReqModifyCall", gc_ReqModifyCall(crn, gc_parm_blkp, EV_ASYNC));
		gc_util_delete_parm_blk(gc_parm_blkp);
	}

	void accept_modify_call() {
		print("accept_modify_call()...");
		print_gc_error_info("gc_AcceptModifyCall", gc_AcceptModifyCall(crn, NULL, EV_ASYNC));
	}

	void play_wave_file(const char* file) {
		print("play_wave_file()...");
		tpt.tp_type = IO_EOT;
		tpt.tp_termno = DX_DIGMASK;
		tpt.tp_length = 0xFFFF; // any digit
		tpt.tp_flags = TF_DIGMASK;
		xpb.wFileFormat = FILE_FORMAT_WAVE;
		xpb.wDataFormat = DATA_FORMAT_MULAW;
		xpb.nSamplesPerSec = DRT_8KHZ;
		xpb.wBitsPerSample = 8;
		vox_iott.io_fhandle = dx_fileopen(file, _O_RDONLY|_O_BINARY);
		vox_iott.io_type = IO_DEV|IO_EOT;
		vox_iott.io_bufp = 0;
		vox_iott.io_offset = 0;
		vox_iott.io_length = -1;
		dx_clrdigbuf(vox_dev);
		print_r4_error_info("dx_playiottdata", vox_dev, dx_playiottdata(vox_dev, &vox_iott, &tpt, &xpb, EV_ASYNC));
	}

	void record_wave_file() {
		char file[MAX_PATH] = "";
		SYSTEMTIME t;
		print("record_wave_file()...");
		tpt.tp_type = IO_EOT;
		tpt.tp_termno = DX_DIGMASK;
		tpt.tp_length = 0xFFFF; // any digit
		tpt.tp_flags = TF_DIGMASK;
		xpb.wFileFormat = FILE_FORMAT_WAVE;
		xpb.wDataFormat = DATA_FORMAT_MULAW;
		xpb.nSamplesPerSec = DRT_8KHZ;
		xpb.wBitsPerSample = 8;
		GetLocalTime(&t);
		sprintf(file, "record_wave_ch%d_timeD%02dH%02dM%02dS%02d.%04d.wav", id, t.wDay, t.wHour, t.wMinute, t.wSecond, t.wMilliseconds);
		vox_iott.io_fhandle = dx_fileopen(file, _O_RDWR|_O_BINARY|_O_CREAT|_O_TRUNC, 0666);
		vox_iott.io_type = IO_DEV|IO_EOT;
		vox_iott.io_bufp = 0;
		vox_iott.io_offset = 0;
		vox_iott.io_length = -1;
		dx_clrdigbuf(vox_dev);
		print_r4_error_info("dx_reciottdata", vox_dev, dx_reciottdata(vox_dev, &vox_iott, &tpt, &xpb, EV_ASYNC|RM_TONE));
	}

	void process_voice_done() {
		print_voice_done_terminal_reason();
		dx_clrtpt(&tpt, 1);
		dx_fileclose(vox_iott.io_fhandle);
		vox_iott.io_fhandle = -1;
	}

	void print_voice_done_terminal_reason() {
		int term_reason = ATDX_TERMMSK(vox_dev);
		if (TM_DIGIT == term_reason)
			print("print_voice_done_terminal_reason: TM_DIGIT");
		else if (TM_EOD == term_reason)
			print("print_voice_done_terminal_reason: TM_EOD");
		else if (TM_USRSTOP == term_reason)
			print("print_voice_done_terminal_reason: TM_USRSTOP");
		else
			print("print_voice_done_terminal_reason: 0x%x", term_reason);
	}
	
	void send_audio_request() {
		print("send_audio_request()...");	
		GC_PARM_BLKP gc_parm_blkp = NULL;	
		gc_util_insert_parm_ref(&gc_parm_blkp, IPSET_SWITCH_CODEC, IPPARM_AUDIO_INITIATE, sizeof(int), NULL);
		gc_Extension(GCTGT_GCLIB_CRN, crn, IPEXTID_CHANGEMODE, gc_parm_blkp, NULL, EV_ASYNC);		
		gc_util_delete_parm_blk(gc_parm_blkp);
	}
	
	void send_t38_request() {
		print("send_t38_request()...");	
		GC_PARM_BLKP gc_parm_blkp = NULL;	
		gc_util_insert_parm_ref(&gc_parm_blkp, IPSET_SWITCH_CODEC, IPPARM_T38_INITIATE, sizeof(int), NULL);
		gc_Extension(GCTGT_GCLIB_CRN, crn, IPEXTID_CHANGEMODE, gc_parm_blkp, NULL, EV_ASYNC);		
		gc_util_delete_parm_blk(gc_parm_blkp);
	}
	
	void response_codec_request(BOOL accept_call) {
		print("response_codec_request(%s)...", accept_call?"accept":"reject");
		GC_PARM_BLKP gc_parm_blkp = NULL;
		gc_util_insert_parm_val(&gc_parm_blkp, IPSET_SWITCH_CODEC, accept_call?IPPARM_ACCEPT:IPPARM_REJECT, sizeof(int), NULL);
		gc_Extension(GCTGT_GCLIB_CRN, crn, IPEXTID_CHANGEMODE, gc_parm_blkp, NULL, EV_ASYNC);
		gc_util_delete_parm_blk(gc_parm_blkp);
	}
	
	void do_fax(int dir, const char* file) {
		print("do_fax(%s)...", dir==DF_RX?"RX":"TX");
		fax_proceeding = TRUE;
		fax_dir = dir;
		sprintf(fax_file, "%s", NULL==file?"":file);

		if (FALSE == USING_V17_PCM_FAX) {
			if (already_connect_fax)
				response_codec_request(TRUE);
			else {
				connect_fax();
				send_t38_request();
				already_connect_fax = TRUE;
			}
		} else {
			connect_fax();
			if (DF_RX == dir) {
				receive_fax_inner();
			} else {
				send_fax_inner();
			}
		}
	}
	
	void send_fax_inner() {	
		print("send_fax_inner()...");
		char local_id[255] = "";
		char fax_header[255] = "";
		unsigned short tx_coding = DF_MMR|DF_ECM;
		int fhandle = 0;
		unsigned long sndflag = EV_ASYNC|DF_PHASEB|DF_PHASED;		
		fx_initstat(fax_dev, DF_TX);
		sprintf(fax_header, "FAX_HEADER_%d", id);
		fx_setparm(fax_dev, FC_HDRUSER, (void*)fax_header);
		sprintf(local_id, "FAX_LOCALID_%d", id);
		fx_setparm(fax_dev, FC_LOCALID, (void*)local_id);
//		fx_setparm(fax_dev, FC_TXCODING, (void*)&tx_coding);
		fhandle = dx_fileopen(fax_file, _O_RDONLY|_O_BINARY, NULL);
		fx_setiott(&fax_iott, fhandle, DF_TIFF, DFC_AUTO);
		fax_iott.io_type |= IO_EOT;
		fax_iott.io_phdcont = DFC_EOP;
		fx_sendfax(fax_dev, &fax_iott, sndflag);
	}
	
	void receive_fax_inner() {
		print("receive_fax_inner()...");
		char local_id[255] = "";
		SYSTEMTIME t;
		unsigned long rcvflag = EV_ASYNC|DF_PHASEB|DF_PHASED|DF_TIFF|DF_A4MAXLEN;
		fx_initstat(fax_dev, DF_RX);
		GetLocalTime(&t);
		sprintf(fax_file, "receive_fax_ch%d_timeD%02dH%02dM%02dS%02d.%04d.tif", id, t.wDay, t.wHour, t.wMinute, t.wSecond, t.wMilliseconds);
		sprintf(local_id, "FAX_LOCALID_%d", id);
		fx_setparm(fax_dev, FC_LOCALID, (void*)local_id);		
		fx_rcvfax(fax_dev, fax_file, rcvflag);
	}

	void print_fax_phase_b_info() {
		char remote_id[255] = "";
		char fax_encoding[255] = "";
		if ((ATFX_BSTAT(fax_dev) & DFS_REMOTEID) == DFS_REMOTEID)
			fx_getparm (fax_dev, FC_REMOTEID, remote_id);
		int rc = ATFX_CODING(fax_dev);
		switch(rc) {
		case DFS_MH: sprintf(fax_encoding, "DFS_MH"); break;
		case DFS_MR: sprintf(fax_encoding, "DFS_MR"); break;
		case DFS_MMR: sprintf(fax_encoding, "DFS_MMR"); break;
		default: sprintf(fax_encoding, "INVALID(0x%04lx)", rc); break;
		}
		print("Connect with \"%s\" at %d baud, with %s%s encoding", remote_id, ATFX_SPEED(fax_dev), fax_encoding, 
			DFS_ECM == ATFX_ECM(fax_dev)?"|DFS_ECM":"");
	}
	
	void print_fax_phase_d_info() {
		int page_count = ATFX_PGXFER(fax_dev);		
		print("Phase D Information...\n  Page:%ld, scan lines:%ld;\n  Page width:%ld, resolution:%ld, transferred bytes:%ld;\n  Speed:%ld, bad scan lines:%ld",//, Retrain negative pages:%ld", 
		  page_count, ATFX_SCANLINES(fax_dev), ATFX_WIDTH(fax_dev), ATFX_RESLN(fax_dev), ATFX_TRCOUNT(fax_dev), 
		  ATFX_SPEED(fax_dev), ATFX_BADSCANLINES(fax_dev)/*, ATFX_RTNPAGES(fax_dev)*/);
	}

	void process_fax_done() {
		dx_fileclose(fax_iott.io_fhandle);
		restore_voice();
		already_connect_fax = FALSE;
		fax_proceeding = FALSE;
	}

	void process_fax_sent() {
		print_fax_phase_d_info();
		process_fax_done();
//		if (DF_TX == fax_dir) send_audio_request(); //fax sender send audio request
	}

	void process_fax_received() {
		process_fax_sent();
	}

	void process_fax_error() {
		print("Phase E status: %d", ATFX_ESTAT(fax_dev));
		process_fax_done();
//		if (DF_TX == fax_dir) send_audio_request(); //fax sender send audio request
	}

	void stop() {
		print("stop()...");
		dx_stopch(vox_dev, EV_ASYNC);
		fx_stopch(fax_dev, EV_ASYNC);
	}
	
	void process_extension(METAEVENT meta_evt) {	
		GC_PARM_BLKP gc_parm_blkp = &(((EXTENSIONEVTBLK*)(meta_evt.extevtdatap))->parmblk);
		GC_PARM_DATA* gc_parm_datap = NULL;
		IP_CAPABILITY* ip_capp = NULL;
		RTP_ADDR rtp_addr;
		struct in_addr ip_addr;

		while (gc_parm_datap = gc_util_next_parm(gc_parm_blkp, gc_parm_datap)) {
			switch(gc_parm_datap->set_ID) {
			case IPSET_SWITCH_CODEC:
				print("IPSET_SWITCH_CODEC:");
				switch(gc_parm_datap->parm_ID) {
				case IPPARM_T38_REQUESTED:
					print("  IPPARM_T38_REQUESTED:");
					if (!already_connect_fax) {
						connect_fax();
						already_connect_fax = TRUE;
					}
					break;
				case IPPARM_AUDIO_REQUESTED:
					print("  IPPARM_AUDIO_REQUESTED:");
					response_codec_request(TRUE);
					break;
				case IPPARM_READY:
					print("  IPPARM_READY:");
					if (TRUE == fax_proceeding) {
						if (DF_TX == fax_dir) 
							send_fax_inner();
						if (DF_RX == fax_dir)
							receive_fax_inner();
					}
					break;
				default:
					print("  Got unknown extension parmID %d", gc_parm_datap->parm_ID);
					break;
				}
				break;				
			case IPSET_MEDIA_STATE:
				print("IPSET_MEDIA_STATE:");
				switch(gc_parm_datap->parm_ID) {
				case IPPARM_TX_CONNECTED:
					print("  IPPARM_TX_CONNECTED");
					break;
				case IPPARM_TX_DISCONNECTED:
					print("  IPPARM_TX_DISCONNECTED");
					break;						
				case IPPARM_RX_CONNECTED:
					print("  IPPARM_RX_CONNECTED");
					break;						
				case IPPARM_RX_DISCONNECTED:
					print("  IPPARM_RX_DISCONNECTED");
					break;
				default:
					print("  Got unknown extension parmID %d", gc_parm_datap->parm_ID);
					break;
				}
				if (sizeof(IP_CAPABILITY) == gc_parm_datap->value_size) {
					ip_capp = (IP_CAPABILITY*)(gc_parm_datap->value_buf);
					print("    stream codec infomation: capability(%d), dir(%d), frames_per_pkt(%d), VAD(%d)", 
						ip_capp->capability, ip_capp->direction, ip_capp->extra.audio.frames_per_pkt, ip_capp->extra.audio.VAD);
				}
				break;
			case IPSET_IPPROTOCOL_STATE:
				print("IPSET_IPPROTOCOL_STATE:");
				switch(gc_parm_datap->parm_ID) {
				case IPPARM_SIGNALING_CONNECTED:
					print("  IPPARM_SIGNALING_CONNECTED");
					break;
				case IPPARM_SIGNALING_DISCONNECTED:
					print("  IPPARM_SIGNALING_DISCONNECTED");
					break;
				case IPPARM_CONTROL_CONNECTED:
					print("  IPPARM_CONTROL_CONNECTED");
					break;
				case IPPARM_CONTROL_DISCONNECTED:
					print("  IPPARM_CONTROL_DISCONNECTED");
					break;
				default:
					print("  Got unknown extension parmID %d", gc_parm_datap->parm_ID);
					break;
				}
				break;
			case IPSET_RTP_ADDRESS:
				print("IPSET_RTP_ADDRESS:");			
				switch(gc_parm_datap->parm_ID) {
				case IPPARM_LOCAL:
					memcpy(&rtp_addr, gc_parm_datap->value_buf, gc_parm_datap->value_size);
					ip_addr.S_un.S_addr = rtp_addr.u_ipaddr.ipv4;
					print("  IPPARM_LOCAL: address:%s, port %d", inet_ntoa(ip_addr), rtp_addr.port);
					break;
				case IPPARM_REMOTE:
					memcpy(&rtp_addr, gc_parm_datap->value_buf, gc_parm_datap->value_size);
					ip_addr.S_un.S_addr = rtp_addr.u_ipaddr.ipv4;
					print("  IPPARM_REMOTE: address:%s, port %d", inet_ntoa(ip_addr), rtp_addr.port);
					break;
				default:
					print("  Got unknown extension parmID %d", gc_parm_datap->parm_ID);
					break;
				}
				break;
			default:
				print("Got unknown set_ID(%d).", gc_parm_datap->set_ID);
				break;
			}
		}
	}
	
	void set_codec(int crn_or_chan) {
		print("set_codec(g711U[103]/g711A[101]/g729[116/118/119/120]/t38[12])...");
		IP_CAPABILITY ip_cap[7];		
		ip_cap[0].capability = GCCAP_AUDIO_g711Ulaw64k;
		ip_cap[0].type = GCCAPTYPE_AUDIO;
		ip_cap[0].direction = IP_CAP_DIR_LCLTRANSMIT;
		ip_cap[0].payload_type = IP_USE_STANDARD_PAYLOADTYPE;
		ip_cap[0].extra.audio.frames_per_pkt = 20;
		ip_cap[0].extra.audio.VAD = GCPV_DISABLE;
		ip_cap[1].capability = GCCAP_AUDIO_g711Ulaw64k;
		ip_cap[1].type = GCCAPTYPE_AUDIO;
		ip_cap[1].direction = IP_CAP_DIR_LCLRECEIVE;
		ip_cap[1].payload_type = IP_USE_STANDARD_PAYLOADTYPE;
		ip_cap[1].extra.audio.frames_per_pkt = 20;
		ip_cap[1].extra.audio.VAD = GCPV_DISABLE;
		ip_cap[2].capability = GCCAP_AUDIO_g711Alaw64k;
		ip_cap[2].type = GCCAPTYPE_AUDIO;
		ip_cap[2].direction = IP_CAP_DIR_LCLTRANSMIT;
		ip_cap[2].payload_type = IP_USE_STANDARD_PAYLOADTYPE;
		ip_cap[2].extra.audio.frames_per_pkt = 20;
		ip_cap[2].extra.audio.VAD = GCPV_DISABLE;
		ip_cap[3].capability = GCCAP_AUDIO_g711Alaw64k;
		ip_cap[3].type = GCCAPTYPE_AUDIO;
		ip_cap[3].direction = IP_CAP_DIR_LCLRECEIVE;
		ip_cap[3].payload_type = IP_USE_STANDARD_PAYLOADTYPE;
		ip_cap[3].extra.audio.frames_per_pkt = 20;
		ip_cap[3].extra.audio.VAD = GCPV_DISABLE;
		ip_cap[4].capability = GCCAP_AUDIO_g729AnnexAwAnnexB;
		ip_cap[4].type = GCCAPTYPE_AUDIO;
		ip_cap[4].direction = IP_CAP_DIR_LCLTRANSMIT;
		ip_cap[4].payload_type = IP_USE_STANDARD_PAYLOADTYPE;
		ip_cap[4].extra.audio.frames_per_pkt = 2;
		ip_cap[4].extra.audio.VAD = GCPV_ENABLE;
		ip_cap[5].capability = GCCAP_AUDIO_g729AnnexAwAnnexB;
		ip_cap[5].type = GCCAPTYPE_AUDIO;
		ip_cap[5].direction = IP_CAP_DIR_LCLRECEIVE;
		ip_cap[5].payload_type = IP_USE_STANDARD_PAYLOADTYPE;
		ip_cap[5].extra.audio.frames_per_pkt = 2;
		ip_cap[5].extra.audio.VAD = GCPV_ENABLE;
		ip_cap[6].capability = GCCAP_DATA_t38UDPFax;
		ip_cap[6].type = GCCAPTYPE_RDATA;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -