📄 hmp_test_cpp-c++.cpp
字号:
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 + -