int config_parse_conf(struct config *cfg, const struct conf *conf) { struct pl pollm, as, ap; enum poll_method method; struct vidsz size = {0, 0}; uint32_t v; int err = 0; if (!cfg || !conf) return EINVAL; /* Core */ if (0 == conf_get(conf, "poll_method", &pollm)) { if (0 == poll_method_type(&method, &pollm)) { err = poll_method_set(method); if (err) { warning("config: poll method (%r) set: %m\n", &pollm, err); } } else { warning("config: unknown poll method (%r)\n", &pollm); } } /* SIP */ (void)conf_get_u32(conf, "sip_trans_bsize", &cfg->sip.trans_bsize); (void)conf_get_str(conf, "sip_listen", cfg->sip.local, sizeof(cfg->sip.local)); (void)conf_get_str(conf, "sip_certificate", cfg->sip.cert, sizeof(cfg->sip.cert)); /* Call */ (void)conf_get_u32(conf, "call_local_timeout", &cfg->call.local_timeout); /* Audio */ (void)conf_get_str(conf, "audio_path", cfg->audio.audio_path, sizeof(cfg->audio.audio_path)); (void)conf_get_csv(conf, "audio_player", cfg->audio.play_mod, sizeof(cfg->audio.play_mod), cfg->audio.play_dev, sizeof(cfg->audio.play_dev)); (void)conf_get_csv(conf, "audio_source", cfg->audio.src_mod, sizeof(cfg->audio.src_mod), cfg->audio.src_dev, sizeof(cfg->audio.src_dev)); (void)conf_get_csv(conf, "audio_alert", cfg->audio.alert_mod, sizeof(cfg->audio.alert_mod), cfg->audio.alert_dev, sizeof(cfg->audio.alert_dev)); (void)conf_get_range(conf, "audio_srate", &cfg->audio.srate); (void)conf_get_range(conf, "audio_channels", &cfg->audio.channels); (void)conf_get_u32(conf, "ausrc_srate", &cfg->audio.srate_src); (void)conf_get_u32(conf, "auplay_srate", &cfg->audio.srate_play); (void)conf_get_u32(conf, "ausrc_channels", &cfg->audio.channels_src); (void)conf_get_u32(conf, "auplay_channels", &cfg->audio.channels_play); if (0 == conf_get(conf, "audio_source", &as) && 0 == conf_get(conf, "audio_player", &ap)) cfg->audio.src_first = as.p < ap.p; #ifdef USE_VIDEO /* Video */ (void)conf_get_csv(conf, "video_source", cfg->video.src_mod, sizeof(cfg->video.src_mod), cfg->video.src_dev, sizeof(cfg->video.src_dev)); (void)conf_get_csv(conf, "video_display", cfg->video.disp_mod, sizeof(cfg->video.disp_mod), cfg->video.disp_dev, sizeof(cfg->video.disp_dev)); if (0 == conf_get_vidsz(conf, "video_size", &size)) { cfg->video.width = size.w; cfg->video.height = size.h; } (void)conf_get_u32(conf, "video_bitrate", &cfg->video.bitrate); (void)conf_get_u32(conf, "video_fps", &cfg->video.fps); #else (void)size; #endif /* AVT - Audio/Video Transport */ if (0 == conf_get_u32(conf, "rtp_tos", &v)) cfg->avt.rtp_tos = v; (void)conf_get_range(conf, "rtp_ports", &cfg->avt.rtp_ports); if (0 == conf_get_range(conf, "rtp_bandwidth", &cfg->avt.rtp_bw)) { cfg->avt.rtp_bw.min *= 1000; cfg->avt.rtp_bw.max *= 1000; } (void)conf_get_bool(conf, "rtcp_enable", &cfg->avt.rtcp_enable); (void)conf_get_bool(conf, "rtcp_mux", &cfg->avt.rtcp_mux); (void)conf_get_range(conf, "jitter_buffer_delay", &cfg->avt.jbuf_del); (void)conf_get_bool(conf, "rtp_stats", &cfg->avt.rtp_stats); if (err) { warning("config: configure parse error (%m)\n", err); } /* Network */ (void)conf_apply(conf, "dns_server", dns_server_handler, &cfg->net); (void)conf_get_str(conf, "net_interface", cfg->net.ifname, sizeof(cfg->net.ifname)); #ifdef USE_VIDEO /* BFCP */ (void)conf_get_str(conf, "bfcp_proto", cfg->bfcp.proto, sizeof(cfg->bfcp.proto)); #endif return err; }
/** * Parse the core configuration file and update baresip core config * * @param cfg Baresip core config to update * @param conf Configuration file to parse * * @return 0 if success, otherwise errorcode */ int config_parse_conf(struct config *cfg, const struct conf *conf) { struct pl pollm, as, ap; enum poll_method method; struct vidsz size = {0, 0}; struct pl txmode; uint32_t v; int err = 0; if (!cfg || !conf) return EINVAL; /* Core */ if (0 == conf_get(conf, "poll_method", &pollm)) { if (0 == poll_method_type(&method, &pollm)) { err = poll_method_set(method); if (err) { warning("config: poll method (%r) set: %m\n", &pollm, err); } } else { warning("config: unknown poll method (%r)\n", &pollm); } } /* SIP */ (void)conf_get_str(conf, "sip_listen", cfg->sip.local, sizeof(cfg->sip.local)); (void)conf_get_str(conf, "sip_certificate", cfg->sip.cert, sizeof(cfg->sip.cert)); (void)conf_get_str(conf, "sip_cafile", cfg->sip.cafile, sizeof(cfg->sip.cafile)); /* Call */ (void)conf_get_u32(conf, "call_local_timeout", &cfg->call.local_timeout); (void)conf_get_u32(conf, "call_max_calls", &cfg->call.max_calls); /* Audio */ (void)conf_get_str(conf, "audio_path", cfg->audio.audio_path, sizeof(cfg->audio.audio_path)); (void)conf_get_csv(conf, "audio_player", cfg->audio.play_mod, sizeof(cfg->audio.play_mod), cfg->audio.play_dev, sizeof(cfg->audio.play_dev)); (void)conf_get_csv(conf, "audio_source", cfg->audio.src_mod, sizeof(cfg->audio.src_mod), cfg->audio.src_dev, sizeof(cfg->audio.src_dev)); (void)conf_get_csv(conf, "audio_alert", cfg->audio.alert_mod, sizeof(cfg->audio.alert_mod), cfg->audio.alert_dev, sizeof(cfg->audio.alert_dev)); (void)conf_get_u32(conf, "ausrc_srate", &cfg->audio.srate_src); (void)conf_get_u32(conf, "auplay_srate", &cfg->audio.srate_play); (void)conf_get_u32(conf, "ausrc_channels", &cfg->audio.channels_src); (void)conf_get_u32(conf, "auplay_channels", &cfg->audio.channels_play); if (0 == conf_get(conf, "audio_source", &as) && 0 == conf_get(conf, "audio_player", &ap)) cfg->audio.src_first = as.p < ap.p; if (0 == conf_get(conf, "audio_txmode", &txmode)) { if (0 == pl_strcasecmp(&txmode, "poll")) cfg->audio.txmode = AUDIO_MODE_POLL; else if (0 == pl_strcasecmp(&txmode, "thread")) cfg->audio.txmode = AUDIO_MODE_THREAD; else { warning("unsupported audio txmode (%r)\n", &txmode); } } (void)conf_get_bool(conf, "audio_level", &cfg->audio.level); conf_get_aufmt(conf, "ausrc_format", &cfg->audio.src_fmt); conf_get_aufmt(conf, "auplay_format", &cfg->audio.play_fmt); conf_get_aufmt(conf, "auenc_format", &cfg->audio.enc_fmt); conf_get_aufmt(conf, "audec_format", &cfg->audio.dec_fmt); /* Video */ (void)conf_get_csv(conf, "video_source", cfg->video.src_mod, sizeof(cfg->video.src_mod), cfg->video.src_dev, sizeof(cfg->video.src_dev)); (void)conf_get_csv(conf, "video_display", cfg->video.disp_mod, sizeof(cfg->video.disp_mod), cfg->video.disp_dev, sizeof(cfg->video.disp_dev)); if (0 == conf_get_vidsz(conf, "video_size", &size)) { cfg->video.width = size.w; cfg->video.height = size.h; } (void)conf_get_u32(conf, "video_bitrate", &cfg->video.bitrate); (void)conf_get_float(conf, "video_fps", &cfg->video.fps); (void)conf_get_bool(conf, "video_fullscreen", &cfg->video.fullscreen); conf_get_vidfmt(conf, "videnc_format", &cfg->video.enc_fmt); /* AVT - Audio/Video Transport */ if (0 == conf_get_u32(conf, "rtp_tos", &v)) cfg->avt.rtp_tos = v; (void)conf_get_range(conf, "rtp_ports", &cfg->avt.rtp_ports); if (0 == conf_get_range(conf, "rtp_bandwidth", &cfg->avt.rtp_bw)) { cfg->avt.rtp_bw.min *= 1000; cfg->avt.rtp_bw.max *= 1000; } (void)conf_get_bool(conf, "rtcp_mux", &cfg->avt.rtcp_mux); (void)conf_get_range(conf, "jitter_buffer_delay", &cfg->avt.jbuf_del); (void)conf_get_bool(conf, "rtp_stats", &cfg->avt.rtp_stats); (void)conf_get_u32(conf, "rtp_timeout", &cfg->avt.rtp_timeout); if (err) { warning("config: configure parse error (%m)\n", err); } /* Network */ #if HAVE_INET6 (void)conf_get_bool(conf, "prefer_ipv6", &cfg->net.prefer_ipv6); #endif (void)conf_apply(conf, "dns_server", dns_server_handler, &cfg->net); (void)conf_get_str(conf, "net_interface", cfg->net.ifname, sizeof(cfg->net.ifname)); /* BFCP */ (void)conf_get_str(conf, "bfcp_proto", cfg->bfcp.proto, sizeof(cfg->bfcp.proto)); /* SDP */ (void)conf_get_bool(conf, "sdp_ebuacip", &cfg->sdp.ebuacip); return err; }