/* * Copyright (c) 2007, Anthony Minessale II * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of the original author; nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Contributors: * * Moises Silva * */ #ifndef FREETDM_H #define FREETDM_H #include "ftdm_declare.h" #include "ftdm_call_utils.h" /*! \brief Max number of channels per physical span */ #define FTDM_MAX_CHANNELS_PHYSICAL_SPAN 32 /*! \brief Max number of physical spans per logical span */ #define FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN 32 /*! \brief Max number of channels a logical span can contain */ #define FTDM_MAX_CHANNELS_SPAN FTDM_MAX_CHANNELS_PHYSICAL_SPAN * FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN /*! \brief Max number of logical spans */ #define FTDM_MAX_SPANS_INTERFACE 128 /*! \brief Max number of channels per hunting group */ #define FTDM_MAX_CHANNELS_GROUP 1024 /*! \brief Max number of groups */ #define FTDM_MAX_GROUPS_INTERFACE FTDM_MAX_SPANS_INTERFACE #define FTDM_INVALID_INT_PARM 0xFF /*! \brief Thread/Mutex OS abstraction API. */ #include "ftdm_os.h" #ifdef __cplusplus extern "C" { #endif /*! \brief Limit to span names */ #define FTDM_MAX_NAME_STR_SZ 80 /*! \brief Limit to channel number strings */ #define FTDM_MAX_NUMBER_STR_SZ 20 /*! \brief Hangup cause codes */ typedef enum { FTDM_CAUSE_NONE = 0, FTDM_CAUSE_UNALLOCATED = 1, FTDM_CAUSE_NO_ROUTE_TRANSIT_NET = 2, FTDM_CAUSE_NO_ROUTE_DESTINATION = 3, FTDM_CAUSE_CHANNEL_UNACCEPTABLE = 6, FTDM_CAUSE_CALL_AWARDED_DELIVERED = 7, FTDM_CAUSE_NORMAL_CLEARING = 16, FTDM_CAUSE_USER_BUSY = 17, FTDM_CAUSE_NO_USER_RESPONSE = 18, FTDM_CAUSE_NO_ANSWER = 19, FTDM_CAUSE_SUBSCRIBER_ABSENT = 20, FTDM_CAUSE_CALL_REJECTED = 21, FTDM_CAUSE_NUMBER_CHANGED = 22, FTDM_CAUSE_REDIRECTION_TO_NEW_DESTINATION = 23, FTDM_CAUSE_EXCHANGE_ROUTING_ERROR = 25, FTDM_CAUSE_DESTINATION_OUT_OF_ORDER = 27, FTDM_CAUSE_INVALID_NUMBER_FORMAT = 28, FTDM_CAUSE_FACILITY_REJECTED = 29, FTDM_CAUSE_RESPONSE_TO_STATUS_ENQUIRY = 30, FTDM_CAUSE_NORMAL_UNSPECIFIED = 31, FTDM_CAUSE_NORMAL_CIRCUIT_CONGESTION = 34, FTDM_CAUSE_NETWORK_OUT_OF_ORDER = 38, FTDM_CAUSE_NORMAL_TEMPORARY_FAILURE = 41, FTDM_CAUSE_SWITCH_CONGESTION = 42, FTDM_CAUSE_ACCESS_INFO_DISCARDED = 43, FTDM_CAUSE_REQUESTED_CHAN_UNAVAIL = 44, FTDM_CAUSE_PRE_EMPTED = 45, FTDM_CAUSE_FACILITY_NOT_SUBSCRIBED = 50, FTDM_CAUSE_OUTGOING_CALL_BARRED = 52, FTDM_CAUSE_INCOMING_CALL_BARRED = 54, FTDM_CAUSE_BEARERCAPABILITY_NOTAUTH = 57, FTDM_CAUSE_BEARERCAPABILITY_NOTAVAIL = 58, FTDM_CAUSE_SERVICE_UNAVAILABLE = 63, FTDM_CAUSE_BEARERCAPABILITY_NOTIMPL = 65, FTDM_CAUSE_CHAN_NOT_IMPLEMENTED = 66, FTDM_CAUSE_FACILITY_NOT_IMPLEMENTED = 69, FTDM_CAUSE_SERVICE_NOT_IMPLEMENTED = 79, FTDM_CAUSE_INVALID_CALL_REFERENCE = 81, FTDM_CAUSE_INCOMPATIBLE_DESTINATION = 88, FTDM_CAUSE_INVALID_MSG_UNSPECIFIED = 95, FTDM_CAUSE_MANDATORY_IE_MISSING = 96, FTDM_CAUSE_MESSAGE_TYPE_NONEXIST = 97, FTDM_CAUSE_WRONG_MESSAGE = 98, FTDM_CAUSE_IE_NONEXIST = 99, FTDM_CAUSE_INVALID_IE_CONTENTS = 100, FTDM_CAUSE_WRONG_CALL_STATE = 101, FTDM_CAUSE_RECOVERY_ON_TIMER_EXPIRE = 102, FTDM_CAUSE_MANDATORY_IE_LENGTH_ERROR = 103, FTDM_CAUSE_PROTOCOL_ERROR = 111, FTDM_CAUSE_INTERWORKING = 127, FTDM_CAUSE_SUCCESS = 142, FTDM_CAUSE_ORIGINATOR_CANCEL = 487, FTDM_CAUSE_CRASH = 500, FTDM_CAUSE_SYSTEM_SHUTDOWN = 501, FTDM_CAUSE_LOSE_RACE = 502, FTDM_CAUSE_MANAGER_REQUEST = 503, FTDM_CAUSE_BLIND_TRANSFER = 600, FTDM_CAUSE_ATTENDED_TRANSFER = 601, FTDM_CAUSE_ALLOTTED_TIMEOUT = 602, FTDM_CAUSE_USER_CHALLENGE = 603, FTDM_CAUSE_MEDIA_TIMEOUT = 604 } ftdm_call_cause_t; /*! \brief Hunting direction (when hunting for free channels) */ typedef enum { FTDM_TOP_DOWN, FTDM_BOTTOM_UP } ftdm_direction_t; /*! \brief I/O channel type */ typedef enum { FTDM_CHAN_TYPE_B, /*!< Bearer channel */ FTDM_CHAN_TYPE_DQ921, /*< DQ921 channel (D-channel) */ FTDM_CHAN_TYPE_DQ931, /*!< DQ931 channel */ FTDM_CHAN_TYPE_FXS, /*!< FXS analog channel */ FTDM_CHAN_TYPE_FXO, /*!< FXO analog channel */ FTDM_CHAN_TYPE_EM, /*!< E & M channel */ FTDM_CHAN_TYPE_CAS, /*!< CAS channel */ FTDM_CHAN_TYPE_COUNT /*!< Count of channel types */ } ftdm_chan_type_t; #define CHAN_TYPE_STRINGS "B", "DQ921", "DQ931", "FXS", "FXO", "EM", "CAS", "INVALID" /*! \brief transform from channel type to string and from string to channel type * ftdm_str2ftdm_chan_type transforms a channel string (ie: "FXO" to FTDM_CHAN_TYPE_FXO) * ftdm_chan_type2str transforms a channel type to string (ie: FTDM_CHAN_TYPE_B to "B") */ FTDM_STR2ENUM_P(ftdm_str2ftdm_chan_type, ftdm_chan_type2str, ftdm_chan_type_t) /*! \brief Test if a channel is a voice channel */ #define FTDM_IS_VOICE_CHANNEL(ftdm_chan) ((ftdm_chan)->type != FTDM_CHAN_TYPE_DQ921 && (ftdm_chan)->type != FTDM_CHAN_TYPE_DQ931) /*! \brief Test if a channel is a D-channel */ #define FTDM_IS_DCHAN(ftdm_chan) ((ftdm_chan)->type == FTDM_CHAN_TYPE_DQ921 || (ftdm_chan)->type == FTDM_CHAN_TYPE_DQ931) /*! \brief Logging function prototype to be used for all FreeTDM logs * you should use ftdm_global_set_logger to set your own logger */ typedef void (*ftdm_logger_t)(const char *file, const char *func, int line, int level, const char *fmt, ...); /*! \brief Data queue operation functions * you can use ftdm_global_set_queue_handler if you want to override the default implementation (not recommended) */ typedef ftdm_status_t (*ftdm_queue_create_func_t)(ftdm_queue_t **queue, ftdm_size_t capacity); typedef ftdm_status_t (*ftdm_queue_enqueue_func_t)(ftdm_queue_t *queue, void *obj); typedef void *(*ftdm_queue_dequeue_func_t)(ftdm_queue_t *queue); typedef ftdm_status_t (*ftdm_queue_wait_func_t)(ftdm_queue_t *queue, int ms); typedef ftdm_status_t (*ftdm_queue_get_interrupt_func_t)(ftdm_queue_t *queue, ftdm_interrupt_t **interrupt); typedef ftdm_status_t (*ftdm_queue_destroy_func_t)(ftdm_queue_t **queue); typedef struct ftdm_queue_handler { ftdm_queue_create_func_t create; ftdm_queue_enqueue_func_t enqueue; ftdm_queue_dequeue_func_t dequeue; ftdm_queue_wait_func_t wait; ftdm_queue_get_interrupt_func_t get_interrupt; ftdm_queue_destroy_func_t destroy; } ftdm_queue_handler_t; /*! \brief Type Of Number (TON) */ typedef enum { FTDM_TON_UNKNOWN = 0, FTDM_TON_INTERNATIONAL, FTDM_TON_NATIONAL, FTDM_TON_NETWORK_SPECIFIC, FTDM_TON_SUBSCRIBER_NUMBER, FTDM_TON_ABBREVIATED_NUMBER, FTDM_TON_RESERVED, FTDM_TON_INVALID } ftdm_ton_t; #define TON_STRINGS "unknown", "international", "national", "network-specific", "subscriber-number", "abbreviated-number", "reserved", "invalid" FTDM_STR2ENUM_P(ftdm_str2ftdm_ton, ftdm_ton2str, ftdm_ton_t) /*! Numbering Plan Identification (NPI) */ typedef enum { FTDM_NPI_UNKNOWN = 0, FTDM_NPI_ISDN = 1, FTDM_NPI_DATA = 3, FTDM_NPI_TELEX = 4, FTDM_NPI_NATIONAL = 8, FTDM_NPI_PRIVATE = 9, FTDM_NPI_RESERVED = 10, FTDM_NPI_INVALID } ftdm_npi_t; #define NPI_STRINGS "unknown", "ISDN", "data", "telex", "national", "private", "reserved", "invalid" FTDM_STR2ENUM_P(ftdm_str2ftdm_npi, ftdm_npi2str, ftdm_npi_t) /*! Presentation Ind */ typedef enum { FTDM_PRES_ALLOWED, FTDM_PRES_RESTRICTED, FTDM_PRES_NOT_AVAILABLE, FTDM_PRES_RESERVED, FTDM_PRES_INVALID } ftdm_presentation_t; #define PRESENTATION_STRINGS "presentation-allowed", "presentation-restricted", "number-not-available", "reserved", "Invalid" FTDM_STR2ENUM_P(ftdm_str2ftdm_presentation, ftdm_presentation2str, ftdm_presentation_t) /*! Screening Ind */ typedef enum { FTDM_SCREENING_NOT_SCREENED, FTDM_SCREENING_VERIFIED_PASSED, FTDM_SCREENING_VERIFIED_FAILED, FTDM_SCREENING_NETWORK_PROVIDED, FTDM_SCREENING_INVALID } ftdm_screening_t; #define SCREENING_STRINGS "user-provided-not-screened", "user-provided-verified-and-passed", "user-provided-verified-and-failed", "network-provided", "invalid" FTDM_STR2ENUM_P(ftdm_str2ftdm_screening, ftdm_screening2str, ftdm_screening_t) /*! \brief bearer capability */ typedef enum { FTDM_BEARER_CAP_SPEECH = 0x00, FTDM_BEARER_CAP_64K_UNRESTRICTED = 0x02, FTDM_BEARER_CAP_3_1KHZ_AUDIO = 0x03, FTDM_BEARER_CAP_INVALID } ftdm_bearer_cap_t; #define BEARER_CAP_STRINGS "speech", "unrestricted-digital-information", "3.1-Khz-audio", "invalid" FTDM_STR2ENUM_P(ftdm_str2ftdm_bearer_cap, ftdm_bearer_cap2str, ftdm_bearer_cap_t) /*! \brief user information layer 1 protocol */ typedef enum { FTDM_USER_LAYER1_PROT_V110 = 0x01, FTDM_USER_LAYER1_PROT_ULAW = 0x02, FTDM_USER_LAYER1_PROT_ALAW = 0x03, FTDM_USER_LAYER1_PROT_INVALID } ftdm_user_layer1_prot_t; #define USER_LAYER1_PROT_STRINGS "V.110", "u-law", "a-law", "Invalid" FTDM_STR2ENUM_P(ftdm_str2ftdm_usr_layer1_prot, ftdm_user_layer1_prot2str, ftdm_user_layer1_prot_t) /*! \brief Number abstraction */ typedef struct { char digits[25]; uint8_t type; uint8_t plan; } ftdm_number_t; typedef void * ftdm_variable_container_t; /*! \brief Caller information */ typedef struct ftdm_caller_data { char cid_date[8]; /*!< Caller ID date */ char cid_name[80]; /*!< Caller ID name */ ftdm_number_t cid_num; /*!< Caller ID number */ ftdm_number_t ani; /*!< ANI (Automatic Number Identification) */ ftdm_number_t dnis; /*!< DNIS (Dialed Number Identification Service) */ ftdm_number_t rdnis; /*!< RDNIS (Redirected Dialed Number Identification Service) */ char aniII[25]; /*! ANI II */ uint8_t screen; /*!< Screening */ uint8_t pres; /*!< Presentation*/ char collected[25]; /*!< Collected digits so far */ int hangup_cause; /*!< Hangup cause */ char raw_data[1024]; /*!< Protocol specific raw caller data */ uint32_t raw_data_len; /*!< Raw data length */ /* these 2 are undocumented right now, only used by boost: */ /* bearer capability */ ftdm_bearer_cap_t bearer_capability; /* user information layer 1 protocol */ ftdm_user_layer1_prot_t bearer_layer1; ftdm_variable_container_t variables; /*!variables and caller_data->raw_data. * */ FT_DECLARE(void) ftdm_call_clear_data(ftdm_caller_data_t *caller_data); /*! \brief Get the span pointer associated to the channel */ FT_DECLARE(ftdm_span_t *) ftdm_channel_get_span(const ftdm_channel_t *ftdmchan); /*! \brief Get the span pointer associated to the channel */ FT_DECLARE(uint32_t) ftdm_channel_get_span_id(const ftdm_channel_t *ftdmchan); /*! \brief Get the physical span id associated to the channel */ FT_DECLARE(uint32_t) ftdm_channel_get_ph_span_id(const ftdm_channel_t *ftdmchan); /*! \brief Get the span name associated to the channel */ FT_DECLARE(const char *) ftdm_channel_get_span_name(const ftdm_channel_t *ftdmchan); /*! \brief Get the id associated to the channel */ FT_DECLARE(uint32_t) ftdm_channel_get_id(const ftdm_channel_t *ftdmchan); /*! \brief Get the name associated to the channel */ FT_DECLARE(const char *) ftdm_channel_get_name(const ftdm_channel_t *ftdmchan); /*! \brief Get the number associated to the channel */ FT_DECLARE(const char *) ftdm_channel_get_number(const ftdm_channel_t *ftdmchan); /*! \brief Get the number physical id associated to the channel */ FT_DECLARE(uint32_t) ftdm_channel_get_ph_id(const ftdm_channel_t *ftdmchan); /*! * \brief Configure span with a signaling type (deprecated use ftdm_configure_span_signaling instead) * * \note This function does the same as ftdm_configure_span_signaling * * \param span The span to configure * \param type The signaling type ("boost", "isdn" and others, this depends on the available signaling modules) * \param sig_cb The callback that the signaling stack will use to notify about events * \param ... variable argument list with "var", value sequence, the variable and values are signaling type dependant * the last argument must be FTDM_TAG_END * * \retval FTDM_SUCCESS success * \retval FTDM_FAIL failure */ FT_DECLARE(ftdm_status_t) ftdm_configure_span(ftdm_span_t *span, const char *type, fio_signal_cb_t sig_cb, ...); #define FTDM_TAG_END NULL /*! * \brief Configure span with a signaling type * * \param span The span to configure * \param type The signaling type ("boost", "isdn" and others, this depends on the available signaling modules) * \param sig_cb The callback that the signaling stack will use to notify about events * \param parameters The array if signaling-specific parameters (the last member of the array MUST have its var member set to NULL, ie: .var = NULL) * * \retval FTDM_SUCCESS success * \retval FTDM_FAIL failure */ FT_DECLARE(ftdm_status_t) ftdm_configure_span_signaling(ftdm_span_t *span, const char *type, fio_signal_cb_t sig_cb, ftdm_conf_parameter_t *parameters); /*! * \brief Start the span signaling (must call ftdm_configure_span_signaling first) * * \note Even before this function returns you may receive signaling events! * Never block in the signaling callback since it might be called in a thread * that handles more than 1 call and therefore you would be blocking all the * calls handled by that thread! * * \param span The span to start * * \retval FTDM_SUCCESS success * \retval FTDM_FAIL failure */ FT_DECLARE(ftdm_status_t) ftdm_span_start(ftdm_span_t *span); /*! * \brief Stop the span signaling (must call ftdm_span_start first) * \note certain signalings (boost signaling) does not support granular span start/stop * so it is recommended to always configure all spans and then starting them all and finally * stop them all (or call ftdm_global_destroy which takes care of stopping and destroying the spans at once). * * \param span The span to stop * * \retval FTDM_SUCCESS success * \retval FTDM_FAIL failure */ FT_DECLARE(ftdm_status_t) ftdm_span_stop(ftdm_span_t *span); /*! * \brief Register a custom I/O interface with the FreeTDM core * * \param io_interface the Interface to register * * \retval FTDM_SUCCESS success * \retval FTDM_FAIL failure */ FT_DECLARE(ftdm_status_t) ftdm_global_add_io_interface(ftdm_io_interface_t *io_interface); /*! \brief Find a span by name */ FT_DECLARE(ftdm_status_t) ftdm_span_find_by_name(const char *name, ftdm_span_t **span); /*! \brief Get the span id */ FT_DECLARE(uint32_t) ftdm_span_get_id(const ftdm_span_t *span); /*! \brief Get the span name */ FT_DECLARE(const char *) ftdm_span_get_name(const ftdm_span_t *span); /*! \brief Get iterator for the span channels * \param span The span containing the channels * \param iter Optional iterator. You can reuse an old iterator (not previously freed) to avoid the extra allocation of a new iterator. */ FT_DECLARE(ftdm_iterator_t *) ftdm_span_get_chan_iterator(const ftdm_span_t *span, ftdm_iterator_t *iter); /*! * \brief Execute a text command. The text command output will be returned and must be free'd * * \param cmd The command to execute * * \retval FTDM_SUCCESS success * \retval FTDM_FAIL failure */ FT_DECLARE(char *) ftdm_api_execute(const char *cmd); /*! * \brief Create a configuration node * * \param name The name of the configuration node * \param node The node pointer to store the new node * \param parent The parent node if any, or NULL if no parent * * \return FTDM_SUCCESS success * \return FTDM_FAIL failure */ FT_DECLARE(ftdm_status_t) ftdm_conf_node_create(const char *name, ftdm_conf_node_t **node, ftdm_conf_node_t *parent); /*! * \brief Adds a new parameter to the specified configuration node * * \param node The configuration node to add the param-val pair to * \param param The parameter name * \param val The parameter value * * \return FTDM_SUCCESS success * \return FTDM_FAIL failure */ FT_DECLARE(ftdm_status_t) ftdm_conf_node_add_param(ftdm_conf_node_t *node, const char *param, const char *val); /*! * \brief Destroy the memory allocated for a configuration node (and all of its descendance) * * \param node The node to destroy * * \return FTDM_SUCCESS success * \return FTDM_FAIL failure */ FT_DECLARE(ftdm_status_t) ftdm_conf_node_destroy(ftdm_conf_node_t *node); /*! * \brief Create and configure channels in the given span * * \param span The span container * \param str The channel range null terminated string. "1-10", "24" etc * \param chan_config The basic channel configuration for each channel within the range * \param configured Pointer where the number of channels configured will be stored * * \return FTDM_SUCCESS success * \return FTDM_FAIL failure */ FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char *str, ftdm_channel_config_t *chan_config, unsigned *configured); /*! * \brief Set the trunk type for a span * This must be called before configuring any channels within the span * * \param span The span * \param type The trunk type * */ FT_DECLARE(void) ftdm_span_set_trunk_type(ftdm_span_t *span, ftdm_trunk_type_t type); /*! * \brief Get the trunk type for a span * * \param span The span * * \return The span trunk type */ FT_DECLARE(ftdm_trunk_type_t) ftdm_span_get_trunk_type(const ftdm_span_t *span); /*! \brief For display debugging purposes you can display this string which describes the trunk type of a span */ FT_DECLARE(const char *) ftdm_span_get_trunk_type_str(const ftdm_span_t *span); /*! * \brief Return the channel identified by the provided id * * \param span The span where the channel belongs * \param chanid The channel id within the span * * \return The channel pointer if found, NULL otherwise */ FT_DECLARE(ftdm_channel_t *) ftdm_span_get_channel(const ftdm_span_t *span, uint32_t chanid); /*! \brief Return the channel count number for the given span */ FT_DECLARE(uint32_t) ftdm_span_get_chan_count(const ftdm_span_t *span); /*! \brief Set the caller data for a channel. Be sure to call this before ftdm_channel_call_place() */ FT_DECLARE(ftdm_status_t) ftdm_channel_set_caller_data(ftdm_channel_t *ftdmchan, ftdm_caller_data_t *caller_data); /*! \brief Get the caller data for a channel, typically you need this when receiving FTDM_SIGEVENT_START */ FT_DECLARE(ftdm_caller_data_t *) ftdm_channel_get_caller_data(ftdm_channel_t *channel); /*! \brief Get current state of a channel */ FT_DECLARE(int) ftdm_channel_get_state(const ftdm_channel_t *ftdmchan); /*! \brief Get last state of a channel */ FT_DECLARE(int) ftdm_channel_get_last_state(const ftdm_channel_t *ftdmchan); /*! \brief For display debugging purposes you can display this string which describes the current channel internal state */ FT_DECLARE(const char *) ftdm_channel_get_state_str(const ftdm_channel_t *channel); /*! \brief For display debugging purposes you can display this string which describes the last channel internal state */ FT_DECLARE(const char *) ftdm_channel_get_last_state_str(const ftdm_channel_t *channel); /*! \brief For display debugging purposes you can display this string which describes the history of the channel * \param channel The channel to get the history from * \return History string for the channel. You must free the string with ftdm_free */ FT_DECLARE(char *) ftdm_channel_get_history_str(const ftdm_channel_t *channel); /*! \brief Initialize channel state for an outgoing call */ FT_DECLARE(ftdm_status_t) ftdm_channel_init(ftdm_channel_t *ftdmchan); /*! \brief Initialize the library */ FT_DECLARE(ftdm_status_t) ftdm_global_init(void); /*! \brief Create spans and channels reading the freetdm.conf file */ FT_DECLARE(ftdm_status_t) ftdm_global_configuration(void); /*! \brief Shutdown the library */ FT_DECLARE(ftdm_status_t) ftdm_global_destroy(void); /*! \brief Set memory handler for the library */ FT_DECLARE(ftdm_status_t) ftdm_global_set_memory_handler(ftdm_memory_handler_t *handler); /*! \brief Set the crash policy for the library */ FT_DECLARE(void) ftdm_global_set_crash_policy(ftdm_crash_policy_t policy); /*! \brief Set the logger handler for the library */ FT_DECLARE(void) ftdm_global_set_logger(ftdm_logger_t logger); /*! \brief Set the default logger level */ FT_DECLARE(void) ftdm_global_set_default_logger(int level); /*! \brief Set the directory to look for modules */ FT_DECLARE(void) ftdm_global_set_mod_directory(const char *path); /*! \brief Set the directory to look for configs */ FT_DECLARE(void) ftdm_global_set_config_directory(const char *path); /*! \brief Check if the FTDM library is initialized and running */ FT_DECLARE(ftdm_bool_t) ftdm_running(void); FT_DECLARE_DATA extern ftdm_logger_t ftdm_log; /*! \brief Basic transcoding function prototype */ #define FIO_CODEC_ARGS (void *data, ftdm_size_t max, ftdm_size_t *datalen) #define FIO_CODEC_FUNCTION(name) FT_DECLARE_NONSTD(ftdm_status_t) name FIO_CODEC_ARGS typedef ftdm_status_t (*fio_codec_t) FIO_CODEC_ARGS ; /*! \brief Basic transcoding functions */ FIO_CODEC_FUNCTION(fio_slin2ulaw); FIO_CODEC_FUNCTION(fio_ulaw2slin); FIO_CODEC_FUNCTION(fio_slin2alaw); FIO_CODEC_FUNCTION(fio_alaw2slin); FIO_CODEC_FUNCTION(fio_ulaw2alaw); FIO_CODEC_FUNCTION(fio_alaw2ulaw); #define FTDM_PRE __FILE__, __FUNCTION__, __LINE__ #define FTDM_LOG_LEVEL_DEBUG 7 #define FTDM_LOG_LEVEL_INFO 6 #define FTDM_LOG_LEVEL_NOTICE 5 #define FTDM_LOG_LEVEL_WARNING 4 #define FTDM_LOG_LEVEL_ERROR 3 #define FTDM_LOG_LEVEL_CRIT 2 #define FTDM_LOG_LEVEL_ALERT 1 #define FTDM_LOG_LEVEL_EMERG 0 /*! \brief Log levels */ #define FTDM_LOG_DEBUG FTDM_PRE, FTDM_LOG_LEVEL_DEBUG #define FTDM_LOG_INFO FTDM_PRE, FTDM_LOG_LEVEL_INFO #define FTDM_LOG_NOTICE FTDM_PRE, FTDM_LOG_LEVEL_NOTICE #define FTDM_LOG_WARNING FTDM_PRE, FTDM_LOG_LEVEL_WARNING #define FTDM_LOG_ERROR FTDM_PRE, FTDM_LOG_LEVEL_ERROR #define FTDM_LOG_CRIT FTDM_PRE, FTDM_LOG_LEVEL_CRIT #define FTDM_LOG_ALERT FTDM_PRE, FTDM_LOG_LEVEL_ALERT #define FTDM_LOG_EMERG FTDM_PRE, FTDM_LOG_LEVEL_EMERG #ifdef __cplusplus } /* extern C */ #endif #endif /* For Emacs: * Local Variables: * mode:c * indent-tabs-mode:t * tab-width:4 * c-basic-offset:4 * End: * For VIM: * vim:set softtabstop=4 shiftwidth=4 tabstop=4: */