📄 pjsua_app.c
字号:
{ unsigned i; char line[128]; pjsua_acc_config *acc_cfg = &app_config.acc_cfg[acc_index]; pj_ansi_sprintf(line, "\n#\n# Account %d:\n#\n", acc_index); pj_strcat2(result, line); /* Identity */ if (acc_cfg->id.slen) { pj_ansi_sprintf(line, "--id %.*s\n", (int)acc_cfg->id.slen, acc_cfg->id.ptr); pj_strcat2(result, line); } /* Registrar server */ if (acc_cfg->reg_uri.slen) { pj_ansi_sprintf(line, "--registrar %.*s\n", (int)acc_cfg->reg_uri.slen, acc_cfg->reg_uri.ptr); pj_strcat2(result, line); pj_ansi_sprintf(line, "--reg-timeout %u\n", acc_cfg->reg_timeout); pj_strcat2(result, line); } /* Contact */ if (acc_cfg->force_contact.slen) { pj_ansi_sprintf(line, "--contact %.*s\n", (int)acc_cfg->force_contact.slen, acc_cfg->force_contact.ptr); pj_strcat2(result, line); } /* Proxy */ for (i=0; i<acc_cfg->proxy_cnt; ++i) { pj_ansi_sprintf(line, "--proxy %.*s\n", (int)acc_cfg->proxy[i].slen, acc_cfg->proxy[i].ptr); pj_strcat2(result, line); } /* Credentials */ for (i=0; i<acc_cfg->cred_count; ++i) { if (acc_cfg->cred_info[i].realm.slen) { pj_ansi_sprintf(line, "--realm %.*s\n", (int)acc_cfg->cred_info[i].realm.slen, acc_cfg->cred_info[i].realm.ptr); pj_strcat2(result, line); } if (acc_cfg->cred_info[i].username.slen) { pj_ansi_sprintf(line, "--username %.*s\n", (int)acc_cfg->cred_info[i].username.slen, acc_cfg->cred_info[i].username.ptr); pj_strcat2(result, line); } if (acc_cfg->cred_info[i].data.slen) { pj_ansi_sprintf(line, "--password %.*s\n", (int)acc_cfg->cred_info[i].data.slen, acc_cfg->cred_info[i].data.ptr); pj_strcat2(result, line); } if (i != acc_cfg->cred_count - 1) pj_strcat2(result, "--next-cred\n"); }}/* * Write settings. */static int write_settings(const struct app_config *config, char *buf, pj_size_t max){ unsigned acc_index; unsigned i; pj_str_t cfg; char line[128]; PJ_UNUSED_ARG(max); cfg.ptr = buf; cfg.slen = 0; /* Logging. */ pj_strcat2(&cfg, "#\n# Logging options:\n#\n"); pj_ansi_sprintf(line, "--log-level %d\n", config->log_cfg.level); pj_strcat2(&cfg, line); pj_ansi_sprintf(line, "--app-log-level %d\n", config->log_cfg.console_level); pj_strcat2(&cfg, line); if (config->log_cfg.log_filename.slen) { pj_ansi_sprintf(line, "--log-file %.*s\n", (int)config->log_cfg.log_filename.slen, config->log_cfg.log_filename.ptr); pj_strcat2(&cfg, line); } /* Save account settings. */ for (acc_index=0; acc_index < config->acc_cnt; ++acc_index) { write_account_settings(acc_index, &cfg); if (acc_index < config->acc_cnt-1) pj_strcat2(&cfg, "--next-account\n"); } pj_strcat2(&cfg, "\n#\n# Network settings:\n#\n"); /* Outbound proxy */ for (i=0; i<config->cfg.outbound_proxy_cnt; ++i) { pj_ansi_sprintf(line, "--outbound %.*s\n", (int)config->cfg.outbound_proxy[i].slen, config->cfg.outbound_proxy[i].ptr); pj_strcat2(&cfg, line); } /* UDP Transport. */ pj_ansi_sprintf(line, "--local-port %d\n", config->udp_cfg.port); pj_strcat2(&cfg, line); /* IP address, if any. */ if (config->udp_cfg.public_addr.slen) { pj_ansi_sprintf(line, "--ip-addr %.*s\n", (int)config->udp_cfg.public_addr.slen, config->udp_cfg.public_addr.ptr); pj_strcat2(&cfg, line); } /* No TCP ? */ if (config->no_tcp) { pj_strcat2(&cfg, "--no-tcp\n"); } /* No UDP ? */ if (config->no_udp) { pj_strcat2(&cfg, "--no-udp\n"); } /* STUN */ if (config->udp_cfg.stun_config.stun_port1) { pj_ansi_sprintf(line, "--use-stun1 %.*s:%d\n", (int)config->udp_cfg.stun_config.stun_srv1.slen, config->udp_cfg.stun_config.stun_srv1.ptr, config->udp_cfg.stun_config.stun_port1); pj_strcat2(&cfg, line); } if (config->udp_cfg.stun_config.stun_port2) { pj_ansi_sprintf(line, "--use-stun2 %.*s:%d\n", (int)config->udp_cfg.stun_config.stun_srv2.slen, config->udp_cfg.stun_config.stun_srv2.ptr, config->udp_cfg.stun_config.stun_port2); pj_strcat2(&cfg, line); } /* TLS */ if (config->use_tls) pj_strcat2(&cfg, "--use-tls\n"); if (config->udp_cfg.tls_setting.ca_list_file.slen) { pj_ansi_sprintf(line, "--tls-ca-file %.*s\n", (int)config->udp_cfg.tls_setting.ca_list_file.slen, config->udp_cfg.tls_setting.ca_list_file.ptr); pj_strcat2(&cfg, line); } if (config->udp_cfg.tls_setting.cert_file.slen) { pj_ansi_sprintf(line, "--tls-cert-file %.*s\n", (int)config->udp_cfg.tls_setting.cert_file.slen, config->udp_cfg.tls_setting.cert_file.ptr); pj_strcat2(&cfg, line); } if (config->udp_cfg.tls_setting.privkey_file.slen) { pj_ansi_sprintf(line, "--tls-privkey-file %.*s\n", (int)config->udp_cfg.tls_setting.privkey_file.slen, config->udp_cfg.tls_setting.privkey_file.ptr); pj_strcat2(&cfg, line); } if (config->udp_cfg.tls_setting.password.slen) { pj_ansi_sprintf(line, "--tls-password %.*s\n", (int)config->udp_cfg.tls_setting.password.slen, config->udp_cfg.tls_setting.password.ptr); pj_strcat2(&cfg, line); } if (config->udp_cfg.tls_setting.verify_server) pj_strcat2(&cfg, "--tls-verify-server\n"); if (config->udp_cfg.tls_setting.verify_client) pj_strcat2(&cfg, "--tls-verify-client\n"); if (config->udp_cfg.tls_setting.timeout.sec) { pj_ansi_sprintf(line, "--tls-neg-timeout %d\n", (int)config->udp_cfg.tls_setting.timeout.sec); pj_strcat2(&cfg, line); } pj_strcat2(&cfg, "\n#\n# Media settings:\n#\n"); /* Media */ if (config->null_audio) pj_strcat2(&cfg, "--null-audio\n"); if (config->auto_play) pj_strcat2(&cfg, "--auto-play\n"); if (config->auto_loop) pj_strcat2(&cfg, "--auto-loop\n"); if (config->auto_conf) pj_strcat2(&cfg, "--auto-conf\n"); for (i=0; i<config->wav_count; ++i) { pj_ansi_sprintf(line, "--play-file %s\n", config->wav_files[i].ptr); pj_strcat2(&cfg, line); } for (i=0; i<config->tone_count; ++i) { pj_ansi_sprintf(line, "--play-tone %d,%d,%d,%d\n", config->tones[i].freq1, config->tones[i].freq2, config->tones[i].on_msec, config->tones[i].off_msec); pj_strcat2(&cfg, line); } if (config->rec_file.slen) { pj_ansi_sprintf(line, "--rec-file %s\n", config->rec_file.ptr); pj_strcat2(&cfg, line); } if (config->auto_rec) pj_strcat2(&cfg, "--auto-rec\n"); if (config->capture_dev != PJSUA_INVALID_ID) { pj_ansi_sprintf(line, "--capture-dev %d\n", config->capture_dev); pj_strcat2(&cfg, line); } if (config->playback_dev != PJSUA_INVALID_ID) { pj_ansi_sprintf(line, "--playback-dev %d\n", config->playback_dev); pj_strcat2(&cfg, line); } /* Media clock rate. */ if (config->media_cfg.clock_rate != PJSUA_DEFAULT_CLOCK_RATE) { pj_ansi_sprintf(line, "--clock-rate %d\n", config->media_cfg.clock_rate); pj_strcat2(&cfg, line); } else { pj_ansi_sprintf(line, "#using default --clock-rate %d\n", config->media_cfg.clock_rate); pj_strcat2(&cfg, line); } /* quality */ if (config->media_cfg.quality != PJSUA_DEFAULT_CODEC_QUALITY) { pj_ansi_sprintf(line, "--quality %d\n", config->media_cfg.quality); pj_strcat2(&cfg, line); } else { pj_ansi_sprintf(line, "#using default --quality %d\n", config->media_cfg.quality); pj_strcat2(&cfg, line); } /* ptime */ if (config->ptime) { pj_ansi_sprintf(line, "--ptime %d\n", config->ptime); pj_strcat2(&cfg, line); } /* no-vad */ if (config->media_cfg.no_vad) { pj_strcat2(&cfg, "--no-vad\n"); } /* ec-tail */ if (config->media_cfg.ec_tail_len != PJSUA_DEFAULT_EC_TAIL_LEN) { pj_ansi_sprintf(line, "--ec-tail %d\n", config->media_cfg.ec_tail_len); pj_strcat2(&cfg, line); } else { pj_ansi_sprintf(line, "#using default --ec-tail %d\n", config->media_cfg.ec_tail_len); pj_strcat2(&cfg, line); } /* ilbc-mode */ if (config->media_cfg.ilbc_mode != PJSUA_DEFAULT_ILBC_MODE) { pj_ansi_sprintf(line, "--ilbc-mode %d\n", config->media_cfg.ilbc_mode); pj_strcat2(&cfg, line); } else { pj_ansi_sprintf(line, "#using default --ilbc-mode %d\n", config->media_cfg.ilbc_mode); pj_strcat2(&cfg, line); } /* RTP drop */ if (config->media_cfg.tx_drop_pct) { pj_ansi_sprintf(line, "--tx-drop-pct %d\n", config->media_cfg.tx_drop_pct); pj_strcat2(&cfg, line); } if (config->media_cfg.rx_drop_pct) { pj_ansi_sprintf(line, "--rx-drop-pct %d\n", config->media_cfg.rx_drop_pct); pj_strcat2(&cfg, line); } /* Start RTP port. */ pj_ansi_sprintf(line, "--rtp-port %d\n", config->rtp_cfg.port); pj_strcat2(&cfg, line); /* Add codec. */ for (i=0; i<config->codec_cnt; ++i) { pj_ansi_sprintf(line, "--add-codec %s\n", config->codec_arg[i].ptr); pj_strcat2(&cfg, line); } pj_strcat2(&cfg, "\n#\n# User agent:\n#\n"); /* Auto-answer. */ if (config->auto_answer != 0) { pj_ansi_sprintf(line, "--auto-answer %d\n", config->auto_answer); pj_strcat2(&cfg, line); } /* Max calls. */ pj_ansi_sprintf(line, "--max-calls %d\n", config->cfg.max_calls); pj_strcat2(&cfg, line); /* Uas-duration. */ if (config->duration != NO_LIMIT) { pj_ansi_sprintf(line, "--duration %d\n", config->duration); pj_strcat2(&cfg, line); } /* norefersub ? */ if (config->no_refersub) { pj_strcat2(&cfg, "--norefersub\n"); } pj_strcat2(&cfg, "\n#\n# Buddies:\n#\n"); /* Add buddies. */ for (i=0; i<config->buddy_cnt; ++i) { pj_ansi_sprintf(line, "--add-buddy %.*s\n", (int)config->buddy_cfg[i].uri.slen, config->buddy_cfg[i].uri.ptr); pj_strcat2(&cfg, line); } *(cfg.ptr + cfg.slen) = '\0'; return cfg.slen;}/* * Dump application states. */static void app_dump(pj_bool_t detail){ unsigned old_decor; char buf[1024]; PJ_LOG(3,(THIS_FILE, "Start dumping application states:")); old_decor = pj_log_get_decor(); pj_log_set_decor(old_decor & (PJ_LOG_HAS_NEWLINE | PJ_LOG_HAS_CR)); if (detail) pj_dump_config(); pjsip_endpt_dump(pjsua_get_pjsip_endpt(), detail); pjmedia_endpt_dump(pjsua_get_pjmedia_endpt()); pjsip_tsx_layer_dump(detail); pjsip_ua_dump(detail); /* Dump all invite sessions: */ PJ_LOG(3,(THIS_FILE, "Dumping invite sessions:")); if (pjsua_call_get_count() == 0) { PJ_LOG(3,(THIS_FILE, " - no sessions -")); } else { unsigned i; for (i=0; i<app_config.cfg.max_calls; ++i) { if (pjsua_call_is_active(i)) { pjsua_call_dump(i, detail, buf, sizeof(buf), " "); PJ_LOG(3,(THIS_FILE, "%s", buf)); } } } /* Dump presence status */ pjsua_pres_dump(detail); pj_log_set_decor(old_decor); PJ_LOG(3,(THIS_FILE, "Dump complete"));}/***************************************************************************** * Console application *//* * Find next call when current call is disconnected or when user * press ']' */static pj_bool_t find_next_call(void){ int i, max; max = pjsua_call_get_max_count(); for (i=current_call+1; i<max; ++i) { if (pjsua_call_is_active(i)) { current_call = i; return PJ_TRUE; } } for (i=0; i<current_call; ++i) { if (pjsua_call_is_active(i)) { current_call = i; return PJ_TRUE; } } current_call = PJSUA_INVALID_ID; return PJ_FALSE;}/* * Find previous call when user press '[' */static pj_bool_t find_prev_call(void){ int i, max; max = pjsua_call_get_max_count(); for (i=current_call-1; i>=0; --i) { if (pjsua_call_is_active(i)) { current_call = i; return PJ_TRUE; } } for (i=max-1; i>current_call; --i) { if (pjsua_call_is_active(i)) { current_call = i; return PJ_TRUE; } } current_call = PJSUA_INVALID_ID;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -