2 * Asterisk -- An open source telephony toolkit.
4 * Copyright (C) 1999 - 2006, Digium, Inc.
6 * Mark Spencer <markster@digium.com>
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
21 * \brief Channel Management
23 * \author Mark Spencer <markster@digium.com>
28 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
35 #include "asterisk/zapata.h"
37 #include "asterisk/pbx.h"
38 #include "asterisk/frame.h"
39 #include "asterisk/sched.h"
40 #include "asterisk/options.h"
41 #include "asterisk/channel.h"
42 #include "asterisk/musiconhold.h"
43 #include "asterisk/logger.h"
44 #include "asterisk/say.h"
45 #include "asterisk/file.h"
46 #include "asterisk/cli.h"
47 #include "asterisk/translate.h"
48 #include "asterisk/manager.h"
49 #include "asterisk/chanvars.h"
50 #include "asterisk/linkedlists.h"
51 #include "asterisk/indications.h"
52 #include "asterisk/monitor.h"
53 #include "asterisk/causes.h"
54 #include "asterisk/callerid.h"
55 #include "asterisk/utils.h"
56 #include "asterisk/lock.h"
57 #include "asterisk/app.h"
58 #include "asterisk/transcap.h"
59 #include "asterisk/devicestate.h"
60 #include "asterisk/sha1.h"
61 #include "asterisk/threadstorage.h"
62 #include "asterisk/slinfactory.h"
63 #include "asterisk/audiohook.h"
66 #include <sys/epoll.h>
69 struct ast_epoll_data {
70 struct ast_channel *chan;
74 /* uncomment if you have problems with 'monitoring' synchronized files */
76 #define MONITOR_CONSTANT_DELAY
77 #define MONITOR_DELAY 150 * 8 /*!< 150 ms of MONITORING DELAY */
80 /*! \brief Prevent new channel allocation if shutting down. */
81 static int shutting_down;
85 unsigned long global_fin, global_fout;
87 AST_THREADSTORAGE(state2str_threadbuf);
88 #define STATE2STR_BUFSIZE 32
90 /*! Default amount of time to use when emulating a digit as a begin and end
92 #define AST_DEFAULT_EMULATE_DTMF_DURATION 100
94 /*! Minimum allowed digit length - 80ms */
95 #define AST_MIN_DTMF_DURATION 80
97 /*! Minimum amount of time between the end of the last digit and the beginning
98 * of a new one - 45ms */
99 #define AST_MIN_DTMF_GAP 45
101 /*! \brief List of channel drivers */
103 const struct ast_channel_tech *tech;
104 AST_LIST_ENTRY(chanlist) list;
107 /*! \brief the list of registered channel types */
108 static AST_LIST_HEAD_NOLOCK_STATIC(backends, chanlist);
110 /*! \brief the list of channels we have. Note that the lock for this list is used for
111 both the channels list and the backends list. */
112 static AST_RWLIST_HEAD_STATIC(channels, ast_channel);
114 /*! \brief map AST_CAUSE's to readable string representations
118 const struct ast_cause {
123 { AST_CAUSE_UNALLOCATED, "UNALLOCATED", "Unallocated (unassigned) number" },
124 { AST_CAUSE_NO_ROUTE_TRANSIT_NET, "NO_ROUTE_TRANSIT_NET", "No route to specified transmit network" },
125 { AST_CAUSE_NO_ROUTE_DESTINATION, "NO_ROUTE_DESTINATION", "No route to destination" },
126 { AST_CAUSE_CHANNEL_UNACCEPTABLE, "CHANNEL_UNACCEPTABLE", "Channel unacceptable" },
127 { AST_CAUSE_CALL_AWARDED_DELIVERED, "CALL_AWARDED_DELIVERED", "Call awarded and being delivered in an established channel" },
128 { AST_CAUSE_NORMAL_CLEARING, "NORMAL_CLEARING", "Normal Clearing" },
129 { AST_CAUSE_USER_BUSY, "USER_BUSY", "User busy" },
130 { AST_CAUSE_NO_USER_RESPONSE, "NO_USER_RESPONSE", "No user responding" },
131 { AST_CAUSE_NO_ANSWER, "NO_ANSWER", "User alerting, no answer" },
132 { AST_CAUSE_CALL_REJECTED, "CALL_REJECTED", "Call Rejected" },
133 { AST_CAUSE_NUMBER_CHANGED, "NUMBER_CHANGED", "Number changed" },
134 { AST_CAUSE_DESTINATION_OUT_OF_ORDER, "DESTINATION_OUT_OF_ORDER", "Destination out of order" },
135 { AST_CAUSE_INVALID_NUMBER_FORMAT, "INVALID_NUMBER_FORMAT", "Invalid number format" },
136 { AST_CAUSE_FACILITY_REJECTED, "FACILITY_REJECTED", "Facility rejected" },
137 { AST_CAUSE_RESPONSE_TO_STATUS_ENQUIRY, "RESPONSE_TO_STATUS_ENQUIRY", "Response to STATus ENQuiry" },
138 { AST_CAUSE_NORMAL_UNSPECIFIED, "NORMAL_UNSPECIFIED", "Normal, unspecified" },
139 { AST_CAUSE_NORMAL_CIRCUIT_CONGESTION, "NORMAL_CIRCUIT_CONGESTION", "Circuit/channel congestion" },
140 { AST_CAUSE_NETWORK_OUT_OF_ORDER, "NETWORK_OUT_OF_ORDER", "Network out of order" },
141 { AST_CAUSE_NORMAL_TEMPORARY_FAILURE, "NORMAL_TEMPORARY_FAILURE", "Temporary failure" },
142 { AST_CAUSE_SWITCH_CONGESTION, "SWITCH_CONGESTION", "Switching equipment congestion" },
143 { AST_CAUSE_ACCESS_INFO_DISCARDED, "ACCESS_INFO_DISCARDED", "Access information discarded" },
144 { AST_CAUSE_REQUESTED_CHAN_UNAVAIL, "REQUESTED_CHAN_UNAVAIL", "Requested channel not available" },
145 { AST_CAUSE_PRE_EMPTED, "PRE_EMPTED", "Pre-empted" },
146 { AST_CAUSE_FACILITY_NOT_SUBSCRIBED, "FACILITY_NOT_SUBSCRIBED", "Facility not subscribed" },
147 { AST_CAUSE_OUTGOING_CALL_BARRED, "OUTGOING_CALL_BARRED", "Outgoing call barred" },
148 { AST_CAUSE_INCOMING_CALL_BARRED, "INCOMING_CALL_BARRED", "Incoming call barred" },
149 { AST_CAUSE_BEARERCAPABILITY_NOTAUTH, "BEARERCAPABILITY_NOTAUTH", "Bearer capability not authorized" },
150 { AST_CAUSE_BEARERCAPABILITY_NOTAVAIL, "BEARERCAPABILITY_NOTAVAIL", "Bearer capability not available" },
151 { AST_CAUSE_BEARERCAPABILITY_NOTIMPL, "BEARERCAPABILITY_NOTIMPL", "Bearer capability not implemented" },
152 { AST_CAUSE_CHAN_NOT_IMPLEMENTED, "CHAN_NOT_IMPLEMENTED", "Channel not implemented" },
153 { AST_CAUSE_FACILITY_NOT_IMPLEMENTED, "FACILITY_NOT_IMPLEMENTED", "Facility not implemented" },
154 { AST_CAUSE_INVALID_CALL_REFERENCE, "INVALID_CALL_REFERENCE", "Invalid call reference value" },
155 { AST_CAUSE_INCOMPATIBLE_DESTINATION, "INCOMPATIBLE_DESTINATION", "Incompatible destination" },
156 { AST_CAUSE_INVALID_MSG_UNSPECIFIED, "INVALID_MSG_UNSPECIFIED", "Invalid message unspecified" },
157 { AST_CAUSE_MANDATORY_IE_MISSING, "MANDATORY_IE_MISSING", "Mandatory information element is missing" },
158 { AST_CAUSE_MESSAGE_TYPE_NONEXIST, "MESSAGE_TYPE_NONEXIST", "Message type nonexist." },
159 { AST_CAUSE_WRONG_MESSAGE, "WRONG_MESSAGE", "Wrong message" },
160 { AST_CAUSE_IE_NONEXIST, "IE_NONEXIST", "Info. element nonexist or not implemented" },
161 { AST_CAUSE_INVALID_IE_CONTENTS, "INVALID_IE_CONTENTS", "Invalid information element contents" },
162 { AST_CAUSE_WRONG_CALL_STATE, "WRONG_CALL_STATE", "Message not compatible with call state" },
163 { AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE, "RECOVERY_ON_TIMER_EXPIRE", "Recover on timer expiry" },
164 { AST_CAUSE_MANDATORY_IE_LENGTH_ERROR, "MANDATORY_IE_LENGTH_ERROR", "Mandatory IE length error" },
165 { AST_CAUSE_PROTOCOL_ERROR, "PROTOCOL_ERROR", "Protocol error, unspecified" },
166 { AST_CAUSE_INTERWORKING, "INTERWORKING", "Interworking, unspecified" },
169 struct ast_variable *ast_channeltype_list(void)
172 struct ast_variable *var=NULL, *prev = NULL;
173 AST_LIST_TRAVERSE(&backends, cl, list) {
175 if ((prev->next = ast_variable_new(cl->tech->type, cl->tech->description, "")))
178 var = ast_variable_new(cl->tech->type, cl->tech->description, "");
185 /*! \brief Show channel types - CLI command */
186 static char *handle_cli_core_show_channeltypes(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
188 #define FORMAT "%-10.10s %-40.40s %-12.12s %-12.12s %-12.12s\n"
194 e->command = "core show channeltypes";
196 "Usage: core show channeltypes\n"
197 " Lists available channel types registered in your\n"
198 " Asterisk server.\n";
205 return CLI_SHOWUSAGE;
207 ast_cli(a->fd, FORMAT, "Type", "Description", "Devicestate", "Indications", "Transfer");
208 ast_cli(a->fd, FORMAT, "----------", "-----------", "-----------", "-----------", "--------");
209 if (AST_RWLIST_RDLOCK(&channels)) {
210 ast_log(LOG_WARNING, "Unable to lock channel list\n");
213 AST_LIST_TRAVERSE(&backends, cl, list) {
214 ast_cli(a->fd, FORMAT, cl->tech->type, cl->tech->description,
215 (cl->tech->devicestate) ? "yes" : "no",
216 (cl->tech->indicate) ? "yes" : "no",
217 (cl->tech->transfer) ? "yes" : "no");
220 AST_RWLIST_UNLOCK(&channels);
221 ast_cli(a->fd, "----------\n%d channel drivers registered.\n", count_chan);
227 static char *complete_channeltypes(struct ast_cli_args *a)
237 wordlen = strlen(a->word);
239 AST_LIST_TRAVERSE(&backends, cl, list) {
240 if (!strncasecmp(a->word, cl->tech->type, wordlen) && ++which > a->n) {
241 ret = ast_strdup(cl->tech->type);
249 /*! \brief Show details about a channel driver - CLI command */
250 static char *handle_cli_core_show_channeltype(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
252 struct chanlist *cl = NULL;
256 e->command = "core show channeltype";
258 "Usage: core show channeltype <name>\n"
259 " Show details about the specified channel type, <name>.\n";
262 return complete_channeltypes(a);
266 return CLI_SHOWUSAGE;
268 if (AST_RWLIST_RDLOCK(&channels)) {
269 ast_log(LOG_WARNING, "Unable to lock channel list\n");
273 AST_LIST_TRAVERSE(&backends, cl, list) {
274 if (!strncasecmp(cl->tech->type, a->argv[3], strlen(cl->tech->type)))
280 ast_cli(a->fd, "\n%s is not a registered channel driver.\n", a->argv[3]);
281 AST_RWLIST_UNLOCK(&channels);
286 "-- Info about channel driver: %s --\n"
287 " Device State: %s\n"
290 " Capabilities: %d\n"
294 " Image Support: %s\n"
295 " Text Support: %s\n",
297 (cl->tech->devicestate) ? "yes" : "no",
298 (cl->tech->indicate) ? "yes" : "no",
299 (cl->tech->transfer) ? "yes" : "no",
300 (cl->tech->capabilities) ? cl->tech->capabilities : -1,
301 (cl->tech->send_digit_begin) ? "yes" : "no",
302 (cl->tech->send_digit_end) ? "yes" : "no",
303 (cl->tech->send_html) ? "yes" : "no",
304 (cl->tech->send_image) ? "yes" : "no",
305 (cl->tech->send_text) ? "yes" : "no"
309 AST_RWLIST_UNLOCK(&channels);
313 static struct ast_cli_entry cli_channel[] = {
314 AST_CLI_DEFINE(handle_cli_core_show_channeltypes, "List available channel types"),
315 AST_CLI_DEFINE(handle_cli_core_show_channeltype, "Give more details on that channel type")
318 /*! \brief Checks to see if a channel is needing hang up */
319 int ast_check_hangup(struct ast_channel *chan)
321 if (chan->_softhangup) /* yes if soft hangup flag set */
323 if (!chan->tech_pvt) /* yes if no technology private data */
325 if (!chan->whentohangup) /* no if no hangup scheduled */
327 if (chan->whentohangup > time(NULL)) /* no if hangup time has not come yet. */
329 chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT; /* record event */
333 static int ast_check_hangup_locked(struct ast_channel *chan)
336 ast_channel_lock(chan);
337 res = ast_check_hangup(chan);
338 ast_channel_unlock(chan);
342 /*! \brief Initiate system shutdown */
343 void ast_begin_shutdown(int hangup)
345 struct ast_channel *c;
348 AST_RWLIST_RDLOCK(&channels);
349 AST_RWLIST_TRAVERSE(&channels, c, chan_list)
350 ast_softhangup(c, AST_SOFTHANGUP_SHUTDOWN);
351 AST_RWLIST_UNLOCK(&channels);
355 /*! \brief returns number of active/allocated channels */
356 int ast_active_channels(void)
358 struct ast_channel *c;
360 AST_RWLIST_RDLOCK(&channels);
361 AST_RWLIST_TRAVERSE(&channels, c, chan_list)
363 AST_RWLIST_UNLOCK(&channels);
367 /*! \brief Cancel a shutdown in progress */
368 void ast_cancel_shutdown(void)
373 /*! \brief Returns non-zero if Asterisk is being shut down */
374 int ast_shutting_down(void)
376 return shutting_down;
379 /*! \brief Set when to hangup channel */
380 void ast_channel_setwhentohangup(struct ast_channel *chan, time_t offset)
382 chan->whentohangup = offset ? time(NULL) + offset : 0;
383 ast_queue_frame(chan, &ast_null_frame);
387 /*! \brief Compare a offset with when to hangup channel */
388 int ast_channel_cmpwhentohangup(struct ast_channel *chan, time_t offset)
392 if (!chan->whentohangup)
393 return (offset == 0) ? 0 : -1;
395 if (!offset) /* XXX why is this special? */
398 whentohangup = offset + time(NULL);
400 if (chan->whentohangup < whentohangup)
402 else if (chan->whentohangup == whentohangup)
408 /*! \brief Register a new telephony channel in Asterisk */
409 int ast_channel_register(const struct ast_channel_tech *tech)
411 struct chanlist *chan;
413 AST_RWLIST_WRLOCK(&channels);
415 AST_LIST_TRAVERSE(&backends, chan, list) {
416 if (!strcasecmp(tech->type, chan->tech->type)) {
417 ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", tech->type);
418 AST_RWLIST_UNLOCK(&channels);
423 if (!(chan = ast_calloc(1, sizeof(*chan)))) {
424 AST_RWLIST_UNLOCK(&channels);
428 AST_LIST_INSERT_HEAD(&backends, chan, list);
430 ast_debug(1, "Registered handler for '%s' (%s)\n", chan->tech->type, chan->tech->description);
432 ast_verb(2, "Registered channel type '%s' (%s)\n", chan->tech->type, chan->tech->description);
434 AST_RWLIST_UNLOCK(&channels);
438 /*! \brief Unregister channel driver */
439 void ast_channel_unregister(const struct ast_channel_tech *tech)
441 struct chanlist *chan;
443 ast_debug(1, "Unregistering channel type '%s'\n", tech->type);
445 AST_RWLIST_WRLOCK(&channels);
447 AST_LIST_TRAVERSE_SAFE_BEGIN(&backends, chan, list) {
448 if (chan->tech == tech) {
449 AST_LIST_REMOVE_CURRENT(list);
451 ast_verb(2, "Unregistered channel type '%s'\n", tech->type);
455 AST_LIST_TRAVERSE_SAFE_END;
457 AST_RWLIST_UNLOCK(&channels);
460 /*! \brief Get handle to channel driver based on name */
461 const struct ast_channel_tech *ast_get_channel_tech(const char *name)
463 struct chanlist *chanls;
464 const struct ast_channel_tech *ret = NULL;
466 if (AST_RWLIST_RDLOCK(&channels)) {
467 ast_log(LOG_WARNING, "Unable to lock channel tech list\n");
471 AST_LIST_TRAVERSE(&backends, chanls, list) {
472 if (!strcasecmp(name, chanls->tech->type)) {
478 AST_RWLIST_UNLOCK(&channels);
483 /*! \brief Gives the string form of a given hangup cause */
484 const char *ast_cause2str(int cause)
488 for (x=0; x < sizeof(causes) / sizeof(causes[0]); x++) {
489 if (causes[x].cause == cause)
490 return causes[x].desc;
496 /*! \brief Convert a symbolic hangup cause to number */
497 int ast_str2cause(const char *name)
501 for (x = 0; x < sizeof(causes) / sizeof(causes[0]); x++)
502 if (strncasecmp(causes[x].name, name, strlen(causes[x].name)) == 0)
503 return causes[x].cause;
508 /*! \brief Gives the string form of a given channel state.
509 \note This function is not reentrant.
511 const char *ast_state2str(enum ast_channel_state state)
518 case AST_STATE_RESERVED:
520 case AST_STATE_OFFHOOK:
522 case AST_STATE_DIALING:
526 case AST_STATE_RINGING:
532 case AST_STATE_DIALING_OFFHOOK:
533 return "Dialing Offhook";
534 case AST_STATE_PRERING:
537 if (!(buf = ast_threadstorage_get(&state2str_threadbuf, STATE2STR_BUFSIZE)))
539 snprintf(buf, STATE2STR_BUFSIZE, "Unknown (%d)", state);
544 /*! \brief Gives the string form of a given transfer capability */
545 char *ast_transfercapability2str(int transfercapability)
547 switch (transfercapability) {
548 case AST_TRANS_CAP_SPEECH:
550 case AST_TRANS_CAP_DIGITAL:
552 case AST_TRANS_CAP_RESTRICTED_DIGITAL:
553 return "RESTRICTED_DIGITAL";
554 case AST_TRANS_CAP_3_1K_AUDIO:
556 case AST_TRANS_CAP_DIGITAL_W_TONES:
557 return "DIGITAL_W_TONES";
558 case AST_TRANS_CAP_VIDEO:
565 /*! \brief Pick the best audio codec */
566 int ast_best_codec(int fmts)
568 /* This just our opinion, expressed in code. We are asked to choose
569 the best codec to use, given no information */
571 static const int prefs[] =
573 /*! Okay, ulaw is used by all telephony equipment, so start with it */
575 /*! Unless of course, you're a silly European, so then prefer ALAW */
577 /*! G.722 is better then all below, but not as common as the above... so give ulaw and alaw priority */
579 /*! Okay, well, signed linear is easy to translate into other stuff */
581 /*! G.726 is standard ADPCM, in RFC3551 packing order */
583 /*! G.726 is standard ADPCM, in AAL2 packing order */
584 AST_FORMAT_G726_AAL2,
585 /*! ADPCM has great sound quality and is still pretty easy to translate */
587 /*! Okay, we're down to vocoders now, so pick GSM because it's small and easier to
588 translate and sounds pretty good */
590 /*! iLBC is not too bad */
592 /*! Speex is free, but computationally more expensive than GSM */
594 /*! Ick, LPC10 sounds terrible, but at least we have code for it, if you're tacky enough
597 /*! G.729a is faster than 723 and slightly less expensive */
599 /*! Down to G.723.1 which is proprietary but at least designed for voice */
603 /* Strip out video */
604 fmts &= AST_FORMAT_AUDIO_MASK;
606 /* Find the first preferred codec in the format given */
607 for (x=0; x < (sizeof(prefs) / sizeof(prefs[0]) ); x++)
610 ast_log(LOG_WARNING, "Don't know any of 0x%x formats\n", fmts);
614 static const struct ast_channel_tech null_tech = {
616 .description = "Null channel (should not see this)",
619 /*! \brief Create a new channel structure */
620 struct ast_channel *ast_channel_alloc(int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const int amaflag, const char *name_fmt, ...)
622 struct ast_channel *tmp;
625 struct varshead *headp;
628 /* If shutting down, don't allocate any new channels */
630 ast_log(LOG_WARNING, "Channel allocation failed: Refusing due to active shutdown\n");
634 if (!(tmp = ast_calloc(1, sizeof(*tmp))))
637 if (!(tmp->sched = sched_context_create())) {
638 ast_log(LOG_WARNING, "Channel allocation failed: Unable to create schedule context\n");
643 if ((ast_string_field_init(tmp, 128))) {
644 sched_context_destroy(tmp->sched);
650 tmp->epfd = epoll_create(25);
653 for (x = 0; x < AST_MAX_FDS; x++) {
656 tmp->epfd_data[x] = NULL;
661 tmp->timingfd = open("/dev/zap/timer", O_RDWR);
662 if (tmp->timingfd > -1) {
663 /* Check if timing interface supports new
666 if (!ioctl(tmp->timingfd, ZT_TIMERPONG, &flags))
674 if (pipe(tmp->alertpipe)) {
675 ast_log(LOG_WARNING, "Channel allocation failed: Can't create alert pipe!\n");
676 ast_string_field_free_memory(tmp);
680 flags = fcntl(tmp->alertpipe[0], F_GETFL);
681 fcntl(tmp->alertpipe[0], F_SETFL, flags | O_NONBLOCK);
682 flags = fcntl(tmp->alertpipe[1], F_GETFL);
683 fcntl(tmp->alertpipe[1], F_SETFL, flags | O_NONBLOCK);
685 } else /* Make sure we've got it done right if they don't */
686 tmp->alertpipe[0] = tmp->alertpipe[1] = -1;
688 /* Always watch the alertpipe */
689 ast_channel_set_fd(tmp, AST_ALERT_FD, tmp->alertpipe[0]);
690 /* And timing pipe */
691 ast_channel_set_fd(tmp, AST_TIMING_FD, tmp->timingfd);
692 ast_string_field_set(tmp, name, "**Unknown**");
699 tmp->fin = global_fin;
700 tmp->fout = global_fout;
702 if (ast_strlen_zero(ast_config_AST_SYSTEM_NAME)) {
703 ast_string_field_build(tmp, uniqueid, "%li.%d", (long) time(NULL),
704 ast_atomic_fetchadd_int(&uniqueint, 1));
706 ast_string_field_build(tmp, uniqueid, "%s-%li.%d", ast_config_AST_SYSTEM_NAME,
707 (long) time(NULL), ast_atomic_fetchadd_int(&uniqueint, 1));
710 tmp->cid.cid_name = ast_strdup(cid_name);
711 tmp->cid.cid_num = ast_strdup(cid_num);
713 if (!ast_strlen_zero(name_fmt)) {
714 /* Almost every channel is calling this function, and setting the name via the ast_string_field_build() call.
715 * And they all use slightly different formats for their name string.
716 * This means, to set the name here, we have to accept variable args, and call the string_field_build from here.
717 * This means, that the stringfields must have a routine that takes the va_lists directly, and
718 * uses them to build the string, instead of forming the va_lists internally from the vararg ... list.
719 * This new function was written so this can be accomplished.
721 va_start(ap1, name_fmt);
722 va_start(ap2, name_fmt);
723 ast_string_field_build_va(tmp, name, name_fmt, ap1, ap2);
727 /* and now, since the channel structure is built, and has its name, let's call the
728 * manager event generator with this Newchannel event. This is the proper and correct
729 * place to make this call, but you sure do have to pass a lot of data into this func
732 manager_event(EVENT_FLAG_CALL, "Newchannel",
735 "CallerIDNum: %s\r\n"
736 "CallerIDName: %s\r\n"
738 tmp->name, ast_state2str(state),
739 S_OR(cid_num, "<unknown>"),
740 S_OR(cid_name, "<unknown>"),
744 /* Reminder for the future: under what conditions do we NOT want to track cdrs on channels? */
746 /* These 4 variables need to be set up for the cdr_init() to work right */
748 tmp->amaflags = amaflag;
750 tmp->amaflags = ast_default_amaflags;
752 if (!ast_strlen_zero(acctcode))
753 ast_string_field_set(tmp, accountcode, acctcode);
755 ast_string_field_set(tmp, accountcode, ast_default_accountcode);
757 if (!ast_strlen_zero(context))
758 ast_copy_string(tmp->context, context, sizeof(tmp->context));
760 strcpy(tmp->context, "default");
762 if (!ast_strlen_zero(exten))
763 ast_copy_string(tmp->exten, exten, sizeof(tmp->exten));
765 strcpy(tmp->exten, "s");
769 tmp->cdr = ast_cdr_alloc();
770 ast_cdr_init(tmp->cdr, tmp);
771 ast_cdr_start(tmp->cdr);
773 headp = &tmp->varshead;
774 AST_LIST_HEAD_INIT_NOLOCK(headp);
776 ast_mutex_init(&tmp->lock_dont_use);
778 AST_LIST_HEAD_INIT_NOLOCK(&tmp->datastores);
780 ast_string_field_set(tmp, language, defaultlanguage);
782 tmp->tech = &null_tech;
784 AST_RWLIST_WRLOCK(&channels);
785 AST_RWLIST_INSERT_HEAD(&channels, tmp, chan_list);
786 AST_RWLIST_UNLOCK(&channels);
791 /*! \brief Queue an outgoing media frame */
792 int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
795 struct ast_frame *cur;
799 /* Build us a copy and free the original one */
800 if (!(f = ast_frdup(fin))) {
801 ast_log(LOG_WARNING, "Unable to duplicate frame\n");
804 ast_channel_lock(chan);
806 /* See if the last frame on the queue is a hangup, if so don't queue anything */
807 if ((cur = AST_LIST_LAST(&chan->readq)) && (cur->frametype == AST_FRAME_CONTROL) && (cur->subclass == AST_CONTROL_HANGUP)) {
809 ast_channel_unlock(chan);
813 /* Count how many frames exist on the queue */
814 AST_LIST_TRAVERSE(&chan->readq, cur, frame_list) {
818 /* Allow up to 96 voice frames outstanding, and up to 128 total frames */
819 if (((fin->frametype == AST_FRAME_VOICE) && (qlen > 96)) || (qlen > 128)) {
820 if (fin->frametype != AST_FRAME_VOICE) {
821 ast_log(LOG_WARNING, "Exceptionally long queue length queuing to %s\n", chan->name);
824 ast_debug(1, "Dropping voice to exceptionally long queue on %s\n", chan->name);
826 ast_channel_unlock(chan);
830 AST_LIST_INSERT_TAIL(&chan->readq, f, frame_list);
831 if (chan->alertpipe[1] > -1) {
832 if (write(chan->alertpipe[1], &blah, sizeof(blah)) != sizeof(blah))
833 ast_log(LOG_WARNING, "Unable to write to alert pipe on %s, frametype/subclass %d/%d (qlen = %d): %s!\n",
834 chan->name, f->frametype, f->subclass, qlen, strerror(errno));
836 } else if (chan->timingfd > -1) {
837 ioctl(chan->timingfd, ZT_TIMERPING, &blah);
839 } else if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
840 pthread_kill(chan->blocker, SIGURG);
842 ast_channel_unlock(chan);
846 /*! \brief Queue a hangup frame for channel */
847 int ast_queue_hangup(struct ast_channel *chan)
849 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
850 /* Yeah, let's not change a lock-critical value without locking */
851 if (!ast_channel_trylock(chan)) {
852 chan->_softhangup |= AST_SOFTHANGUP_DEV;
853 ast_channel_unlock(chan);
855 return ast_queue_frame(chan, &f);
858 /*! \brief Queue a control frame */
859 int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
861 struct ast_frame f = { AST_FRAME_CONTROL, };
863 f.subclass = control;
865 return ast_queue_frame(chan, &f);
868 /*! \brief Queue a control frame with payload */
869 int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control,
870 const void *data, size_t datalen)
872 struct ast_frame f = { AST_FRAME_CONTROL, };
874 f.subclass = control;
875 f.data = (void *) data;
878 return ast_queue_frame(chan, &f);
881 /*! \brief Set defer DTMF flag on channel */
882 int ast_channel_defer_dtmf(struct ast_channel *chan)
887 pre = ast_test_flag(chan, AST_FLAG_DEFER_DTMF);
888 ast_set_flag(chan, AST_FLAG_DEFER_DTMF);
893 /*! \brief Unset defer DTMF flag on channel */
894 void ast_channel_undefer_dtmf(struct ast_channel *chan)
897 ast_clear_flag(chan, AST_FLAG_DEFER_DTMF);
901 * \brief Helper function to find channels.
903 * It supports these modes:
905 * prev != NULL : get channel next in list after prev
906 * name != NULL : get channel with matching name
907 * name != NULL && namelen != 0 : get channel whose name starts with prefix
908 * exten != NULL : get channel whose exten or macroexten matches
909 * context != NULL && exten != NULL : get channel whose context or macrocontext
911 * It returns with the channel's lock held. If getting the individual lock fails,
912 * unlock and retry quickly up to 10 times, then give up.
914 * \note XXX Note that this code has cost O(N) because of the need to verify
915 * that the object is still on the global list.
917 * \note XXX also note that accessing fields (e.g. c->name in ast_log())
918 * can only be done with the lock held or someone could delete the
919 * object while we work on it. This causes some ugliness in the code.
920 * Note that removing the first ast_log() may be harmful, as it would
921 * shorten the retry period and possibly cause failures.
922 * We should definitely go for a better scheme that is deadlock-free.
924 static struct ast_channel *channel_find_locked(const struct ast_channel *prev,
925 const char *name, const int namelen,
926 const char *context, const char *exten)
928 const char *msg = prev ? "deadlock" : "initial deadlock";
930 struct ast_channel *c;
931 const struct ast_channel *_prev = prev;
933 for (retries = 0; retries < 10; retries++) {
935 AST_RWLIST_RDLOCK(&channels);
936 AST_RWLIST_TRAVERSE(&channels, c, chan_list) {
938 if (prev) { /* look for next item */
939 if (c != prev) /* not this one */
941 /* found, prepare to return c->next */
942 if ((c = AST_RWLIST_NEXT(c, chan_list)) == NULL) break;
943 /* If prev was the last item on the channel list, then we just
944 * want to return NULL, instead of trying to deref NULL in the
948 /* We want prev to be NULL in case we end up doing more searching through
949 * the channel list to find the channel (ie: name searching). If we didn't
950 * set this to NULL the logic would just blow up
951 * XXX Need a better explanation for this ...
954 if (name) { /* want match by name */
955 if ((!namelen && strcasecmp(c->name, name)) ||
956 (namelen && strncasecmp(c->name, name, namelen)))
957 continue; /* name match failed */
959 if (context && strcasecmp(c->context, context) &&
960 strcasecmp(c->macrocontext, context))
961 continue; /* context match failed */
962 if (strcasecmp(c->exten, exten) &&
963 strcasecmp(c->macroexten, exten))
964 continue; /* exten match failed */
966 /* if we get here, c points to the desired record */
969 /* exit if chan not found or mutex acquired successfully */
970 /* this is slightly unsafe, as we _should_ hold the lock to access c->name */
971 done = c == NULL || ast_channel_trylock(c) == 0;
973 ast_debug(1, "Avoiding %s for channel '%p'\n", msg, c);
975 /* We are about to fail due to a deadlock, so report this
976 * while we still have the list lock.
978 ast_debug(1, "Failure, could not lock '%p' after %d retries!\n", c, retries);
979 /* As we have deadlocked, we will skip this channel and
980 * see if there is another match.
981 * NOTE: No point doing this for a full-name match,
982 * as there can be no more matches.
984 if (!(name && !namelen)) {
990 AST_RWLIST_UNLOCK(&channels);
993 /* If we reach this point we basically tried to lock a channel and failed. Instead of
994 * starting from the beginning of the list we can restore our saved pointer to the previous
995 * channel and start from there.
998 usleep(1); /* give other threads a chance before retrying */
1004 /*! \brief Browse channels in use */
1005 struct ast_channel *ast_channel_walk_locked(const struct ast_channel *prev)
1007 return channel_find_locked(prev, NULL, 0, NULL, NULL);
1010 /*! \brief Get channel by name and lock it */
1011 struct ast_channel *ast_get_channel_by_name_locked(const char *name)
1013 return channel_find_locked(NULL, name, 0, NULL, NULL);
1016 /*! \brief Get channel by name prefix and lock it */
1017 struct ast_channel *ast_get_channel_by_name_prefix_locked(const char *name, const int namelen)
1019 return channel_find_locked(NULL, name, namelen, NULL, NULL);
1022 /*! \brief Get next channel by name prefix and lock it */
1023 struct ast_channel *ast_walk_channel_by_name_prefix_locked(const struct ast_channel *chan, const char *name,
1026 return channel_find_locked(chan, name, namelen, NULL, NULL);
1029 /*! \brief Get channel by exten (and optionally context) and lock it */
1030 struct ast_channel *ast_get_channel_by_exten_locked(const char *exten, const char *context)
1032 return channel_find_locked(NULL, NULL, 0, context, exten);
1035 /*! \brief Get next channel by exten (and optionally context) and lock it */
1036 struct ast_channel *ast_walk_channel_by_exten_locked(const struct ast_channel *chan, const char *exten,
1037 const char *context)
1039 return channel_find_locked(chan, NULL, 0, context, exten);
1042 /*! \brief Wait, look for hangups and condition arg */
1043 int ast_safe_sleep_conditional(struct ast_channel *chan, int ms, int (*cond)(void*), void *data)
1045 struct ast_frame *f;
1048 if (cond && ((*cond)(data) == 0))
1050 ms = ast_waitfor(chan, ms);
1063 /*! \brief Wait, look for hangups */
1064 int ast_safe_sleep(struct ast_channel *chan, int ms)
1066 return ast_safe_sleep_conditional(chan, ms, NULL, NULL);
1069 static void free_cid(struct ast_callerid *cid)
1072 ast_free(cid->cid_dnid);
1074 ast_free(cid->cid_num);
1076 ast_free(cid->cid_name);
1078 ast_free(cid->cid_ani);
1080 ast_free(cid->cid_rdnis);
1081 cid->cid_dnid = cid->cid_num = cid->cid_name = cid->cid_ani = cid->cid_rdnis = NULL;
1084 /*! \brief Free a channel structure */
1085 void ast_channel_free(struct ast_channel *chan)
1091 struct ast_var_t *vardata;
1092 struct ast_frame *f;
1093 struct varshead *headp;
1094 struct ast_datastore *datastore = NULL;
1095 char name[AST_CHANNEL_NAME];
1097 headp=&chan->varshead;
1099 AST_RWLIST_WRLOCK(&channels);
1100 if (!AST_RWLIST_REMOVE(&channels, chan, chan_list)) {
1101 AST_RWLIST_UNLOCK(&channels);
1102 ast_log(LOG_ERROR, "Unable to find channel in list to free. Assuming it has already been done.\n");
1104 /* Lock and unlock the channel just to be sure nobody
1105 has it locked still */
1106 ast_channel_lock(chan);
1107 ast_channel_unlock(chan);
1108 if (chan->tech_pvt) {
1109 ast_log(LOG_WARNING, "Channel '%s' may not have been hung up properly\n", chan->name);
1110 ast_free(chan->tech_pvt);
1114 sched_context_destroy(chan->sched);
1116 ast_copy_string(name, chan->name, sizeof(name));
1118 /* Stop monitoring */
1120 chan->monitor->stop( chan, 0 );
1122 /* If there is native format music-on-hold state, free it */
1123 if (chan->music_state)
1124 ast_moh_cleanup(chan);
1126 /* Free translators */
1127 if (chan->readtrans)
1128 ast_translator_free_path(chan->readtrans);
1129 if (chan->writetrans)
1130 ast_translator_free_path(chan->writetrans);
1132 ast_log(LOG_WARNING, "PBX may not have been terminated properly on '%s'\n", chan->name);
1133 free_cid(&chan->cid);
1134 ast_mutex_destroy(&chan->lock_dont_use);
1135 /* Close pipes if appropriate */
1136 if ((fd = chan->alertpipe[0]) > -1)
1138 if ((fd = chan->alertpipe[1]) > -1)
1140 if ((fd = chan->timingfd) > -1)
1143 for (i = 0; i < AST_MAX_FDS; i++) {
1144 if (chan->epfd_data[i])
1145 free(chan->epfd_data[i]);
1149 while ((f = AST_LIST_REMOVE_HEAD(&chan->readq, frame_list)))
1152 /* Get rid of each of the data stores on the channel */
1153 while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry)))
1154 /* Free the data store */
1155 ast_channel_datastore_free(datastore);
1156 AST_LIST_HEAD_INIT_NOLOCK(&chan->datastores);
1158 /* loop over the variables list, freeing all data and deleting list items */
1159 /* no need to lock the list, as the channel is already locked */
1161 while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
1162 ast_var_delete(vardata);
1164 ast_app_group_discard(chan);
1166 /* Destroy the jitterbuffer */
1167 ast_jb_destroy(chan);
1169 ast_string_field_free_memory(chan);
1171 AST_RWLIST_UNLOCK(&channels);
1173 ast_device_state_changed_literal(name);
1176 struct ast_datastore *ast_channel_datastore_alloc(const struct ast_datastore_info *info, const char *uid)
1178 struct ast_datastore *datastore = NULL;
1180 /* Make sure we at least have type so we can identify this */
1185 /* Allocate memory for datastore and clear it */
1186 datastore = ast_calloc(1, sizeof(*datastore));
1191 datastore->info = info;
1193 datastore->uid = ast_strdup(uid);
1198 int ast_channel_datastore_free(struct ast_datastore *datastore)
1202 /* Using the destroy function (if present) destroy the data */
1203 if (datastore->info->destroy != NULL && datastore->data != NULL) {
1204 datastore->info->destroy(datastore->data);
1205 datastore->data = NULL;
1208 /* Free allocated UID memory */
1209 if (datastore->uid != NULL) {
1210 ast_free((void *) datastore->uid);
1211 datastore->uid = NULL;
1214 /* Finally free memory used by ourselves */
1215 ast_free(datastore);
1220 int ast_channel_datastore_inherit(struct ast_channel *from, struct ast_channel *to)
1222 struct ast_datastore *datastore = NULL, *datastore2;
1224 AST_LIST_TRAVERSE(&from->datastores, datastore, entry) {
1225 if (datastore->inheritance > 0) {
1226 datastore2 = ast_channel_datastore_alloc(datastore->info, datastore->uid);
1228 datastore2->data = datastore->info->duplicate(datastore->data);
1229 datastore2->inheritance = datastore->inheritance == DATASTORE_INHERIT_FOREVER ? DATASTORE_INHERIT_FOREVER : datastore->inheritance - 1;
1230 AST_LIST_INSERT_TAIL(&to->datastores, datastore2, entry);
1237 int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
1241 AST_LIST_INSERT_HEAD(&chan->datastores, datastore, entry);
1246 int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
1248 return AST_LIST_REMOVE(&chan->datastores, datastore, entry) ? 0 : -1;
1251 struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
1253 struct ast_datastore *datastore = NULL;
1258 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, entry) {
1259 if (datastore->info == info) {
1260 if (uid != NULL && datastore->uid != NULL) {
1261 if (!strcasecmp(uid, datastore->uid)) {
1262 /* Matched by type AND uid */
1266 /* Matched by type at least */
1271 AST_LIST_TRAVERSE_SAFE_END
1276 /*! Set the file descriptor on the channel */
1277 void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
1280 struct epoll_event ev;
1281 struct ast_epoll_data *aed = NULL;
1283 if (chan->fds[which] > -1) {
1284 epoll_ctl(chan->epfd, EPOLL_CTL_DEL, chan->fds[which], &ev);
1285 aed = chan->epfd_data[which];
1288 /* If this new fd is valid, add it to the epoll */
1290 if (!aed && (!(aed = ast_calloc(1, sizeof(*aed)))))
1293 chan->epfd_data[which] = aed;
1297 ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP;
1299 epoll_ctl(chan->epfd, EPOLL_CTL_ADD, fd, &ev);
1301 /* We don't have to keep around this epoll data structure now */
1303 chan->epfd_data[which] = NULL;
1306 chan->fds[which] = fd;
1310 /*! Add a channel to an optimized waitfor */
1311 void ast_poll_channel_add(struct ast_channel *chan0, struct ast_channel *chan1)
1314 struct epoll_event ev;
1317 if (chan0->epfd == -1)
1320 /* Iterate through the file descriptors on chan1, adding them to chan0 */
1321 for (i = 0; i < AST_MAX_FDS; i++) {
1322 if (chan1->fds[i] == -1)
1324 ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP;
1325 ev.data.ptr = chan1->epfd_data[i];
1326 epoll_ctl(chan0->epfd, EPOLL_CTL_ADD, chan1->fds[i], &ev);
1333 /*! Delete a channel from an optimized waitfor */
1334 void ast_poll_channel_del(struct ast_channel *chan0, struct ast_channel *chan1)
1337 struct epoll_event ev;
1340 if (chan0->epfd == -1)
1343 for (i = 0; i < AST_MAX_FDS; i++) {
1344 if (chan1->fds[i] == -1)
1346 epoll_ctl(chan0->epfd, EPOLL_CTL_DEL, chan1->fds[i], &ev);
1353 /*! \brief Softly hangup a channel, don't lock */
1354 int ast_softhangup_nolock(struct ast_channel *chan, int cause)
1356 ast_debug(1, "Soft-Hanging up channel '%s'\n", chan->name);
1357 /* Inform channel driver that we need to be hung up, if it cares */
1358 chan->_softhangup |= cause;
1359 ast_queue_frame(chan, &ast_null_frame);
1360 /* Interrupt any poll call or such */
1361 if (ast_test_flag(chan, AST_FLAG_BLOCKING))
1362 pthread_kill(chan->blocker, SIGURG);
1366 /*! \brief Softly hangup a channel, lock */
1367 int ast_softhangup(struct ast_channel *chan, int cause)
1370 ast_channel_lock(chan);
1371 res = ast_softhangup_nolock(chan, cause);
1372 ast_channel_unlock(chan);
1376 static void free_translation(struct ast_channel *clone)
1378 if (clone->writetrans)
1379 ast_translator_free_path(clone->writetrans);
1380 if (clone->readtrans)
1381 ast_translator_free_path(clone->readtrans);
1382 clone->writetrans = NULL;
1383 clone->readtrans = NULL;
1384 clone->rawwriteformat = clone->nativeformats;
1385 clone->rawreadformat = clone->nativeformats;
1388 /*! \brief Hangup a channel */
1389 int ast_hangup(struct ast_channel *chan)
1392 struct ast_cdr *cdr = NULL;
1394 /* Don't actually hang up a channel that will masquerade as someone else, or
1395 if someone is going to masquerade as us */
1396 ast_channel_lock(chan);
1398 if (chan->audiohooks) {
1399 ast_audiohook_detach_list(chan->audiohooks);
1400 chan->audiohooks = NULL;
1403 ast_autoservice_stop(chan);
1406 if (ast_do_masquerade(chan))
1407 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
1411 ast_log(LOG_WARNING, "%s getting hung up, but someone is trying to masq into us?!?\n", chan->name);
1412 ast_channel_unlock(chan);
1415 /* If this channel is one which will be masqueraded into something,
1416 mark it as a zombie already, so we know to free it later */
1418 ast_set_flag(chan, AST_FLAG_ZOMBIE);
1419 ast_channel_unlock(chan);
1422 free_translation(chan);
1423 /* Close audio stream */
1425 ast_closestream(chan->stream);
1426 chan->stream = NULL;
1428 /* Close video stream */
1429 if (chan->vstream) {
1430 ast_closestream(chan->vstream);
1431 chan->vstream = NULL;
1434 sched_context_destroy(chan->sched);
1438 if (chan->generatordata) /* Clear any tone stuff remaining */
1439 if (chan->generator && chan->generator->release)
1440 chan->generator->release(chan, chan->generatordata);
1441 chan->generatordata = NULL;
1442 chan->generator = NULL;
1443 if (chan->cdr) { /* End the CDR if it hasn't already */
1444 ast_cdr_end(chan->cdr);
1448 if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
1449 ast_log(LOG_WARNING, "Hard hangup called by thread %ld on %s, while fd "
1450 "is blocked by thread %ld in procedure %s! Expect a failure\n",
1451 (long)pthread_self(), chan->name, (long)chan->blocker, chan->blockproc);
1454 if (!ast_test_flag(chan, AST_FLAG_ZOMBIE)) {
1455 ast_debug(1, "Hanging up channel '%s'\n", chan->name);
1456 if (chan->tech->hangup)
1457 res = chan->tech->hangup(chan);
1459 ast_debug(1, "Hanging up zombie '%s'\n", chan->name);
1462 ast_channel_unlock(chan);
1463 manager_event(EVENT_FLAG_CALL, "Hangup",
1466 "CallerIDNum: %s\r\n"
1467 "CallerIDName: %s\r\n"
1469 "Cause-txt: %s\r\n",
1472 S_OR(chan->cid.cid_num, "<unknown>"),
1473 S_OR(chan->cid.cid_name, "<unknown>"),
1475 ast_cause2str(chan->hangupcause)
1477 ast_channel_free(chan);
1480 ast_cdr_detach(cdr);
1485 int __ast_answer(struct ast_channel *chan, unsigned int delay)
1489 ast_channel_lock(chan);
1491 /* You can't answer an outbound call */
1492 if (ast_test_flag(chan, AST_FLAG_OUTGOING)) {
1493 ast_channel_unlock(chan);
1497 /* Stop if we're a zombie or need a soft hangup */
1498 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
1499 ast_channel_unlock(chan);
1503 switch (chan->_state) {
1504 case AST_STATE_RINGING:
1505 case AST_STATE_RING:
1506 if (chan->tech->answer)
1507 res = chan->tech->answer(chan);
1508 ast_setstate(chan, AST_STATE_UP);
1509 ast_cdr_answer(chan->cdr);
1510 ast_channel_unlock(chan);
1512 ast_safe_sleep(chan, delay);
1516 ast_cdr_answer(chan->cdr);
1522 ast_channel_unlock(chan);
1527 int ast_answer(struct ast_channel *chan)
1529 return __ast_answer(chan, 500);
1532 void ast_deactivate_generator(struct ast_channel *chan)
1534 ast_channel_lock(chan);
1535 if (chan->generatordata) {
1536 if (chan->generator && chan->generator->release)
1537 chan->generator->release(chan, chan->generatordata);
1538 chan->generatordata = NULL;
1539 chan->generator = NULL;
1540 ast_channel_set_fd(chan, AST_GENERATOR_FD, -1);
1541 ast_clear_flag(chan, AST_FLAG_WRITE_INT);
1542 ast_settimeout(chan, 0, NULL, NULL);
1544 ast_channel_unlock(chan);
1547 static int generator_force(const void *data)
1549 /* Called if generator doesn't have data */
1552 int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples);
1553 struct ast_channel *chan = (struct ast_channel *)data;
1554 tmp = chan->generatordata;
1555 chan->generatordata = NULL;
1556 generate = chan->generator->generate;
1557 res = generate(chan, tmp, 0, 160);
1558 chan->generatordata = tmp;
1560 ast_debug(1, "Auto-deactivating generator\n");
1561 ast_deactivate_generator(chan);
1566 int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
1570 ast_channel_lock(chan);
1572 if (chan->generatordata) {
1573 if (chan->generator && chan->generator->release)
1574 chan->generator->release(chan, chan->generatordata);
1575 chan->generatordata = NULL;
1579 if (gen->alloc && !(chan->generatordata = gen->alloc(chan, params))) {
1584 ast_settimeout(chan, 160, generator_force, chan);
1585 chan->generator = gen;
1588 ast_channel_unlock(chan);
1593 /*! \brief Wait for x amount of time on a file descriptor to have input. */
1594 int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception)
1597 ast_waitfor_nandfds(NULL, 0, fds, n, exception, &winner, ms);
1601 /*! \brief Wait for x amount of time on a file descriptor to have input. */
1603 static struct ast_channel *ast_waitfor_nandfds_classic(struct ast_channel **c, int n, int *fds, int nfds,
1604 int *exception, int *outfd, int *ms)
1606 struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
1607 int *exception, int *outfd, int *ms)
1610 struct timeval start = { 0 , 0 };
1611 struct pollfd *pfds;
1617 long whentohangup = 0, diff;
1618 struct ast_channel *winner = NULL;
1624 sz = n * AST_MAX_FDS + nfds;
1625 pfds = alloca(sizeof(*pfds) * sz);
1626 fdmap = alloca(sizeof(*fdmap) * sz);
1633 /* Perform any pending masquerades */
1634 for (x = 0; x < n; x++) {
1635 ast_channel_lock(c[x]);
1636 if (c[x]->masq && ast_do_masquerade(c[x])) {
1637 ast_log(LOG_WARNING, "Masquerade failed\n");
1639 ast_channel_unlock(c[x]);
1642 if (c[x]->whentohangup) {
1645 diff = c[x]->whentohangup - now;
1647 /* Should already be hungup */
1648 c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1649 ast_channel_unlock(c[x]);
1652 if (!whentohangup || (diff < whentohangup))
1653 whentohangup = diff;
1655 ast_channel_unlock(c[x]);
1657 /* Wait full interval */
1660 rms = whentohangup * 1000; /* timeout in milliseconds */
1661 if (*ms >= 0 && *ms < rms) /* original *ms still smaller */
1665 * Build the pollfd array, putting the channels' fds first,
1666 * followed by individual fds. Order is important because
1667 * individual fd's must have priority over channel fds.
1670 for (x = 0; x < n; x++) {
1671 for (y = 0; y < AST_MAX_FDS; y++) {
1672 fdmap[max].fdno = y; /* fd y is linked to this pfds */
1673 fdmap[max].chan = x; /* channel x is linked to this pfds */
1674 max += ast_add_fd(&pfds[max], c[x]->fds[y]);
1676 CHECK_BLOCKING(c[x]);
1678 /* Add the individual fds */
1679 for (x = 0; x < nfds; x++) {
1680 fdmap[max].chan = -1;
1681 max += ast_add_fd(&pfds[max], fds[x]);
1685 start = ast_tvnow();
1687 if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
1692 res = poll(pfds, max, kbrms);
1695 } while (!res && (rms > 0));
1697 res = poll(pfds, max, rms);
1699 for (x = 0; x < n; x++)
1700 ast_clear_flag(c[x], AST_FLAG_BLOCKING);
1701 if (res < 0) { /* Simulate a timeout if we were interrupted */
1706 if (whentohangup) { /* if we have a timeout, check who expired */
1708 for (x = 0; x < n; x++) {
1709 if (c[x]->whentohangup && now >= c[x]->whentohangup) {
1710 c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1716 if (res == 0) { /* no fd ready, reset timeout and done */
1717 *ms = 0; /* XXX use 0 since we may not have an exact timeout. */
1721 * Then check if any channel or fd has a pending event.
1722 * Remember to check channels first and fds last, as they
1723 * must have priority on setting 'winner'
1725 for (x = 0; x < max; x++) {
1726 res = pfds[x].revents;
1729 if (fdmap[x].chan >= 0) { /* this is a channel */
1730 winner = c[fdmap[x].chan]; /* override previous winners */
1732 ast_set_flag(winner, AST_FLAG_EXCEPTION);
1734 ast_clear_flag(winner, AST_FLAG_EXCEPTION);
1735 winner->fdno = fdmap[x].fdno;
1736 } else { /* this is an fd */
1738 *outfd = pfds[x].fd;
1740 *exception = (res & POLLPRI) ? -1 : 0;
1745 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
1753 static struct ast_channel *ast_waitfor_nandfds_simple(struct ast_channel *chan, int *ms)
1755 struct timeval start = { 0 , 0 };
1757 struct epoll_event ev[1];
1758 long whentohangup = 0, rms = *ms;
1760 struct ast_channel *winner = NULL;
1761 struct ast_epoll_data *aed = NULL;
1763 ast_channel_lock(chan);
1765 /* See if this channel needs to be masqueraded */
1766 if (chan->masq && ast_do_masquerade(chan)) {
1767 ast_log(LOG_WARNING, "Failed to perform masquerade on %s\n", chan->name);
1769 ast_channel_unlock(chan);
1773 /* Figure out their timeout */
1774 if (chan->whentohangup) {
1776 if ((whentohangup = chan->whentohangup - now) < 1) {
1777 /* They should already be hungup! */
1778 chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1779 ast_channel_unlock(chan);
1782 /* If this value is smaller then the current one... make it priority */
1783 whentohangup *= 1000;
1784 if (rms > whentohangup)
1788 ast_channel_unlock(chan);
1790 /* Time to make this channel block... */
1791 CHECK_BLOCKING(chan);
1794 start = ast_tvnow();
1796 /* We don't have to add any file descriptors... they are already added, we just have to wait! */
1797 res = epoll_wait(chan->epfd, ev, 1, rms);
1800 ast_clear_flag(chan, AST_FLAG_BLOCKING);
1802 /* Simulate a timeout if we were interrupted */
1809 /* If this channel has a timeout see if it expired */
1810 if (chan->whentohangup) {
1812 if (now >= chan->whentohangup) {
1813 chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1818 /* No fd ready, reset timeout and be done for now */
1824 /* See what events are pending */
1825 aed = ev[0].data.ptr;
1826 chan->fdno = aed->which;
1827 if (ev[0].events & EPOLLPRI)
1828 ast_set_flag(chan, AST_FLAG_EXCEPTION);
1830 ast_clear_flag(chan, AST_FLAG_EXCEPTION);
1833 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
1841 static struct ast_channel *ast_waitfor_nandfds_complex(struct ast_channel **c, int n, int *ms)
1843 struct timeval start = { 0 , 0 };
1845 struct epoll_event ev[25] = { { 0, } };
1846 long whentohangup = 0, diff, rms = *ms;
1848 struct ast_channel *winner = NULL;
1850 for (i = 0; i < n; i++) {
1851 ast_channel_lock(c[i]);
1852 if (c[i]->masq && ast_do_masquerade(c[i])) {
1853 ast_log(LOG_WARNING, "Masquerade failed\n");
1855 ast_channel_unlock(c[i]);
1858 if (c[i]->whentohangup) {
1861 if ((diff = c[i]->whentohangup - now) < 1) {
1862 c[i]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1863 ast_channel_unlock(c[i]);
1866 if (!whentohangup || (diff < whentohangup))
1867 whentohangup = diff;
1869 ast_channel_unlock(c[i]);
1870 CHECK_BLOCKING(c[i]);
1875 rms = whentohangup * 1000;
1876 if (*ms >= 0 && *ms < rms)
1881 start = ast_tvnow();
1883 res = epoll_wait(c[0]->epfd, ev, 25, rms);
1885 for (i = 0; i < n; i++)
1886 ast_clear_flag(c[i], AST_FLAG_BLOCKING);
1896 for (i = 0; i < n; i++) {
1897 if (c[i]->whentohangup && now >= c[i]->whentohangup) {
1898 c[i]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1910 for (i = 0; i < 25; i++) {
1911 struct ast_epoll_data *aed = ev[i].data.ptr;
1913 if (!ev[i].events || !aed)
1917 if (ev[i].events & EPOLLPRI)
1918 ast_set_flag(winner, AST_FLAG_EXCEPTION);
1920 ast_clear_flag(winner, AST_FLAG_EXCEPTION);
1921 winner->fdno = aed->which;
1925 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
1933 struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
1934 int *exception, int *outfd, int *ms)
1936 /* Clear all provided values in one place. */
1942 /* If no epoll file descriptor is available resort to classic nandfds */
1943 if (!n || nfds || c[0]->epfd == -1)
1944 return ast_waitfor_nandfds_classic(c, n, fds, nfds, exception, outfd, ms);
1945 else if (!nfds && n == 1)
1946 return ast_waitfor_nandfds_simple(c[0], ms);
1948 return ast_waitfor_nandfds_complex(c, n, ms);
1952 struct ast_channel *ast_waitfor_n(struct ast_channel **c, int n, int *ms)
1954 return ast_waitfor_nandfds(c, n, NULL, 0, NULL, NULL, ms);
1957 int ast_waitfor(struct ast_channel *c, int ms)
1959 int oldms = ms; /* -1 if no timeout */
1961 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
1962 if ((ms < 0) && (oldms < 0))
1967 /* XXX never to be called with ms = -1 */
1968 int ast_waitfordigit(struct ast_channel *c, int ms)
1970 return ast_waitfordigit_full(c, ms, -1, -1);
1973 int ast_settimeout(struct ast_channel *c, int samples, int (*func)(const void *data), void *data)
1977 if (c->timingfd > -1) {
1982 ast_debug(1, "Scheduling timer at %d sample intervals\n", samples);
1983 res = ioctl(c->timingfd, ZT_TIMERCONFIG, &samples);
1984 c->timingfunc = func;
1985 c->timingdata = data;
1991 int ast_waitfordigit_full(struct ast_channel *c, int ms, int audiofd, int cmdfd)
1993 /* Stop if we're a zombie or need a soft hangup */
1994 if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
1997 /* Only look for the end of DTMF, don't bother with the beginning and don't emulate things */
1998 ast_set_flag(c, AST_FLAG_END_DTMF_ONLY);
2000 /* Wait for a digit, no more than ms milliseconds total. */
2003 struct ast_channel *rchan;
2007 rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
2009 if (!rchan && outfd < 0 && ms) {
2010 if (errno == 0 || errno == EINTR)
2012 ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
2013 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
2015 } else if (outfd > -1) {
2016 /* The FD we were watching has something waiting */
2017 ast_log(LOG_WARNING, "The FD we were waiting for has something waiting. Waitfordigit returning numeric 1\n");
2018 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
2022 struct ast_frame *f = ast_read(c);
2026 switch (f->frametype) {
2027 case AST_FRAME_DTMF_BEGIN:
2029 case AST_FRAME_DTMF_END:
2032 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
2034 case AST_FRAME_CONTROL:
2035 switch (f->subclass) {
2036 case AST_CONTROL_HANGUP:
2038 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
2040 case AST_CONTROL_RINGING:
2041 case AST_CONTROL_ANSWER:
2045 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", f->subclass);
2049 case AST_FRAME_VOICE:
2050 /* Write audio if appropriate */
2052 write(audiofd, f->data, f->datalen);
2061 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
2063 return 0; /* Time is up */
2066 static void send_dtmf_event(const struct ast_channel *chan, const char *direction, const char digit, const char *begin, const char *end)
2068 manager_event(EVENT_FLAG_DTMF,
2076 chan->name, chan->uniqueid, digit, direction, begin, end);
2079 static void ast_read_generator_actions(struct ast_channel *chan, struct ast_frame *f)
2081 if (chan->generatordata && !ast_internal_timing_enabled(chan)) {
2082 void *tmp = chan->generatordata;
2085 if (chan->timingfunc) {
2086 if (option_debug > 1)
2087 ast_log(LOG_DEBUG, "Generator got voice, switching to phase locked mode\n");
2088 ast_settimeout(chan, 0, NULL, NULL);
2091 chan->generatordata = NULL; /* reset, to let writes go through */
2092 res = chan->generator->generate(chan, tmp, f->datalen, f->samples);
2093 chan->generatordata = tmp;
2095 if (option_debug > 1)
2096 ast_log(LOG_DEBUG, "Auto-deactivating generator\n");
2097 ast_deactivate_generator(chan);
2100 } else if (f->frametype == AST_FRAME_CNG) {
2101 if (chan->generator && !chan->timingfunc && (chan->timingfd > -1)) {
2102 if (option_debug > 1)
2103 ast_log(LOG_DEBUG, "Generator got CNG, switching to timed mode\n");
2104 ast_settimeout(chan, 160, generator_force, chan);
2109 static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
2111 struct ast_frame *f = NULL; /* the return value */
2116 /* this function is very long so make sure there is only one return
2117 * point at the end (there are only two exceptions to this).
2119 while(ast_channel_trylock(chan)) {
2121 /*cannot goto done since the channel is not locked*/
2122 return &ast_null_frame;
2127 if (ast_do_masquerade(chan))
2128 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
2130 f = &ast_null_frame;
2134 /* Stop if we're a zombie or need a soft hangup */
2135 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
2136 if (chan->generator)
2137 ast_deactivate_generator(chan);
2140 prestate = chan->_state;
2142 if (!ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_EMULATE_DTMF | AST_FLAG_IN_DTMF) &&
2143 !ast_strlen_zero(chan->dtmfq) &&
2144 (ast_tvzero(chan->dtmf_tv) || ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) > AST_MIN_DTMF_GAP) ) {
2145 /* We have DTMF that has been deferred. Return it now */
2146 chan->dtmff.subclass = chan->dtmfq[0];
2147 /* Drop first digit from the buffer */
2148 memmove(chan->dtmfq, chan->dtmfq + 1, sizeof(chan->dtmfq) - 1);
2150 if (ast_test_flag(chan, AST_FLAG_END_DTMF_ONLY)) {
2151 ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass, chan->name);
2152 chan->dtmff.frametype = AST_FRAME_DTMF_END;
2154 ast_log(LOG_DTMF, "DTMF begin emulation of '%c' with duration %d queued on %s\n", f->subclass, AST_DEFAULT_EMULATE_DTMF_DURATION, chan->name);
2155 chan->dtmff.frametype = AST_FRAME_DTMF_BEGIN;
2156 ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
2157 chan->emulate_dtmf_digit = f->subclass;
2158 chan->emulate_dtmf_duration = AST_DEFAULT_EMULATE_DTMF_DURATION;
2160 chan->dtmf_tv = ast_tvnow();
2164 /* Read and ignore anything on the alertpipe, but read only
2165 one sizeof(blah) per frame that we send from it */
2166 if (chan->alertpipe[0] > -1)
2167 read(chan->alertpipe[0], &blah, sizeof(blah));
2170 if (chan->timingfd > -1 && chan->fdno == AST_TIMING_FD && ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
2173 ast_clear_flag(chan, AST_FLAG_EXCEPTION);
2175 /* IF we can't get event, assume it's an expired as-per the old interface */
2176 res = ioctl(chan->timingfd, ZT_GETEVENT, &blah);
2178 blah = ZT_EVENT_TIMER_EXPIRED;
2180 if (blah == ZT_EVENT_TIMER_PING) {
2181 if (AST_LIST_EMPTY(&chan->readq) || !AST_LIST_NEXT(AST_LIST_FIRST(&chan->readq), frame_list)) {
2182 /* Acknowledge PONG unless we need it again */
2183 if (ioctl(chan->timingfd, ZT_TIMERPONG, &blah)) {
2184 ast_log(LOG_WARNING, "Failed to pong timer on '%s': %s\n", chan->name, strerror(errno));
2187 } else if (blah == ZT_EVENT_TIMER_EXPIRED) {
2188 ioctl(chan->timingfd, ZT_TIMERACK, &blah);
2189 if (chan->timingfunc) {
2190 chan->timingfunc(chan->timingdata);
2193 ioctl(chan->timingfd, ZT_TIMERCONFIG, &blah);
2194 chan->timingdata = NULL;
2196 ast_channel_unlock(chan);
2197 /* cannot 'goto done' because the channel is already unlocked */
2198 return &ast_null_frame;
2200 ast_log(LOG_NOTICE, "No/unknown event '%d' on timer for '%s'?\n", blah, chan->name);
2203 if (chan->fds[AST_GENERATOR_FD] > -1 && chan->fdno == AST_GENERATOR_FD) {
2204 /* if the AST_GENERATOR_FD is set, call the generator with args
2205 * set to -1 so it can do whatever it needs to.
2207 void *tmp = chan->generatordata;
2208 chan->generatordata = NULL; /* reset to let ast_write get through */
2209 chan->generator->generate(chan, tmp, -1, -1);
2210 chan->generatordata = tmp;
2211 f = &ast_null_frame;
2215 /* Check for pending read queue */
2216 if (!AST_LIST_EMPTY(&chan->readq)) {
2217 f = AST_LIST_REMOVE_HEAD(&chan->readq, frame_list);
2218 /* Interpret hangup and return NULL */
2219 /* XXX why not the same for frames from the channel ? */
2220 if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP) {
2225 chan->blocker = pthread_self();
2226 if (ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
2227 if (chan->tech->exception)
2228 f = chan->tech->exception(chan);
2230 ast_log(LOG_WARNING, "Exception flag set on '%s', but no exception handler\n", chan->name);
2231 f = &ast_null_frame;
2233 /* Clear the exception flag */
2234 ast_clear_flag(chan, AST_FLAG_EXCEPTION);
2235 } else if (chan->tech->read)
2236 f = chan->tech->read(chan);
2238 ast_log(LOG_WARNING, "No read routine on channel %s\n", chan->name);
2242 /* if the channel driver returned more than one frame, stuff the excess
2243 into the readq for the next ast_read call (note that we can safely assume
2244 that the readq is empty, because otherwise we would not have called into
2245 the channel driver and f would be only a single frame)
2247 if (AST_LIST_NEXT(f, frame_list)) {
2248 AST_LIST_HEAD_SET_NOLOCK(&chan->readq, AST_LIST_NEXT(f, frame_list));
2249 AST_LIST_NEXT(f, frame_list) = NULL;
2252 switch (f->frametype) {
2253 case AST_FRAME_CONTROL:
2254 if (f->subclass == AST_CONTROL_ANSWER) {
2255 if (!ast_test_flag(chan, AST_FLAG_OUTGOING)) {
2256 ast_debug(1, "Ignoring answer on an inbound call!\n");
2258 f = &ast_null_frame;
2259 } else if (prestate == AST_STATE_UP) {
2260 ast_debug(1, "Dropping duplicate answer!\n");
2262 f = &ast_null_frame;
2264 /* Answer the CDR */
2265 ast_setstate(chan, AST_STATE_UP);
2266 if (!chan->cdr) { /* up till now, this insertion hasn't been done. Therefore,
2267 to keep from throwing off the basic order of the universe,
2268 we will try to keep this cdr from getting posted. */
2269 chan->cdr = ast_cdr_alloc();
2270 ast_cdr_init(chan->cdr, chan);
2271 ast_cdr_start(chan->cdr);
2274 ast_cdr_answer(chan->cdr);
2278 case AST_FRAME_DTMF_END:
2279 send_dtmf_event(chan, "Received", f->subclass, "No", "Yes");
2280 ast_log(LOG_DTMF, "DTMF end '%c' received on %s, duration %ld ms\n", f->subclass, chan->name, f->len);
2281 /* Queue it up if DTMF is deffered, or if DTMF emulation is forced.
2282 * However, only let emulation be forced if the other end cares about BEGIN frames */
2283 if ( ast_test_flag(chan, AST_FLAG_DEFER_DTMF) ||
2284 (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !ast_test_flag(chan, AST_FLAG_END_DTMF_ONLY)) ) {
2285 if (strlen(chan->dtmfq) < sizeof(chan->dtmfq) - 2) {
2286 ast_log(LOG_DTMF, "DTMF end '%c' put into dtmf queue on %s\n", f->subclass, chan->name);
2287 chan->dtmfq[strlen(chan->dtmfq)] = f->subclass;
2289 ast_log(LOG_WARNING, "Dropping deferred DTMF digits on %s\n", chan->name);
2291 f = &ast_null_frame;
2292 } else if (!ast_test_flag(chan, AST_FLAG_IN_DTMF | AST_FLAG_END_DTMF_ONLY)) {
2293 if (!ast_tvzero(chan->dtmf_tv) &&
2294 ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) < AST_MIN_DTMF_GAP) {
2295 /* If it hasn't been long enough, defer this digit */
2296 if (strlen(chan->dtmfq) < sizeof(chan->dtmfq) - 2) {
2297 ast_log(LOG_DTMF, "DTMF end '%c' put into dtmf queue on %s\n", f->subclass, chan->name);
2298 chan->dtmfq[strlen(chan->dtmfq)] = f->subclass;
2300 ast_log(LOG_WARNING, "Dropping deferred DTMF digits on %s\n", chan->name);
2302 f = &ast_null_frame;
2304 /* There was no begin, turn this into a begin and send the end later */
2305 f->frametype = AST_FRAME_DTMF_BEGIN;
2306 ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
2307 chan->emulate_dtmf_digit = f->subclass;
2308 chan->dtmf_tv = ast_tvnow();
2310 if (f->len > AST_MIN_DTMF_DURATION)
2311 chan->emulate_dtmf_duration = f->len;
2313 chan->emulate_dtmf_duration = AST_MIN_DTMF_DURATION;
2315 chan->emulate_dtmf_duration = AST_DEFAULT_EMULATE_DTMF_DURATION;
2316 ast_log(LOG_DTMF, "DTMF begin emulation of '%c' with duration %u queued on %s\n", f->subclass, chan->emulate_dtmf_duration, chan->name);
2318 if (chan->audiohooks) {
2319 struct ast_frame *old_frame = f;
2320 f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
2322 ast_frfree(old_frame);
2325 struct timeval now = ast_tvnow();
2326 if (ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
2327 ast_log(LOG_DTMF, "DTMF end accepted with begin '%c' on %s\n", f->subclass, chan->name);
2328 ast_clear_flag(chan, AST_FLAG_IN_DTMF);
2330 f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
2331 } else if (!f->len) {
2332 ast_log(LOG_DTMF, "DTMF end accepted without begin '%c' on %s\n", f->subclass, chan->name);
2333 f->len = AST_MIN_DTMF_DURATION;
2335 if (f->len < AST_MIN_DTMF_DURATION) {
2336 ast_log(LOG_DTMF, "DTMF end '%c' has duration %ld but want minimum %d, emulating on %s\n", f->subclass, f->len, AST_MIN_DTMF_DURATION, chan->name);
2337 ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
2338 chan->emulate_dtmf_digit = f->subclass;
2339 chan->emulate_dtmf_duration = AST_MIN_DTMF_DURATION - f->len;
2341 f = &ast_null_frame;
2343 ast_log(LOG_DTMF, "DTMF end passthrough '%c' on %s\n", f->subclass, chan->name);
2344 chan->dtmf_tv = now;
2346 if (chan->audiohooks) {
2347 struct ast_frame *old_frame = f;
2348 f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
2350 ast_frfree(old_frame);
2354 case AST_FRAME_DTMF_BEGIN:
2355 send_dtmf_event(chan, "Received", f->subclass, "Yes", "No");
2356 ast_log(LOG_DTMF, "DTMF begin '%c' received on %s\n", f->subclass, chan->name);
2357 if ( ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_END_DTMF_ONLY) ||
2358 (!ast_tvzero(chan->dtmf_tv) &&
2359 ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) < AST_MIN_DTMF_GAP) ) {
2360 ast_log(LOG_DTMF, "DTMF begin ignored '%c' on %s\n", f->subclass, chan->name);
2362 f = &ast_null_frame;
2364 ast_set_flag(chan, AST_FLAG_IN_DTMF);
2365 chan->dtmf_tv = ast_tvnow();
2366 ast_log(LOG_DTMF, "DTMF begin passthrough '%c' on %s\n", f->subclass, chan->name);
2369 case AST_FRAME_NULL:
2370 if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF)) {
2371 struct timeval now = ast_tvnow();
2372 if (ast_tvdiff_ms(now, chan->dtmf_tv) >= chan->emulate_dtmf_duration) {
2373 chan->emulate_dtmf_duration = 0;
2376 f->frametype = AST_FRAME_DTMF_END;
2377 f->subclass = chan->emulate_dtmf_digit;
2378 f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
2379 chan->dtmf_tv = now;
2380 ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
2381 chan->emulate_dtmf_digit = 0;
2382 ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass, chan->name);
2386 case AST_FRAME_VOICE:
2387 /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
2388 * is reached , because we want to make sure we pass at least one
2389 * voice frame through before starting the next digit, to ensure a gap
2390 * between DTMF digits. */
2391 if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !chan->emulate_dtmf_duration) {
2392 ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
2393 chan->emulate_dtmf_digit = 0;
2396 if (dropaudio || ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
2398 ast_read_generator_actions(chan, f);
2400 f = &ast_null_frame;
2403 if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
2404 struct timeval now = ast_tvnow();
2405 if (ast_tvdiff_ms(now, chan->dtmf_tv) >= chan->emulate_dtmf_duration) {
2406 chan->emulate_dtmf_duration = 0;
2409 f->frametype = AST_FRAME_DTMF_END;
2410 f->subclass = chan->emulate_dtmf_digit;
2411 f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
2412 chan->dtmf_tv = now;
2413 if (chan->audiohooks) {
2414 struct ast_frame *old_frame = f;
2415 f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
2417 ast_frfree(old_frame);
2419 ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass, chan->name);
2421 /* Drop voice frames while we're still in the middle of the digit */
2423 f = &ast_null_frame;
2425 } else if ((f->frametype == AST_FRAME_VOICE) && !(f->subclass & chan->nativeformats)) {
2426 /* This frame can't be from the current native formats -- drop it on the
2428 ast_log(LOG_NOTICE, "Dropping incompatible voice frame on %s of format %s since our native format has changed to %s\n",
2429 chan->name, ast_getformatname(f->subclass), ast_getformatname(chan->nativeformats));
2431 f = &ast_null_frame;
2432 } else if ((f->frametype == AST_FRAME_VOICE)) {
2433 /* Send frame to audiohooks if present */
2434 if (chan->audiohooks) {
2435 struct ast_frame *old_frame = f;
2436 f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
2438 ast_frfree(old_frame);
2440 if (chan->monitor && chan->monitor->read_stream ) {
2441 /* XXX what does this do ? */
2442 #ifndef MONITOR_CONSTANT_DELAY
2443 int jump = chan->outsmpl - chan->insmpl - 4 * f->samples;
2445 jump = chan->outsmpl - chan->insmpl;
2446 if (ast_seekstream(chan->monitor->read_stream, jump, SEEK_FORCECUR) == -1)
2447 ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
2448 chan->insmpl += jump + f->samples;
2450 chan->insmpl+= f->samples;
2452 int jump = chan->outsmpl - chan->insmpl;
2453 if (jump - MONITOR_DELAY >= 0) {
2454 if (ast_seekstream(chan->monitor->read_stream, jump - f->samples, SEEK_FORCECUR) == -1)
2455 ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
2456 chan->insmpl += jump;
2458 chan->insmpl += f->samples;
2460 if (chan->monitor->state == AST_MONITOR_RUNNING) {
2461 if (ast_writestream(chan->monitor->read_stream, f) < 0)
2462 ast_log(LOG_WARNING, "Failed to write data to channel monitor read stream\n");
2466 if (chan->readtrans && (f = ast_translate(chan->readtrans, f, 1)) == NULL)
2467 f = &ast_null_frame;
2469 /* Run generator sitting on the line if timing device not available
2470 * and synchronous generation of outgoing frames is necessary */
2471 ast_read_generator_actions(chan, f);
2474 /* Just pass it on! */
2478 /* Make sure we always return NULL in the future */
2479 chan->_softhangup |= AST_SOFTHANGUP_DEV;
2480 if (chan->generator)
2481 ast_deactivate_generator(chan);
2482 /* End the CDR if appropriate */
2484 ast_cdr_end(chan->cdr);
2487 /* High bit prints debugging */
2488 if (chan->fin & DEBUGCHAN_FLAG)
2489 ast_frame_dump(chan->name, f, "<<");
2490 chan->fin = FRAMECOUNT_INC(chan->fin);
2493 if (chan->music_state && chan->generator && chan->generator->digit && f && f->frametype == AST_FRAME_DTMF_END)
2494 chan->generator->digit(chan, f->subclass);
2496 ast_channel_unlock(chan);
2500 int ast_internal_timing_enabled(struct ast_channel *chan)
2502 int ret = ast_opt_internal_timing && chan->timingfd > -1;
2503 ast_debug(5, "Internal timing is %s (option_internal_timing=%d chan->timingfd=%d)\n", ret? "enabled": "disabled", ast_opt_internal_timing, chan->timingfd);
2507 struct ast_frame *ast_read(struct ast_channel *chan)
2509 return __ast_read(chan, 0);
2512 struct ast_frame *ast_read_noaudio(struct ast_channel *chan)
2514 return __ast_read(chan, 1);
2517 int ast_indicate(struct ast_channel *chan, int condition)
2519 return ast_indicate_data(chan, condition, NULL, 0);
2522 int ast_indicate_data(struct ast_channel *chan, int condition, const void *data, size_t datalen)
2526 ast_channel_lock(chan);
2527 /* Stop if we're a zombie or need a soft hangup */
2528 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
2529 ast_channel_unlock(chan);
2532 if (chan->tech->indicate)
2533 res = chan->tech->indicate(chan, condition, data, datalen);
2534 ast_channel_unlock(chan);
2535 if (!chan->tech->indicate || res) {
2537 * Device does not support (that) indication, lets fake
2538 * it by doing our own tone generation. (PM2002)
2541 ast_playtones_stop(chan);
2543 const struct ind_tone_zone_sound *ts = NULL;
2544 switch (condition) {
2545 case AST_CONTROL_RINGING:
2546 ts = ast_get_indication_tone(chan->zone, "ring");
2548 case AST_CONTROL_BUSY:
2549 ts = ast_get_indication_tone(chan->zone, "busy");
2551 case AST_CONTROL_CONGESTION:
2552 ts = ast_get_indication_tone(chan->zone, "congestion");
2555 if (ts && ts->data[0]) {
2556 ast_debug(1, "Driver for channel '%s' does not support indication %d, emulating it\n", chan->name, condition);
2557 ast_playtones_start(chan,0,ts->data, 1);
2559 } else if (condition == AST_CONTROL_PROGRESS) {
2560 /* ast_playtones_stop(chan); */
2561 } else if (condition == AST_CONTROL_PROCEEDING) {
2562 /* Do nothing, really */
2563 } else if (condition == AST_CONTROL_HOLD) {
2564 /* Do nothing.... */
2565 } else if (condition == AST_CONTROL_UNHOLD) {
2566 /* Do nothing.... */
2567 } else if (condition == AST_CONTROL_VIDUPDATE) {
2568 /* Do nothing.... */
2571 ast_log(LOG_WARNING, "Unable to handle indication %d for '%s'\n", condition, chan->name);
2579 int ast_recvchar(struct ast_channel *chan, int timeout)
2582 char *buf = ast_recvtext(chan, timeout);
2584 return -1; /* error or timeout */
2585 c = *(unsigned char *)buf;
2590 char *ast_recvtext(struct ast_channel *chan, int timeout)
2596 struct ast_frame *f;
2597 if (ast_check_hangup(chan))
2599 res = ast_waitfor(chan, timeout);
2600 if (res <= 0) /* timeout or error */
2602 timeout = res; /* update timeout */
2605 break; /* no frame */
2606 if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP)
2607 done = 1; /* force a break */
2608 else if (f->frametype == AST_FRAME_TEXT) { /* what we want */
2609 buf = ast_strndup((char *) f->data, f->datalen); /* dup and break */
2617 int ast_sendtext(struct ast_channel *chan, const char *text)
2620 /* Stop if we're a zombie or need a soft hangup */
2621 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
2623 CHECK_BLOCKING(chan);
2624 if (chan->tech->send_text)
2625 res = chan->tech->send_text(chan, text);
2626 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2630 int ast_senddigit_begin(struct ast_channel *chan, char digit)
2632 /* Device does not support DTMF tones, lets fake
2633 * it by doing our own generation. */
2634 static const char* dtmf_tones[] = {
2653 if (!chan->tech->send_digit_begin)
2656 if (!chan->tech->send_digit_begin(chan, digit))
2659 if (digit >= '0' && digit <='9')
2660 ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
2661 else if (digit >= 'A' && digit <= 'D')
2662 ast_playtones_start(chan, 0, dtmf_tones[digit-'A'+10], 0);
2663 else if (digit == '*')
2664 ast_playtones_start(chan, 0, dtmf_tones[14], 0);
2665 else if (digit == '#')
2666 ast_playtones_start(chan, 0, dtmf_tones[15], 0);
2669 ast_debug(1, "Unable to generate DTMF tone '%c' for '%s'\n", digit, chan->name);
2675 int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
2679 if (chan->tech->send_digit_end)
2680 res = chan->tech->send_digit_end(chan, digit, duration);
2682 if (res && chan->generator)
2683 ast_playtones_stop(chan);
2688 int ast_senddigit(struct ast_channel *chan, char digit, unsigned int duration)
2690 if (chan->tech->send_digit_begin) {
2691 ast_senddigit_begin(chan, digit);
2692 ast_safe_sleep(chan, (duration >= AST_DEFAULT_EMULATE_DTMF_DURATION ? duration : AST_DEFAULT_EMULATE_DTMF_DURATION));
2695 return ast_senddigit_end(chan, digit, (duration >= AST_DEFAULT_EMULATE_DTMF_DURATION ? duration : AST_DEFAULT_EMULATE_DTMF_DURATION));
2698 int ast_prod(struct ast_channel *chan)
2700 struct ast_frame a = { AST_FRAME_VOICE };
2703 /* Send an empty audio frame to get things moving */
2704 if (chan->_state != AST_STATE_UP) {
2705 ast_debug(1, "Prodding channel '%s'\n", chan->name);
2706 a.subclass = chan->rawwriteformat;
2707 a.data = nothing + AST_FRIENDLY_OFFSET;
2709 if (ast_write(chan, &a))
2710 ast_log(LOG_WARNING, "Prodding channel '%s' failed\n", chan->name);
2715 int ast_write_video(struct ast_channel *chan, struct ast_frame *fr)
2718 if (!chan->tech->write_video)
2720 res = ast_write(chan, fr);
2726 int ast_write(struct ast_channel *chan, struct ast_frame *fr)
2729 struct ast_frame *f = NULL, *f2 = NULL;
2731 /* Stop if we're a zombie or need a soft hangup */
2732 ast_channel_lock(chan);
2733 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
2736 /* Handle any pending masquerades */
2737 if (chan->masq && ast_do_masquerade(chan)) {
2738 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
2742 res = 0; /* XXX explain, why 0 ? */
2745 if (chan->generatordata) {
2746 if (ast_test_flag(chan, AST_FLAG_WRITE_INT))
2747 ast_deactivate_generator(chan);
2749 if (fr->frametype == AST_FRAME_DTMF_END) {
2750 /* There is a generator running while we're in the middle of a digit.
2751 * It's probably inband DTMF, so go ahead and pass it so it can
2752 * stop the generator */
2753 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2754 ast_channel_unlock(chan);
2755 res = ast_senddigit_end(chan, fr->subclass, fr->len);
2756 ast_channel_lock(chan);
2757 CHECK_BLOCKING(chan);
2758 } else if (fr->frametype == AST_FRAME_CONTROL && fr->subclass == AST_CONTROL_UNHOLD) {
2759 /* This is a side case where Echo is basically being called and the person put themselves on hold and took themselves off hold */
2760 res = (chan->tech->indicate == NULL) ? 0 :
2761 chan->tech->indicate(chan, fr->subclass, fr->data, fr->datalen);
2763 res = 0; /* XXX explain, why 0 ? */
2767 /* High bit prints debugging */
2768 if (chan->fout & DEBUGCHAN_FLAG)
2769 ast_frame_dump(chan->name, fr, ">>");
2770 CHECK_BLOCKING(chan);
2771 switch (fr->frametype) {
2772 case AST_FRAME_CONTROL:
2773 res = (chan->tech->indicate == NULL) ? 0 :
2774 chan->tech->indicate(chan, fr->subclass, fr->data, fr->datalen);
2776 case AST_FRAME_DTMF_BEGIN:
2777 if (chan->audiohooks) {
2778 struct ast_frame *old_frame = fr;
2779 fr = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_WRITE, fr);
2780 if (old_frame != fr)
2783 send_dtmf_event(chan, "Sent", fr->subclass, "Yes", "No");
2784 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2785 ast_channel_unlock(chan);
2786 res = ast_senddigit_begin(chan, fr->subclass);
2787 ast_channel_lock(chan);
2788 CHECK_BLOCKING(chan);
2790 case AST_FRAME_DTMF_END:
2791 if (chan->audiohooks) {
2792 struct ast_frame *old_frame = fr;
2793 fr = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_WRITE, fr);
2794 if (old_frame != fr)
2797 send_dtmf_event(chan, "Sent", fr->subclass, "No", "Yes");
2798 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2799 ast_channel_unlock(chan);
2800 res = ast_senddigit_end(chan, fr->subclass, fr->len);
2801 ast_channel_lock(chan);
2802 CHECK_BLOCKING(chan);
2804 case AST_FRAME_TEXT:
2805 if (fr->subclass == AST_FORMAT_T140) {
2806 res = (chan->tech->write_text == NULL) ? 0 :
2807 chan->tech->write_text(chan, fr);
2809 res = (chan->tech->send_text == NULL) ? 0 :
2810 chan->tech->send_text(chan, (char *) fr->data);
2813 case AST_FRAME_HTML:
2814 res = (chan->tech->send_html == NULL) ? 0 :
2815 chan->tech->send_html(chan, fr->subclass, (char *) fr->data, fr->datalen);
2817 case AST_FRAME_VIDEO:
2818 /* XXX Handle translation of video codecs one day XXX */
2819 res = (chan->tech->write_video == NULL) ? 0 :
2820 chan->tech->write_video(chan, fr);
2822 case AST_FRAME_MODEM:
2823 res = (chan->tech->write == NULL) ? 0 :
2824 chan->tech->write(chan, fr);
2826 case AST_FRAME_VOICE:
2827 if (chan->tech->write == NULL)
2828 break; /*! \todo XXX should return 0 maybe ? */
2830 /* If audiohooks are present, write the frame out */
2831 if (chan->audiohooks) {
2832 struct ast_frame *old_frame = fr;
2833 fr = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_WRITE, fr);
2834 if (old_frame != fr)
2838 /* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */
2839 if (fr->subclass == chan->rawwriteformat)
2842 f = (chan->writetrans) ? ast_translate(chan->writetrans, fr, 0) : fr;
2849 /* If Monitor is running on this channel, then we have to write frames out there too */
2850 if (chan->monitor && chan->monitor->write_stream) {
2851 /* XXX must explain this code */
2852 #ifndef MONITOR_CONSTANT_DELAY
2853 int jump = chan->insmpl - chan->outsmpl - 4 * f->samples;
2855 jump = chan->insmpl - chan->outsmpl;
2856 if (ast_seekstream(chan->monitor->write_stream, jump, SEEK_FORCECUR) == -1)
2857 ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
2858 chan->outsmpl += jump + f->samples;
2860 chan->outsmpl += f->samples;
2862 int jump = chan->insmpl - chan->outsmpl;
2863 if (jump - MONITOR_DELAY >= 0) {
2864 if (ast_seekstream(chan->monitor->write_stream, jump - f->samples, SEEK_FORCECUR) == -1)
2865 ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
2866 chan->outsmpl += jump;
2868 chan->outsmpl += f->samples;
2870 if (chan->monitor->state == AST_MONITOR_RUNNING) {
2871 if (ast_writestream(chan->monitor->write_stream, f) < 0)
2872 ast_log(LOG_WARNING, "Failed to write data to channel monitor write stream\n");
2877 struct ast_channel *base = NULL;
2878 if (!chan->tech->get_base_channel || chan == chan->tech->get_base_channel(chan))
2879 res = chan->tech->write(chan, f);
2881 while (chan->tech->get_base_channel && (((base = chan->tech->get_base_channel(chan)) && ast_channel_trylock(base)) || base == NULL)) {
2882 ast_channel_unlock(chan);
2884 ast_channel_lock(chan);
2886 res = base->tech->write(base, f);
2887 ast_channel_unlock(base);
2892 case AST_FRAME_NULL:
2898 /* At this point, fr is the incoming frame and f is NULL. Channels do
2899 * not expect to get NULL as a frame pointer and will segfault. Hence,
2900 * we output the original frame passed in. */
2901 res = chan->tech->write(chan, fr);
2909 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2910 /* Consider a write failure to force a soft hangup */
2912 chan->_softhangup |= AST_SOFTHANGUP_DEV;
2914 chan->fout = FRAMECOUNT_INC(chan->fout);
2917 ast_channel_unlock(chan);
2921 static int set_format(struct ast_channel *chan, int fmt, int *rawformat, int *format,
2922 struct ast_trans_pvt **trans, const int direction)
2927 /* Make sure we only consider audio */
2928 fmt &= AST_FORMAT_AUDIO_MASK;
2930 native = chan->nativeformats;
2931 /* Find a translation path from the native format to one of the desired formats */
2934 res = ast_translator_best_choice(&fmt, &native);
2937 res = ast_translator_best_choice(&native, &fmt);
2940 ast_log(LOG_WARNING, "Unable to find a codec translation path from %s to %s\n",
2941 ast_getformatname(native), ast_getformatname(fmt));
2945 /* Now we have a good choice for both. */
2946 ast_channel_lock(chan);
2948 if ((*rawformat == native) && (*format == fmt) && ((*rawformat == *format) || (*trans))) {
2949 /* the channel is already in these formats, so nothing to do */
2950 ast_channel_unlock(chan);
2954 *rawformat = native;
2955 /* User perspective is fmt */
2957 /* Free any read translation we have right now */
2959 ast_translator_free_path(*trans);
2960 /* Build a translation path from the raw format to the desired format */
2963 *trans = ast_translator_build_path(*format, *rawformat);
2966 *trans = ast_translator_build_path(*rawformat, *format);
2967 ast_channel_unlock(chan);
2968 ast_debug(1, "Set channel %s to %s format %s\n", chan->name,
2969 direction ? "write" : "read", ast_getformatname(fmt));
2973 int ast_set_read_format(struct ast_channel *chan, int fmt)
2975 return set_format(chan, fmt, &chan->rawreadformat, &chan->readformat,
2976 &chan->readtrans, 0);
2979 int ast_set_write_format(struct ast_channel *chan, int fmt)
2981 return set_format(chan, fmt, &chan->rawwriteformat, &chan->writeformat,
2982 &chan->writetrans, 1);
2985 const char *ast_channel_reason2str(int reason)
2987 switch (reason) /* the following appear to be the only ones actually returned by request_and_dial */
2990 return "Call Failure (not BUSY, and not NO_ANSWER, maybe Circuit busy or down?)";
2991 case AST_CONTROL_HANGUP:
2993 case AST_CONTROL_RING:
2994 return "Local Ring";
2995 case AST_CONTROL_RINGING:
2996 return "Remote end Ringing";
2997 case AST_CONTROL_ANSWER:
2998 return "Remote end has Answered";
2999 case AST_CONTROL_BUSY:
3000 return "Remote end is Busy";
3001 case AST_CONTROL_CONGESTION:
3002 return "Congestion (circuits busy)";
3004 return "Unknown Reason!!";
3008 struct ast_channel *__ast_request_and_dial(const char *type, int format, void *data, int timeout, int *outstate, const char *cid_num, const char *cid_name, struct outgoing_helper *oh)
3012 struct ast_channel *chan;
3018 outstate = &dummy_outstate; /* make outstate always a valid pointer */
3020 chan = ast_request(type, format, data, &cause);
3022 ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, (char *)data);
3023 /* compute error and return */
3024 if (cause == AST_CAUSE_BUSY)
3025 *outstate = AST_CONTROL_BUSY;
3026 else if (cause == AST_CAUSE_CONGESTION)
3027 *outstate = AST_CONTROL_CONGESTION;
3033 ast_set_variables(chan, oh->vars);
3034 /* XXX why is this necessary, for the parent_channel perhaps ? */
3035 if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name))
3036 ast_set_callerid(chan, oh->cid_num, oh->cid_name, oh->cid_num);
3037 if (oh->parent_channel) {
3038 ast_channel_inherit_variables(oh->parent_channel, chan);
3039 ast_channel_datastore_inherit(oh->parent_channel, chan);
3042 ast_cdr_setaccount(chan, oh->account);
3044 ast_set_callerid(chan, cid_num, cid_name, cid_num);
3048 if (!chan->cdr) { /* up till now, this insertion hasn't been done. Therefore,
3049 to keep from throwing off the basic order of the universe,
3050 we will try to keep this cdr from getting posted. */
3051 chan->cdr = ast_cdr_alloc();
3052 ast_cdr_init(chan->cdr, chan);
3053 ast_cdr_start(chan->cdr);
3055 if (ast_call(chan, data, 0)) { /* ast_call failed... */
3056 ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, (char *)data);
3058 res = 1; /* mark success in case chan->_state is already AST_STATE_UP */
3059 while (timeout && chan->_state != AST_STATE_UP) {
3060 struct ast_frame *f;
3061 res = ast_waitfor(chan, timeout);
3062 if (res <= 0) /* error, timeout, or done */
3068 *outstate = AST_CONTROL_HANGUP;
3072 if (f->frametype == AST_FRAME_CONTROL) {
3073 switch (f->subclass) {
3074 case AST_CONTROL_RINGING: /* record but keep going */
3075 *outstate = f->subclass;
3078 case AST_CONTROL_BUSY:
3079 case AST_CONTROL_CONGESTION:
3080 case AST_CONTROL_ANSWER:
3081 *outstate = f->subclass;
3082 timeout = 0; /* trick to force exit from the while() */
3086 case AST_CONTROL_PROGRESS:
3087 case AST_CONTROL_PROCEEDING:
3088 case AST_CONTROL_HOLD:
3089 case AST_CONTROL_UNHOLD:
3090 case AST_CONTROL_VIDUPDATE:
3091 case -1: /* Ignore -- just stopping indications */
3095 ast_log(LOG_NOTICE, "Don't know what to do with control frame %d\n", f->subclass);
3104 if (!ast_strlen_zero(oh->context))
3105 ast_copy_string(chan->context, oh->context, sizeof(chan->context));
3106 if (!ast_strlen_zero(oh->exten))
3107 ast_copy_string(chan->exten, oh->exten, sizeof(chan->exten));
3109 chan->priority = oh->priority;
3111 if (chan->_state == AST_STATE_UP)
3112 *outstate = AST_CONTROL_ANSWER;
3115 if (!chan->cdr && (chan->cdr = ast_cdr_alloc()))
3116 ast_cdr_init(chan->cdr, chan);
3119 snprintf(tmp, sizeof(tmp), "%s/%s", type, (char *)data);
3120 ast_cdr_setapp(chan->cdr,"Dial",tmp);
3121 ast_cdr_update(chan);
3122 ast_cdr_start(chan->cdr);
3123 ast_cdr_end(chan->cdr);
3124 /* If the cause wasn't handled properly */
3125 if (ast_cdr_disposition(chan->cdr,chan->hangupcause))
3126 ast_cdr_failed(chan->cdr);
3134 struct ast_channel *ast_request_and_dial(const char *type, int format, void *data, int timeout, int *outstate, const char *cidnum, const char *cidname)
3136 return __ast_request_and_dial(type, format, data, timeout, outstate, cidnum, cidname, NULL);
3139 struct ast_channel *ast_request(const char *type, int format, void *data, int *cause)
3141 struct chanlist *chan;
3142 struct ast_channel *c;
3147 int videoformat = format & AST_FORMAT_VIDEO_MASK;
3148 int textformat = format & AST_FORMAT_TEXT_MASK;
3152 *cause = AST_CAUSE_NOTDEFINED;
3154 if (AST_RWLIST_RDLOCK(&channels)) {
3155 ast_log(LOG_WARNING, "Unable to lock channel list\n");
3159 AST_LIST_TRAVERSE(&backends, chan, list) {
3160 if (strcasecmp(type, chan->tech->type))
3163 capabilities = chan->tech->capabilities;
3164 fmt = format & AST_FORMAT_AUDIO_MASK;
3165 res = ast_translator_best_choice(&fmt, &capabilities);
3167 ast_log(LOG_WARNING, "No translator path exists for channel type %s (native 0x%x) to 0x%x\n", type, chan->tech->capabilities, format);
3168 *cause = AST_CAUSE_BEARERCAPABILITY_NOTAVAIL;
3169 AST_RWLIST_UNLOCK(&channels);
3172 AST_RWLIST_UNLOCK(&channels);
3173 if (!chan->tech->requester)
3176 if (!(c = chan->tech->requester(type, capabilities | videoformat | textformat, data, cause)))
3179 /* no need to generate a Newchannel event here; it is done in the channel_alloc call */
3183 ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
3184 *cause = AST_CAUSE_NOSUCHDRIVER;
3185 AST_RWLIST_UNLOCK(&channels);
3190 int ast_call(struct ast_channel *chan, char *addr, int timeout)
3192 /* Place an outgoing call, but don't wait any longer than timeout ms before returning.
3193 If the remote end does not answer within the timeout, then do NOT hang up, but
3196 /* Stop if we're a zombie or need a soft hangup */
3197 ast_channel_lock(chan);
3198 if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan)) {
3199 if (chan->tech->call)
3200 res = chan->tech->call(chan, addr, timeout);
3201 ast_set_flag(chan, AST_FLAG_OUTGOING);
3203 ast_channel_unlock(chan);
3208 \brief Transfer a call to dest, if the channel supports transfer
3212 \arg the manager interface
3214 int ast_transfer(struct ast_channel *chan, char *dest)
3218 /* Stop if we're a zombie or need a soft hangup */
3219 ast_channel_lock(chan);
3220 if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan)) {
3221 if (chan->tech->transfer) {
3222 res = chan->tech->transfer(chan, dest);
3228 ast_channel_unlock(chan);
3232 int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders)
3234 return ast_readstring_full(c, s, len, timeout, ftimeout, enders, -1, -1);
3237 int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders, int audiofd, int ctrlfd)
3239 int pos = 0; /* index in the buffer where we accumulate digits */
3242 /* Stop if we're a zombie or need a soft hangup */
3243 if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
3250 d = ast_waitstream_full(c, AST_DIGIT_ANY, audiofd, ctrlfd);
3254 d = ast_waitfordigit_full(c, to, audiofd, ctrlfd);
3256 d = ast_waitfordigit_full(c, to, audiofd, ctrlfd);
3268 if (!strchr(enders, d))
3270 if (strchr(enders, d) || (pos >= len)) {
3280 int ast_channel_supports_html(struct ast_channel *chan)
3282 return (chan->tech->send_html) ? 1 : 0;
3285 int ast_channel_sendhtml(struct ast_channel *chan, int subclass, const char *data, int datalen)
3287 if (chan->tech->send_html)
3288 return chan->tech->send_html(chan, subclass, data, datalen);
3292 int ast_channel_sendurl(struct ast_channel *chan, const char *url)
3294 return ast_channel_sendhtml(chan, AST_HTML_URL, url, strlen(url) + 1);
3297 /*! \brief Set up translation from one channel to another */
3298 static int ast_channel_make_compatible_helper(struct ast_channel *from, struct ast_channel *to)
3303 if (from->readformat == to->writeformat && from->writeformat == to->readformat) {
3304 /* Already compatible! Moving on ... */
3308 /* Set up translation from the 'from' channel to the 'to' channel */
3309 src = from->nativeformats;
3310 dst = to->nativeformats;
3311 if (ast_translator_best_choice(&dst, &src) < 0) {
3312 ast_log(LOG_WARNING, "No path to translate from %s(%d) to %s(%d)\n", from->name, src, to->name, dst);
3316 /* if the best path is not 'pass through', then
3317 transcoding is needed; if desired, force transcode path
3318 to use SLINEAR between channels, but only if there is
3319 no direct conversion available */
3320 if ((src != dst) && ast_opt_transcode_via_slin &&
3321 (ast_translate_path_steps(dst, src) != 1))
3322 dst = AST_FORMAT_SLINEAR;
3323 if (ast_set_read_format(from, dst) < 0) {
3324 ast_log(LOG_WARNING, "Unable to set read format on channel %s to %d\n", from->name, dst);
3327 if (ast_set_write_format(to, dst) < 0) {
3328 ast_log(LOG_WARNING, "Unable to set write format on channel %s to %d\n", to->name, dst);
3334 int ast_channel_make_compatible(struct ast_channel *chan, struct ast_channel *peer)
3336 /* Some callers do not check return code, and we must try to set all call legs correctly */
3339 /* Set up translation from the chan to the peer */
3340 rc = ast_channel_make_compatible_helper(chan, peer);
3345 /* Set up translation from the peer to the chan */
3346 rc = ast_channel_make_compatible_helper(peer, chan);
3351 int ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clone)
3354 struct ast_channel *final_orig, *final_clone, *base;
3357 final_orig = original;
3358 final_clone = clone;
3360 ast_channel_lock(original);
3361 while (ast_channel_trylock(clone)) {
3362 ast_channel_unlock(original);
3364 ast_channel_lock(original);
3367 /* each of these channels may be sitting behind a channel proxy (i.e. chan_agent)
3368 and if so, we don't really want to masquerade it, but its proxy */
3369 if (original->_bridge && (original->_bridge != ast_bridged_channel(original)) && (original->_bridge->_bridge != original))
3370 final_orig = original->_bridge;
3372 if (clone->_bridge && (clone->_bridge != ast_bridged_channel(clone)) && (clone->_bridge->_bridge != clone))
3373 final_clone = clone->_bridge;
3375 if (final_clone->tech->get_base_channel && (base = final_clone->tech->get_base_channel(final_clone))) {
3379 if ((final_orig != original) || (final_clone != clone)) {
3380 /* Lots and lots of deadlock avoidance. The main one we're competing with
3381 * is ast_write(), which locks channels recursively, when working with a
3383 if (ast_channel_trylock(final_orig)) {
3384 ast_channel_unlock(clone);
3385 ast_channel_unlock(original);
3388 if (ast_channel_trylock(final_clone)) {
3389 ast_channel_unlock(final_orig);
3390 ast_channel_unlock(clone);
3391 ast_channel_unlock(original);
3394 ast_channel_unlock(clone);
3395 ast_channel_unlock(original);
3396 original = final_orig;
3397 clone = final_clone;
3400 if (original == clone) {
3401 ast_log(LOG_WARNING, "Can't masquerade channel '%s' into itself!\n", original->name);
3402 ast_channel_unlock(clone);
3403 ast_channel_unlock(original);
3407 ast_debug(1, "Planning to masquerade channel %s into the structure of %s\n",
3408 clone->name, original->name);
3409 if (original->masq) {
3410 ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
3411 original->masq->name, original->name);
3412 } else if (clone->masqr) {
3413 ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
3414 clone->name, clone->masqr->name);
3416 original->masq = clone;
3417 clone->masqr = original;
3418 ast_queue_frame(original, &ast_null_frame);
3419 ast_queue_frame(clone, &ast_null_frame);
3420 ast_debug(1, "Done planning to masquerade channel %s into the structure of %s\n", clone->name, original->name);
3424 ast_channel_unlock(clone);
3425 ast_channel_unlock(original);
3430 void ast_change_name(struct ast_channel *chan, char *newname)
3432 manager_event(EVENT_FLAG_CALL, "Rename", "Oldname: %s\r\nNewname: %s\r\nUniqueid: %s\r\n", chan->name, newname, chan->uniqueid);
3433 ast_string_field_set(chan, name, newname);
3436 void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child)
3438 struct ast_var_t *current, *newvar;
3439 const char *varname;
3441 AST_LIST_TRAVERSE(&parent->varshead, current, entries) {
3444 varname = ast_var_full_name(current);
3448 if (varname[0] == '_') {
3450 if (varname[1] == '_')
3456 newvar = ast_var_assign(&varname[1], ast_var_value(current));
3458 AST_LIST_INSERT_TAIL(&child->varshead, newvar, entries);
3459 ast_debug(1, "Copying soft-transferable variable %s.\n", ast_var_name(newvar));
3463 newvar = ast_var_assign(ast_var_full_name(current), ast_var_value(current));
3465 AST_LIST_INSERT_TAIL(&child->varshead, newvar, entries);
3466 ast_debug(1, "Copying hard-transferable variable %s.\n", ast_var_name(newvar));
3470 ast_debug(1, "Not copying variable %s.\n", ast_var_name(current));
3477 \brief Clone channel variables from 'clone' channel into 'original' channel
3479 All variables except those related to app_groupcount are cloned.
3480 Variables are actually _removed_ from 'clone' channel, presumably
3481 because it will subsequently be destroyed.
3483 \note Assumes locks will be in place on both channels when called.
3485 static void clone_variables(struct ast_channel *original, struct ast_channel *clone)
3487 struct ast_var_t *current, *newvar;
3488 /* Append variables from clone channel into original channel */
3489 /* XXX Is this always correct? We have to in order to keep MACROS working XXX */
3490 if (AST_LIST_FIRST(&clone->varshead))
3491 AST_LIST_APPEND_LIST(&original->varshead, &clone->varshead, entries);
3493 /* then, dup the varshead list into the clone */
3495 AST_LIST_TRAVERSE(&original->varshead, current, entries) {
3496 newvar = ast_var_assign(current->name, current->value);
3498 AST_LIST_INSERT_TAIL(&clone->varshead, newvar, entries);
3503 \brief Masquerade a channel
3505 \note Assumes channel will be locked when called
3507 int ast_do_masquerade(struct ast_channel *original)
3512 struct ast_frame *cur;
3513 const struct ast_channel_tech *t;
3515 struct ast_callerid tmpcid;
3516 struct ast_channel *clone = original->masq;
3517 struct ast_cdr *cdr;
3518 int rformat = original->readformat;
3519 int wformat = original->writeformat;
3525 ast_debug(4, "Actually Masquerading %s(%d) into the structure of %s(%d)\n",
3526 clone->name, clone->_state, original->name, original->_state);
3528 manager_event(EVENT_FLAG_CALL, "Masquerade", "Clone: %s\r\nCloneState: %s\r\nOriginal: %s\r\nOriginalState: %s\r\n",
3529 clone->name, ast_state2str(clone->_state), original->name, ast_state2str(original->_state));
3531 /* XXX This is a seriously wacked out operation. We're essentially putting the guts of
3532 the clone channel into the original channel. Start by killing off the original