📄 pjsua.h
字号:
/* $Id: pjsua.h 1122 2007-04-02 11:22:49Z bennylp $ *//* * Copyright (C) 2003-2007 Benny Prijono <benny@prijono.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#ifndef __PJSUA_H__#define __PJSUA_H__/** * @file pjsua.h * @brief PJSUA API. *//* Include all PJSIP core headers. */#include <pjsip.h>/* Include all PJMEDIA headers. */#include <pjmedia.h>/* Include all PJMEDIA-CODEC headers. */#include <pjmedia-codec.h>/* Include all PJSIP-UA headers */#include <pjsip_ua.h>/* Include all PJSIP-SIMPLE headers */#include <pjsip_simple.h>/* Include all PJLIB-UTIL headers. */#include <pjlib-util.h>/* Include all PJLIB headers. */#include <pjlib.h>PJ_BEGIN_DECL/** * @defgroup PJSUA_LIB PJSUA API - High Level Softphone API for C/C++ and Python * @ingroup PJSIP * @brief Very high level API for constructing SIP UA applications. * @{ * * @section pjsua_api_intro A SIP User Agent API for C/C++ and Python * * PJSUA API is very high level API, available for C/C++ and Python language, * for constructing SIP multimedia user agent * applications. It wraps together the signaling and media functionalities * into an easy to use call API, provides account management, buddy * management, presence, instant messaging, along with multimedia * features such as conferencing, file streaming, local playback, * voice recording, and so on. * * @subsection pjsua_for_c_cpp C/C++ Binding * Application must link with <b>pjsua-lib</b> to use this API. In addition, * this library depends on the following libraries: * - <b>pjsip-ua</b>, * - <b>pjsip-simple</b>, * - <b>pjsip-core</b>, * - <b>pjmedia</b>, * - <b>pjmedia-codec</b>, * - <b>pjlib-util</b>, and * - <b>pjlib</b>, * * so application must also link with these libraries as well. For more * information, please refer to * <A HREF="http://www.pjsip.org/using.htm">Getting Started with PJSIP</A> * page. * * @subsection pjsua_for_python Python Binding * * The Python binding for PJSUA-API is implemented by <b>py_pjsua</b> * module, in <tt>pjsip-apps/py_pjsua</tt> directory. This module is * built by building <tt>py_pjsua</tt> project in <tt>pjsip_apps</tt> * Visual Studio workspace, or by invoking the usual <tt>setup.py</tt> * Python installer script. * * The Python script then can import the PJSUA-API Python module by * using <b>import py_pjsua</b> construct as usual. * * * @section pjsua_samples * * Few samples are provided both in C and Python. * - @ref page_pjsip_sample_simple_pjsuaua_c\n Very simple SIP User Agent with registration, call, and media, using PJSUA-API, all in under 200 lines of code. - @ref page_pjsip_samples_pjsua\n This is the reference implementation for PJSIP and PJMEDIA. PJSUA is a console based application, designed to be simple enough to be readble, but powerful enough to demonstrate all features available in PJSIP and PJMEDIA.\n - Python sample\n For a real simple Python sample application, have a look at <A HREF="http://www.pjsip.org/trac/browser/pjproject/trunk/pjsip-apps/src/py_pjsua/pjsua_app.py"> <tt>pjsip-apps/src/py_pjsua/pjsua_app.py</tt></A> file. * @section root_using_pjsua_lib Using PJSUA API * * Please refer to @ref PJSUA_LIB_BASE on how to create and initialize the API. * And then see the Modules on the bottom of this page for more information * about specific subject. */ /***************************************************************************** * BASE API *//** * @defgroup PJSUA_LIB_BASE PJSUA-API Basic API * @ingroup PJSUA_LIB * @brief Basic application creation/initialization, logging configuration, etc. * @{ * * The base PJSUA API controls PJSUA creation, initialization, and startup, and * also provides various auxiliary functions. * * @section using_pjsua_lib Using PJSUA Library * * @subsection creating_pjsua_lib Creating PJSUA * * Before anything else, application must create PJSUA by calling #pjsua_create() * (or <tt>py_pjsua.create()</tt> from Python). * This, among other things, will initialize PJLIB, which is crucial before * any PJLIB functions can be called, PJLIB-UTIL, and create a SIP endpoint. * * After this function is called, application can create a memory pool (with * #pjsua_pool_create()) and read configurations from command line or file to * build the settings to initialize PJSUA below. * * @subsection init_pjsua_lib Initializing PJSUA * * After PJSUA is created, application can initialize PJSUA by calling * #pjsua_init(). This function takes several optional configuration settings * in the argument, if application wants to set them. * * @subsubsection init_pjsua_lib_c_cpp PJSUA-LIB Initialization (in C) * Sample code to initialize PJSUA in C code: \code #include <pjsua-lib/pjsua.h> #define THIS_FILE __FILE__ static pj_status_t app_init(void) { pjsua_config ua_cfg; pjsua_logging_config log_cfg; pjsua_media_config media_cfg; pj_status_t status; // Must create pjsua before anything else! status = pjsua_create(); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Error initializing pjsua", status); return status; } // Initialize configs with default settings. pjsua_config_default(&ua_cfg); pjsua_logging_config_default(&log_cfg); pjsua_media_config_default(&media_cfg); // At the very least, application would want to override // the call callbacks in pjsua_config: ua_cfg.cb.on_incoming_call = ... ua_cfg.cb.on_call_state = .. ... // Customize other settings (or initialize them from application specific // configuration file): ... // Initialize pjsua status = pjsua_init(&ua_cfg, &log_cfg, &media_cfg); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Error initializing pjsua", status); return status; } . ... } \endcode * * * @subsubsection init_pjsua_lib_python PJSUA-LIB Initialization (in Python) * Sample code to initialize PJSUA in Python code: \codeimport py_pjsua## Initialize pjsua.#def app_init(): # Create pjsua before anything else status = py_pjsua.create() if status != 0: err_exit("pjsua create() error", status) # We use default logging config for this sample log_cfg = py_pjsua.logging_config_default() # Create and initialize pjsua config # Note: for this Python module, thread_cnt must be 0 since Python # doesn't like to be called from alien thread (pjsua's thread # in this case) ua_cfg = py_pjsua.config_default() ua_cfg.thread_cnt = 0 ua_cfg.user_agent = "PJSUA/Python 0.1" # Override callbacks. At the very least application would want to # override the call callbacks in pjsua_config ua_cfg.cb.on_incoming_call = ... ua_cfg.cb.on_call_state = ... # Use default media config for this cample med_cfg = py_pjsua.media_config_default() # # Initialize pjsua!! # status = py_pjsua.init(ua_cfg, log_cfg, med_cfg) if status != 0: err_exit("pjsua init() error", status)# Utility: display PJ error and exit#def err_exit(title, rc): py_pjsua.perror(THIS_FILE, title, rc) exit(1) \endcode * @subsection other_init_pjsua_lib Other Initialization * * After PJSUA is initialized with #pjsua_init(), application will normally * need/want to perform the following tasks: * * - create SIP transport with #pjsua_transport_create(). Application would * to call #pjsua_transport_create() for each transport types that it * wants to support (for example, UDP, TCP, and TLS). Please see * @ref PJSUA_LIB_TRANSPORT section for more info. * - create one or more SIP accounts with #pjsua_acc_add() or * #pjsua_acc_add_local(). The SIP account is used for registering with * the SIP server, if any. Please see @ref PJSUA_LIB_ACC for more info. * - add one or more buddies with #pjsua_buddy_add(). Please see * @ref PJSUA_LIB_BUDDY section for more info. * - optionally configure the sound device, codec settings, and other * media settings. Please see @ref PJSUA_LIB_MEDIA for more info. * * * @subsection starting_pjsua_lib Starting PJSUA * * After all initializations have been done, application must call * #pjsua_start() to start PJSUA. This function will check that all settings * have been properly configured, and apply default settings when they haven't, * or report error status when it is unable to recover from missing settings. * * Most settings can be changed during run-time. For example, application * may add, modify, or delete accounts, buddies, or change media settings * during run-time. * * @subsubsection starting_pjsua_lib_c C Example for Starting PJSUA * Sample code: \code static pj_status_t app_run(void) { pj_status_t status; // Start pjsua status = pjsua_start(); if (status != PJ_SUCCESS) { pjsua_destroy(); pjsua_perror(THIS_FILE, "Error starting pjsua", status); return status; } // Run application loop while (1) { char choice[10]; printf("Select menu: "); fgets(choice, sizeof(choice), stdin); ... } } \endcode * @subsubsection starting_pjsua_lib_python Python Example for starting PJSUA * For Python, starting PJSUA-LIB takes one more step, that is to initialize * Python worker thread to poll PJSUA-LIB. This step is necessary because * Python doesn't like it when it is called by an "alien" thread (that is, * thread that is not created using Python API). * * Because of this, we cannot use a worker thread in PJSUA-LIB, because then * the Python callback will be called by an "alien" thread and this would * crash Python (or raise assert() probably). * * So because worker thread is disabled, we need to create a worker thread * in Python. Note that this may not be necessary if we're creating a * GUI application, because then we can attach, for example, a GUI timer * object to poll the PJSUA-LIB. But because we're creating a console * application which will block at <tt>sys.stdin.readline()</tt>, we need * to have a worker thread to poll PJSUA-LIB. \codeimport threadC_QUIT = 0def app_start(): # Done with initialization, start pjsua!! # status = py_pjsua.start() if status != 0: py_pjsua.destroy() err_exit("Error starting pjsua!", status) # Start worker thread thr = thread.start_new(worker_thread_main, (0,)) print "PJSUA Started!!"## Worker thread function.# Python doesn't like it when it's called from an alien thread# (pjsua's worker thread, in this case), so for Python we must# disable worker thread in pjsua and poll pjsua from Python instead.#def worker_thread_main(arg): global C_QUIT thread_desc = 0 status = py_pjsua.thread_register("python worker", thread_desc) if status != 0: py_pjsua.perror(THIS_FILE, "Error registering thread", status) else: while C_QUIT == 0: py_pjsua.handle_events(50) print "Worker thread quitting.." C_QUIT = 2 \endcode *//** Constant to identify invalid ID for all sorts of IDs. */#define PJSUA_INVALID_ID (-1)/** Call identification */typedef int pjsua_call_id;/** Account identification */typedef int pjsua_acc_id;/** Buddy identification */typedef int pjsua_buddy_id;/** File player identification */typedef int pjsua_player_id;/** File recorder identification */typedef int pjsua_recorder_id;/** Conference port identification */typedef int pjsua_conf_port_id;/** * Maximum proxies in account. */#ifndef PJSUA_ACC_MAX_PROXIES# define PJSUA_ACC_MAX_PROXIES 8#endif/** * Logging configuration, which can be (optionally) specified when calling * #pjsua_init(). Application must call #pjsua_logging_config_default() to * initialize this structure with the default values. * * \par Sample Python Syntax: * \code # Python type: py_pjsua.Logging_Config log_cfg = py_pjsua.logging_config_default() log_cfg.level = 4 * \endcode */typedef struct pjsua_logging_config{ /** * Log incoming and outgoing SIP message? Yes! */ pj_bool_t msg_logging; /** * Input verbosity level. Value 5 is reasonable. */ unsigned level; /** * Verbosity level for console. Value 4 is reasonable. */ unsigned console_level; /** * Log decoration. */ unsigned decor; /** * Optional log filename. */ pj_str_t log_filename; /** * Optional callback function to be called to write log to * application specific device. This function will be called for * log messages on input verbosity level. * * \par Sample Python Syntax: * \code # level: integer # data: string # len: integer def cb(level, data, len): print data, * \endcode */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -