00001 /* 00002 * Asterisk -- A telephony toolkit for Linux. 00003 * 00004 * General Asterisk channel definitions. 00005 * 00006 * Copyright (C) 1999, Mark Spencer 00007 * 00008 * Mark Spencer <markster@linux-support.net> 00009 * 00010 * This program is free software, distributed under the terms of 00011 * the GNU General Public License 00012 */ 00013 00014 #ifndef _ASTERISK_CHANNEL_H 00015 #define _ASTERISK_CHANNEL_H 00016 00017 #include <asterisk/frame.h> 00018 #include <asterisk/sched.h> 00019 #include <asterisk/chanvars.h> 00020 #include <unistd.h> 00021 #include <setjmp.h> 00022 #include <sys/poll.h> 00023 00024 #if defined(__cplusplus) || defined(c_plusplus) 00025 extern "C" { 00026 #endif 00027 00028 #include <asterisk/lock.h> 00029 00030 //! Max length of an extension 00031 #define AST_MAX_EXTENSION 80 00032 00033 #include <asterisk/cdr.h> 00034 #include <asterisk/monitor.h> 00035 00036 00037 #define AST_CHANNEL_NAME 80 00038 #define AST_CHANNEL_MAX_STACK 32 00039 00040 #define MAX_LANGUAGE 20 00041 00042 00043 #define AST_MAX_FDS 8 00044 00045 struct ast_generator { 00046 void *(*alloc)(struct ast_channel *chan, void *params); 00047 void (*release)(struct ast_channel *chan, void *data); 00048 int (*generate)(struct ast_channel *chan, void *data, int len, int samples); 00049 }; 00050 00051 //! Main Channel structure associated with a channel. 00052 /*! 00053 * This is the side of it mostly used by the pbx and call management. 00054 */ 00055 struct ast_channel { 00056 /*! ASCII Description of channel name */ 00057 char name[AST_CHANNEL_NAME]; 00058 /*! Language requested */ 00059 char language[MAX_LANGUAGE]; 00060 /*! Type of channel */ 00061 char *type; 00062 /*! File descriptor for channel -- Drivers will poll on these file descriptors, so at least one must be non -1. */ 00063 int fds[AST_MAX_FDS]; 00064 00065 /*! Default music class */ 00066 char musicclass[MAX_LANGUAGE]; 00067 00068 /*! Current generator data if there is any */ 00069 void *generatordata; 00070 /*! Current active data generator */ 00071 struct ast_generator *generator; 00072 /*! Whether or not the generator should be interrupted by write */ 00073 int writeinterrupt; 00074 00075 /*! Who are we bridged to, if we're bridged */ 00076 struct ast_channel *bridge; 00077 /*! Who did we call? */ 00078 struct ast_channel *dialed; 00079 /*! Who called us? */ 00080 struct ast_channel *dialing; 00081 /*! Reverse the dialed link (0 false, 1 true) */ 00082 int reversedialed; 00083 /*! Channel that will masquerade as us */ 00084 struct ast_channel *masq; 00085 /*! Who we are masquerading as */ 00086 struct ast_channel *masqr; 00087 /*! Call Detail Record Flags */ 00088 int cdrflags; 00089 /*! Whether or not we're blocking */ 00090 int blocking; 00091 /*! Whether or not we have been hung up... Do not set this value 00092 directly, use ast_softhangup */ 00093 int _softhangup; 00094 /*! Non-zero if this is a zombie channel */ 00095 int zombie; 00096 /*! Non-zero, set to actual time when channel is to be hung up */ 00097 time_t whentohangup; 00098 /*! If anyone is blocking, this is them */ 00099 pthread_t blocker; 00100 /*! Lock, can be used to lock a channel for some operations */ 00101 ast_mutex_t lock; 00102 /*! Procedure causing blocking */ 00103 char *blockproc; 00104 00105 /*! Current application */ 00106 char *appl; 00107 /*! Data passed to current application */ 00108 char *data; 00109 00110 /*! Has an exception been detected */ 00111 int exception; 00112 /*! Which fd had an event detected on */ 00113 int fdno; 00114 /*! Schedule context */ 00115 struct sched_context *sched; 00116 /*! For streaming playback, the schedule ID */ 00117 int streamid; 00118 /*! Stream itself. */ 00119 struct ast_filestream *stream; 00120 /*! For streaming playback, the schedule ID */ 00121 int vstreamid; 00122 /*! Stream itself. */ 00123 struct ast_filestream *vstream; 00124 /*! Original writer format */ 00125 int oldwriteformat; 00126 00127 /*! Timing fd */ 00128 int timingfd; 00129 int (*timingfunc)(void *data); 00130 void *timingdata; 00131 00132 /*! State of line -- Don't write directly, use ast_setstate */ 00133 int _state; 00134 /*! Number of rings so far */ 00135 int rings; 00136 /*! Current level of application */ 00137 int stack; 00138 00139 00140 /*! Kinds of data this channel can natively handle */ 00141 int nativeformats; 00142 /*! Requested read format */ 00143 int readformat; 00144 /*! Requested write format */ 00145 int writeformat; 00146 00147 00148 /*! Malloc'd Dialed Number Identifier */ 00149 char *dnid; 00150 /*! Malloc'd Caller ID */ 00151 char *callerid; 00152 /*! Malloc'd ANI */ 00153 char *ani; 00154 /*! Malloc'd RDNIS */ 00155 char *rdnis; 00156 /*! Hide callerid from user */ 00157 int restrictcid; 00158 /*! Callerid presentation/screening */ 00159 int callingpres; 00160 00161 00162 /*! Current extension context */ 00163 char context[AST_MAX_EXTENSION]; 00164 /*! Current non-macro context */ 00165 char macrocontext[AST_MAX_EXTENSION]; 00166 /*! Current non-macro extension */ 00167 char macroexten[AST_MAX_EXTENSION]; 00168 /*! Current non-macro priority */ 00169 int macropriority; 00170 /*! Current extension number */ 00171 char exten[AST_MAX_EXTENSION]; 00172 /* Current extension priority */ 00173 int priority; 00174 /*! Application information -- see assigned numbers */ 00175 void *app[AST_CHANNEL_MAX_STACK]; 00176 /*! Any/all queued DTMF characters */ 00177 char dtmfq[AST_MAX_EXTENSION]; 00178 /*! Are DTMF digits being deferred */ 00179 int deferdtmf; 00180 /*! DTMF frame */ 00181 struct ast_frame dtmff; 00182 /*! Private channel implementation details */ 00183 struct ast_channel_pvt *pvt; 00184 00185 00186 /*! Jump buffer used for returning from applications */ 00187 jmp_buf jmp[AST_CHANNEL_MAX_STACK]; 00188 00189 struct ast_pbx *pbx; 00190 /*! Set BEFORE PBX is started to determine AMA flags */ 00191 int amaflags; 00192 /*! Account code for billing */ 00193 char accountcode[20]; 00194 /*! Call Detail Record */ 00195 struct ast_cdr *cdr; 00196 /*! Whether or not ADSI is detected on CPE */ 00197 int adsicpe; 00198 /*! Where to forward to if asked to dial on this interface */ 00199 char call_forward[AST_MAX_EXTENSION]; 00200 00201 /*! Tone zone */ 00202 struct tone_zone *zone; 00203 00204 /* Channel monitoring */ 00205 struct ast_channel_monitor *monitor; 00206 00207 /*! Track the read/written samples for monitor use */ 00208 unsigned long insmpl; 00209 unsigned long outsmpl; 00210 00211 /* Frames in/out counters */ 00212 unsigned int fin; 00213 unsigned int fout; 00214 00215 /* Unique Channel Identifier */ 00216 char uniqueid[32]; 00217 00218 /* Why is the channel hanged up */ 00219 int hangupcause; 00220 00221 /* A linked list for variables */ 00222 struct ast_var_t *vars; 00223 AST_LIST_HEAD(varshead,ast_var_t) varshead; 00224 00225 unsigned int callgroup; 00226 unsigned int pickupgroup; 00227 00228 /*! channel flags of AST_FLAG_ type */ 00229 int flag; 00230 00231 /*! For easy linking */ 00232 struct ast_channel *next; 00233 00234 }; 00235 00236 #define AST_FLAG_DIGITAL 1 /* if the call is a digital ISDN call */ 00237 00238 static inline int ast_test_flag(struct ast_channel *chan, int mode) 00239 { 00240 return chan->flag & mode; 00241 } 00242 00243 static inline void ast_set_flag(struct ast_channel *chan, int mode) 00244 { 00245 chan->flag |= mode; 00246 } 00247 00248 static inline void ast_clear_flag(struct ast_channel *chan, int mode) 00249 { 00250 chan->flag &= ~mode; 00251 } 00252 00253 static inline void ast_set2_flag(struct ast_channel *chan, int value, int mode) 00254 { 00255 if (value) 00256 ast_set_flag(chan, mode); 00257 else 00258 ast_clear_flag(chan, mode); 00259 } 00260 00261 static inline void ast_dup_flag(struct ast_channel *dstchan, struct ast_channel *srcchan, int mode) 00262 { 00263 if (ast_test_flag(srcchan, mode)) 00264 ast_set_flag(dstchan, mode); 00265 else 00266 ast_clear_flag(dstchan, mode); 00267 } 00268 00269 struct ast_bridge_config { 00270 int play_to_caller; 00271 int play_to_callee; 00272 int allowredirect_in; 00273 int allowredirect_out; 00274 int allowdisconnect; 00275 long timelimit; 00276 long play_warning; 00277 long warning_freq; 00278 char *warning_sound; 00279 char *end_sound; 00280 char *start_sound; 00281 }; 00282 00283 struct chanmon; 00284 00285 #define LOAD_OH(oh) { \ 00286 oh.context = context; \ 00287 oh.exten = exten; \ 00288 oh.priority = priority; \ 00289 oh.callerid = callerid; \ 00290 oh.variable = variable; \ 00291 oh.account = account; \ 00292 } 00293 00294 struct outgoing_helper { 00295 char *context; 00296 char *exten; 00297 int priority; 00298 char *callerid; 00299 char *variable; 00300 char *account; 00301 }; 00302 00303 #define AST_CDR_TRANSFER (1 << 0) 00304 #define AST_CDR_FORWARD (1 << 1) 00305 #define AST_CDR_CALLWAIT (1 << 2) 00306 #define AST_CDR_CONFERENCE (1 << 3) 00307 00308 #define AST_ADSI_UNKNOWN (0) 00309 #define AST_ADSI_AVAILABLE (1) 00310 #define AST_ADSI_UNAVAILABLE (2) 00311 #define AST_ADSI_OFFHOOKONLY (3) 00312 00313 #define AST_SOFTHANGUP_DEV (1 << 0) /* Soft hangup by device */ 00314 #define AST_SOFTHANGUP_ASYNCGOTO (1 << 1) /* Soft hangup for async goto */ 00315 #define AST_SOFTHANGUP_SHUTDOWN (1 << 2) 00316 #define AST_SOFTHANGUP_TIMEOUT (1 << 3) 00317 #define AST_SOFTHANGUP_APPUNLOAD (1 << 4) 00318 #define AST_SOFTHANGUP_EXPLICIT (1 << 5) 00319 00320 /* Bits 0-15 of state are reserved for the state (up/down) of the line */ 00321 /*! Channel is down and available */ 00322 #define AST_STATE_DOWN 0 00323 /*! Channel is down, but reserved */ 00324 #define AST_STATE_RESERVED 1 00325 /*! Channel is off hook */ 00326 #define AST_STATE_OFFHOOK 2 00327 /*! Digits (or equivalent) have been dialed */ 00328 #define AST_STATE_DIALING 3 00329 /*! Line is ringing */ 00330 #define AST_STATE_RING 4 00331 /*! Remote end is ringing */ 00332 #define AST_STATE_RINGING 5 00333 /*! Line is up */ 00334 #define AST_STATE_UP 6 00335 /*! Line is busy */ 00336 #define AST_STATE_BUSY 7 00337 /*! Digits (or equivalent) have been dialed while offhook */ 00338 #define AST_STATE_DIALING_OFFHOOK 8 00339 00340 /* Bits 16-32 of state are reserved for flags */ 00341 /*! Do not transmit voice data */ 00342 #define AST_STATE_MUTE (1 << 16) 00343 00344 /*! Device is valid but channel didn't know state */ 00345 #define AST_DEVICE_UNKNOWN 0 00346 /*! Device is not used */ 00347 #define AST_DEVICE_NOT_INUSE 1 00348 /*! Device is in use */ 00349 #define AST_DEVICE_INUSE 2 00350 /*! Device is busy */ 00351 #define AST_DEVICE_BUSY 3 00352 /*! Device is invalid */ 00353 #define AST_DEVICE_INVALID 4 00354 /*! Device is unavailable */ 00355 #define AST_DEVICE_UNAVAILABLE 5 00356 00357 //! Requests a channel 00358 /*! 00359 * \param type type of channel to request 00360 * \param format requested channel format 00361 * \param data data to pass to the channel requester 00362 * Request a channel of a given type, with data as optional information used 00363 * by the low level module 00364 * Returns an ast_channel on success, NULL on failure. 00365 */ 00366 struct ast_channel *ast_request(char *type, int format, void *data); 00367 00368 //! Search the Channels by Name 00369 /*! 00370 * \param device like a dialstring 00371 * Search the Device in active channels by compare the channelname against 00372 * the devicename. Compared are only the first chars to the first '-' char. 00373 * Returns an AST_DEVICE_UNKNOWN if no channel found or 00374 * AST_DEVICE_INUSE if a channel is found 00375 */ 00376 int ast_parse_device_state(char *device); 00377 00378 //! Asks a channel for device state 00379 /*! 00380 * \param device like a dialstring 00381 * Asks a channel for device state, data is normaly a number from dialstring 00382 * used by the low level module 00383 * Trys the channel devicestate callback if not supported search in the 00384 * active channels list for the device. 00385 * Returns an AST_DEVICE_??? state -1 on failure 00386 */ 00387 int ast_device_state(char *device); 00388 00389 /*! 00390 * \param type type of channel to request 00391 * \param format requested channel format 00392 * \param data data to pass to the channel requester 00393 * \param timeout maximum amount of time to wait for an answer 00394 * \param why unsuccessful (if unsuceessful) 00395 * Request a channel of a given type, with data as optional information used 00396 * by the low level module and attempt to place a call on it 00397 * Returns an ast_channel on success or no answer, NULL on failure. Check the value of chan->_state 00398 * to know if the call was answered or not. 00399 */ 00400 struct ast_channel *ast_request_and_dial(char *type, int format, void *data, int timeout, int *reason, char *callerid); 00401 00402 struct ast_channel *__ast_request_and_dial(char *type, int format, void *data, int timeout, int *reason, char *callerid, struct outgoing_helper *oh); 00403 00404 //! Registers a channel 00405 /*! 00406 * \param type type of channel you are registering 00407 * \param description short description of the channel 00408 * \param capabilities a bit mask of the capabilities of the channel 00409 * \param requester a function pointer that properly responds to a call. See one of the channel drivers for details. 00410 * Called by a channel module to register the kind of channels it supports. 00411 * It supplies a brief type, a longer, but still short description, and a 00412 * routine that creates a channel 00413 * Returns 0 on success, -1 on failure. 00414 */ 00415 int ast_channel_register(char *type, char *description, int capabilities, 00416 struct ast_channel* (*requester)(char *type, int format, void *data)); 00417 00418 /* Same like the upper function but with support for devicestate */ 00419 int ast_channel_register_ex(char *type, char *description, int capabilities, 00420 struct ast_channel *(*requester)(char *type, int format, void *data), 00421 int (*devicestate)(void *data)); 00422 00423 //! Unregister a channel class 00424 /* 00425 * \param type the character string that corresponds to the channel you wish to unregister 00426 * Basically just unregisters the channel with the asterisk channel system 00427 * No return value. 00428 */ 00429 void ast_channel_unregister(char *type); 00430 00431 //! Hang up a channel 00432 /*! 00433 * \param chan channel to hang up 00434 * This function performs a hard hangup on a channel. Unlike the soft-hangup, this function 00435 * performs all stream stopping, etc, on the channel that needs to end. 00436 * chan is no longer valid after this call. 00437 * Returns 0 on success, -1 on failure. 00438 */ 00439 int ast_hangup(struct ast_channel *chan); 00440 00441 //! Softly hangup up a channel 00442 /*! 00443 * \param chan channel to be soft-hung-up 00444 * Call the protocol layer, but don't destroy the channel structure (use this if you are trying to 00445 * safely hangup a channel managed by another thread. 00446 * Returns 0 regardless 00447 */ 00448 int ast_softhangup(struct ast_channel *chan, int cause); 00449 int ast_softhangup_nolock(struct ast_channel *chan, int cause); 00450 00451 //! Check to see if a channel is needing hang up 00452 /*! 00453 * \param chan channel on which to check for hang up 00454 * This function determines if the channel is being requested to be hung up. 00455 * Returns 0 if not, or 1 if hang up is requested (including time-out). 00456 */ 00457 int ast_check_hangup(struct ast_channel *chan); 00458 00459 //! Set when to hang a channel up 00460 /*! 00461 * \param chan channel on which to check for hang up 00462 * \param offset offset in seconds from current time of when to hang up 00463 * This function sets the absolute time out on a channel (when to hang up). 00464 */ 00465 void ast_channel_setwhentohangup(struct ast_channel *chan, time_t offset); 00466 00467 //! Answer a ringing call 00468 /*! 00469 * \param chan channel to answer 00470 * This function answers a channel and handles all necessary call 00471 * setup functions. 00472 * Returns 0 on success, -1 on failure 00473 */ 00474 int ast_answer(struct ast_channel *chan); 00475 00476 //! Make a call 00477 /*! 00478 * \param chan which channel to make the call on 00479 * \param addr destination of the call 00480 * \param timeout time to wait on for connect 00481 * Place a call, take no longer than timeout ms. Returns -1 on failure, 00482 0 on not enough time (does not auto matically stop ringing), and 00483 the number of seconds the connect took otherwise. 00484 Returns 0 on success, -1 on failure 00485 */ 00486 int ast_call(struct ast_channel *chan, char *addr, int timeout); 00487 00488 //! Indicates condition of channel 00489 /*! 00490 * \param chan channel to change the indication 00491 * \param condition which condition to indicate on the channel 00492 * Indicate a condition such as AST_CONTROL_BUSY, AST_CONTROL_RINGING, or AST_CONTROL_CONGESTION on a channel 00493 * Returns 0 on success, -1 on failure 00494 */ 00495 int ast_indicate(struct ast_channel *chan, int condition); 00496 00497 /* Misc stuff */ 00498 00499 //! Wait for input on a channel 00500 /*! 00501 * \param chan channel to wait on 00502 * \param ms length of time to wait on the channel 00503 * Wait for input on a channel for a given # of milliseconds (<0 for indefinite). 00504 Returns < 0 on failure, 0 if nothing ever arrived, and the # of ms remaining otherwise */ 00505 int ast_waitfor(struct ast_channel *chan, int ms); 00506 00507 //! Wait for a specied amount of time, looking for hangups 00508 /*! 00509 * \param chan channel to wait for 00510 * \param ms length of time in milliseconds to sleep 00511 * Waits for a specified amount of time, servicing the channel as required. 00512 * returns -1 on hangup, otherwise 0. 00513 */ 00514 int ast_safe_sleep(struct ast_channel *chan, int ms); 00515 00516 //! Wait for a specied amount of time, looking for hangups and a condition argument 00517 /*! 00518 * \param chan channel to wait for 00519 * \param ms length of time in milliseconds to sleep 00520 * \param cond a function pointer for testing continue condition 00521 * \param data argument to be passed to the condition test function 00522 * Waits for a specified amount of time, servicing the channel as required. If cond 00523 * returns 0, this function returns. 00524 * returns -1 on hangup, otherwise 0. 00525 */ 00526 int ast_safe_sleep_conditional(struct ast_channel *chan, int ms, int (*cond)(void*), void *data ); 00527 00528 //! Waits for activity on a group of channels 00529 /*! 00530 * \param chan an array of pointers to channels 00531 * \param n number of channels that are to be waited upon 00532 * \param fds an array of fds to wait upon 00533 * \param nfds the number of fds to wait upon 00534 * \param exception exception flag 00535 * \param outfd fd that had activity on it 00536 * \param ms how long the wait was 00537 * Big momma function here. Wait for activity on any of the n channels, or any of the nfds 00538 file descriptors. Returns the channel with activity, or NULL on error or if an FD 00539 came first. If the FD came first, it will be returned in outfd, otherwise, outfd 00540 will be -1 */ 00541 struct ast_channel *ast_waitfor_nandfds(struct ast_channel **chan, int n, int *fds, int nfds, int *exception, int *outfd, int *ms); 00542 00543 //! Waits for input on a group of channels 00544 /*! Wait for input on an array of channels for a given # of milliseconds. Return channel 00545 with activity, or NULL if none has activity. time "ms" is modified in-place, if applicable */ 00546 struct ast_channel *ast_waitfor_n(struct ast_channel **chan, int n, int *ms); 00547 00548 //! Waits for input on an fd 00549 /*! This version works on fd's only. Be careful with it. */ 00550 int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception); 00551 00552 00553 //! Reads a frame 00554 /*! 00555 * \param chan channel to read a frame from 00556 * Read a frame. Returns a frame, or NULL on error. If it returns NULL, you 00557 best just stop reading frames and assume the channel has been 00558 disconnected. */ 00559 struct ast_frame *ast_read(struct ast_channel *chan); 00560 00561 //! Write a frame to a channel 00562 /*! 00563 * \param chan destination channel of the frame 00564 * \param frame frame that will be written 00565 * This function writes the given frame to the indicated channel. 00566 * It returns 0 on success, -1 on failure. 00567 */ 00568 int ast_write(struct ast_channel *chan, struct ast_frame *frame); 00569 00570 //! Write video frame to a channel 00571 /*! 00572 * \param chan destination channel of the frame 00573 * \param frame frame that will be written 00574 * This function writes the given frame to the indicated channel. 00575 * It returns 1 on success, 0 if not implemented, and -1 on failure. 00576 */ 00577 int ast_write_video(struct ast_channel *chan, struct ast_frame *frame); 00578 00579 /* Send empty audio to prime a channel driver */ 00580 int ast_prod(struct ast_channel *chan); 00581 00582 //! Sets read format on channel chan 00583 /*! 00584 * \param chan channel to change 00585 * \param format format to change to 00586 * Set read format for channel to whichever component of "format" is best. 00587 * Returns 0 on success, -1 on failure 00588 */ 00589 int ast_set_read_format(struct ast_channel *chan, int format); 00590 00591 //! Sets write format on channel chan 00592 /*! 00593 * \param chan channel to change 00594 * \param format new format for writing 00595 * Set write format for channel to whichever compoent of "format" is best. 00596 * Returns 0 on success, -1 on failure 00597 */ 00598 int ast_set_write_format(struct ast_channel *chan, int format); 00599 00600 //! Sends text to a channel 00601 /*! 00602 * \param chan channel to act upon 00603 * \param text string of text to send on the channel 00604 * Write text to a display on a channel 00605 * Returns 0 on success, -1 on failure 00606 */ 00607 int ast_sendtext(struct ast_channel *chan, char *text); 00608 00609 //! Receives a text character from a channel 00610 /*! 00611 * \param chan channel to act upon 00612 * \param timeout timeout in milliseconds (0 for infinite wait) 00613 * Read a char of text from a channel 00614 * Returns 0 on success, -1 on failure 00615 */ 00616 00617 int ast_senddigit(struct ast_channel *chan, char digit); 00618 00619 int ast_recvchar(struct ast_channel *chan, int timeout); 00620 00621 //! Browse channels in use 00622 /*! 00623 * \param prev where you want to start in the channel list 00624 * Browse the channels currently in use 00625 * Returns the next channel in the list, NULL on end. 00626 * If it returns a channel, that channel *has been locked*! 00627 */ 00628 struct ast_channel *ast_channel_walk_locked(struct ast_channel *prev); 00629 00630 //! Get channel by name (locks channel) 00631 struct ast_channel *ast_get_channel_by_name_locked(char *channame); 00632 00633 //! Waits for a digit 00634 /*! 00635 * \param c channel to wait for a digit on 00636 * \param ms how many milliseconds to wait 00637 * Wait for a digit. Returns <0 on error, 0 on no entry, and the digit on success. */ 00638 char ast_waitfordigit(struct ast_channel *c, int ms); 00639 00640 /* Same as above with audio fd for outputing read audio and ctrlfd to monitor for 00641 reading. Returns 1 if ctrlfd becomes available */ 00642 char ast_waitfordigit_full(struct ast_channel *c, int ms, int audiofd, int ctrlfd); 00643 00644 //! Reads multiple digits 00645 /*! 00646 * \param c channel to read from 00647 * \param s string to read in to. Must be at least the size of your length 00648 * \param len how many digits to read (maximum) 00649 * \param timeout how long to timeout between digits 00650 * \param rtimeout timeout to wait on the first digit 00651 * \param enders digits to end the string 00652 * Read in a digit string "s", max length "len", maximum timeout between 00653 digits "timeout" (-1 for none), terminated by anything in "enders". Give them rtimeout 00654 for the first digit. Returns 0 on normal return, or 1 on a timeout. In the case of 00655 a timeout, any digits that were read before the timeout will still be available in s. 00656 RETURNS 2 in full version when ctrlfd is available, NOT 1*/ 00657 int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders); 00658 int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders, int audiofd, int ctrlfd); 00659 00660 /*! Report DTMF on channel 0 */ 00661 #define AST_BRIDGE_DTMF_CHANNEL_0 (1 << 0) 00662 /*! Report DTMF on channel 1 */ 00663 #define AST_BRIDGE_DTMF_CHANNEL_1 (1 << 1) 00664 /*! Return all voice frames on channel 0 */ 00665 #define AST_BRIDGE_REC_CHANNEL_0 (1 << 2) 00666 /*! Return all voice frames on channel 1 */ 00667 #define AST_BRIDGE_REC_CHANNEL_1 (1 << 3) 00668 /*! Ignore all signal frames except NULL */ 00669 #define AST_BRIDGE_IGNORE_SIGS (1 << 4) 00670 00671 00672 //! Makes two channel formats compatible 00673 /*! 00674 * \param c0 first channel to make compatible 00675 * \param c1 other channel to make compatible 00676 * Set two channels to compatible formats -- call before ast_channel_bridge in general . Returns 0 on success 00677 and -1 if it could not be done */ 00678 int ast_channel_make_compatible(struct ast_channel *c0, struct ast_channel *c1); 00679 00680 //! Bridge two channels together 00681 /*! 00682 * \param c0 first channel to bridge 00683 * \param c1 second channel to bridge 00684 * \param flags for the channels 00685 * \param fo destination frame(?) 00686 * \param rc destination channel(?) 00687 * Bridge two channels (c0 and c1) together. If an important frame occurs, we return that frame in 00688 *rf (remember, it could be NULL) and which channel (0 or 1) in rc */ 00689 //int ast_channel_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc); 00690 int ast_channel_bridge(struct ast_channel *c0,struct ast_channel *c1,struct ast_bridge_config *config, struct ast_frame **fo, struct ast_channel **rc); 00691 00692 //! Weird function made for call transfers 00693 /*! 00694 * \param original channel to make a copy of 00695 * \param clone copy of the original channel 00696 * This is a very strange and freaky function used primarily for transfer. Suppose that 00697 "original" and "clone" are two channels in random situations. This function takes 00698 the guts out of "clone" and puts them into the "original" channel, then alerts the 00699 channel driver of the change, asking it to fixup any private information (like the 00700 p->owner pointer) that is affected by the change. The physical layer of the original 00701 channel is hung up. */ 00702 int ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clone); 00703 00704 //! Gives the string form of a given state 00705 /*! 00706 * \param state state to get the name of 00707 * Give a name to a state 00708 * Pretty self explanatory. 00709 * Returns the text form of the binary state given 00710 */ 00711 char *ast_state2str(int state); 00712 00713 /* Options: Some low-level drivers may implement "options" allowing fine tuning of the 00714 low level channel. See frame.h for options. Note that many channel drivers may support 00715 none or a subset of those features, and you should not count on this if you want your 00716 asterisk application to be portable. They're mainly useful for tweaking performance */ 00717 00718 //! Sets an option on a channel 00719 /*! 00720 * \param channel channel to set options on 00721 * \param option option to change 00722 * \param data data specific to option 00723 * \param datalen length of the data 00724 * \param block blocking or not 00725 * Set an option on a channel (see frame.h), optionally blocking awaiting the reply 00726 * Returns 0 on success and -1 on failure 00727 */ 00728 int ast_channel_setoption(struct ast_channel *channel, int option, void *data, int datalen, int block); 00729 00730 //! Checks the value of an option 00731 /*! 00732 * Query the value of an option, optionally blocking until a reply is received 00733 * Works similarly to setoption except only reads the options. 00734 */ 00735 struct ast_frame *ast_channel_queryoption(struct ast_channel *channel, int option, void *data, int *datalen, int block); 00736 00737 //! Checks for HTML support on a channel 00738 /*! Returns 0 if channel does not support HTML or non-zero if it does */ 00739 int ast_channel_supports_html(struct ast_channel *channel); 00740 00741 //! Sends HTML on given channel 00742 /*! Send HTML or URL on link. Returns 0 on success or -1 on failure */ 00743 int ast_channel_sendhtml(struct ast_channel *channel, int subclass, char *data, int datalen); 00744 00745 //! Sends a URL on a given link 00746 /*! Send URL on link. Returns 0 on success or -1 on failure */ 00747 int ast_channel_sendurl(struct ast_channel *channel, char *url); 00748 00749 //! Defers DTMF 00750 /*! Defer DTMF so that you only read things like hangups and audio. Returns 00751 non-zero if channel was already DTMF-deferred or 0 if channel is just now 00752 being DTMF-deferred */ 00753 int ast_channel_defer_dtmf(struct ast_channel *chan); 00754 00755 //! Undeos a defer 00756 /*! Undo defer. ast_read will return any dtmf characters that were queued */ 00757 void ast_channel_undefer_dtmf(struct ast_channel *chan); 00758 00759 /*! Initiate system shutdown -- prevents new channels from being allocated. 00760 If "hangup" is non-zero, all existing channels will receive soft 00761 hangups */ 00762 void ast_begin_shutdown(int hangup); 00763 00764 /*! Cancels an existing shutdown and returns to normal operation */ 00765 void ast_cancel_shutdown(void); 00766 00767 /*! Returns number of active/allocated channels */ 00768 int ast_active_channels(void); 00769 00770 /*! Returns non-zero if Asterisk is being shut down */ 00771 int ast_shutting_down(void); 00772 00773 /*! Activate a given generator */ 00774 int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params); 00775 00776 /*! Deactive an active generator */ 00777 void ast_deactivate_generator(struct ast_channel *chan); 00778 00779 void ast_set_callerid(struct ast_channel *chan, char *callerid, int anitoo); 00780 00781 /*! Start a tone going */ 00782 int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int duration, int vol); 00783 /*! Stop a tone from playing */ 00784 void ast_tonepair_stop(struct ast_channel *chan); 00785 /*! Play a tone pair for a given amount of time */ 00786 int ast_tonepair(struct ast_channel *chan, int freq1, int freq2, int duration, int vol); 00787 00788 /*! Automatically service a channel for us... */ 00789 int ast_autoservice_start(struct ast_channel *chan); 00790 00791 /*! Stop servicing a channel for us... Returns -1 on error or if channel has been hungup */ 00792 int ast_autoservice_stop(struct ast_channel *chan); 00793 00794 /* If built with zaptel optimizations, force a scheduled expiration on the 00795 timer fd, at which point we call the callback function / data */ 00796 int ast_settimeout(struct ast_channel *c, int samples, int (*func)(void *data), void *data); 00797 00798 /* Transfer a channel (if supported). Returns -1 on error, 0 if not supported 00799 and 1 if supported and requested */ 00800 int ast_transfer(struct ast_channel *chan, char *dest); 00801 00802 int ast_do_masquerade(struct ast_channel *chan); 00803 00804 /* Misc. functions below */ 00805 00806 /* Helper function for migrating select to poll */ 00807 static inline int ast_fdisset(struct pollfd *pfds, int fd, int max, int *start) 00808 { 00809 int x; 00810 for (x=start ? *start : 0;x<max;x++) 00811 if (pfds[x].fd == fd) { 00812 if (start) { 00813 if (x==*start) 00814 (*start)++; 00815 } 00816 return pfds[x].revents; 00817 } 00818 return 0; 00819 } 00820 00821 //! Waits for activity on a group of channels 00822 /*! 00823 * \param nfds the maximum number of file descriptors in the sets 00824 * \param rfds file descriptors to check for read availability 00825 * \param wfds file descriptors to check for write availability 00826 * \param efds file descriptors to check for exceptions (OOB data) 00827 * \param tvp timeout while waiting for events 00828 * This is the same as a standard select(), except it guarantees the 00829 * behaviour where the passed struct timeval is updated with how much 00830 * time was not slept while waiting for the specified events 00831 */ 00832 static inline int ast_select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tvp) 00833 { 00834 #ifdef __linux__ 00835 return select(nfds, rfds, wfds, efds, tvp); 00836 #else 00837 if (tvp) { 00838 struct timeval tv, tvstart, tvend, tvlen; 00839 int res; 00840 00841 tv = *tvp; 00842 gettimeofday(&tvstart, NULL); 00843 res = select(nfds, rfds, wfds, efds, tvp); 00844 gettimeofday(&tvend, NULL); 00845 timersub(&tvend, &tvstart, &tvlen); 00846 timersub(&tv, &tvlen, tvp); 00847 if (tvp->tv_sec < 0 || (tvp->tv_sec == 0 && tvp->tv_usec < 0)) { 00848 tvp->tv_sec = 0; 00849 tvp->tv_usec = 0; 00850 } 00851 return res; 00852 } 00853 else 00854 return select(nfds, rfds, wfds, efds, NULL); 00855 #endif 00856 } 00857 00858 #if !defined(ast_strdupa) && defined(__GNUC__) 00859 # define ast_strdupa(s) \ 00860 (__extension__ \ 00861 ({ \ 00862 __const char *__old = (s); \ 00863 size_t __len = strlen (__old) + 1; \ 00864 char *__new = (char *) __builtin_alloca (__len); \ 00865 (char *) memcpy (__new, __old, __len); \ 00866 })) 00867 #endif 00868 00869 #ifdef DO_CRASH 00870 #define CRASH do { fprintf(stderr, "!! Forcing immediate crash a-la abort !!\n"); *((int *)0) = 0; } while(0) 00871 #else 00872 #define CRASH do { } while(0) 00873 #endif 00874 00875 #define CHECK_BLOCKING(c) { \ 00876 if ((c)->blocking) {\ 00877 ast_log(LOG_WARNING, "Thread %ld Blocking '%s', already blocked by thread %ld in procedure %s\n", (long) pthread_self(), (c)->name, (long) (c)->blocker, (c)->blockproc); \ 00878 CRASH; \ 00879 } else { \ 00880 (c)->blocker = pthread_self(); \ 00881 (c)->blockproc = __PRETTY_FUNCTION__; \ 00882 c->blocking = -1; \ 00883 } } 00884 00885 extern unsigned int ast_get_group(char *s); 00886 00887 #if defined(__cplusplus) || defined(c_plusplus) 00888 } 00889 #endif 00890 00891 00892 #endif