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$")
30 #include "asterisk/_private.h"
36 #include "asterisk/paths.h" /* use ast_config_AST_SYSTEM_NAME */
37 #include "asterisk/zapata.h"
39 #include "asterisk/pbx.h"
40 #include "asterisk/frame.h"
41 #include "asterisk/sched.h"
42 #include "asterisk/channel.h"
43 #include "asterisk/musiconhold.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, "----------", "-----------", "-----------", "-----------", "--------");
210 AST_RWLIST_RDLOCK(&channels);
212 AST_LIST_TRAVERSE(&backends, cl, list) {
213 ast_cli(a->fd, FORMAT, cl->tech->type, cl->tech->description,
214 (cl->tech->devicestate) ? "yes" : "no",
215 (cl->tech->indicate) ? "yes" : "no",
216 (cl->tech->transfer) ? "yes" : "no");
220 AST_RWLIST_UNLOCK(&channels);
222 ast_cli(a->fd, "----------\n%d channel drivers registered.\n", count_chan);
229 static char *complete_channeltypes(struct ast_cli_args *a)
239 wordlen = strlen(a->word);
241 AST_LIST_TRAVERSE(&backends, cl, list) {
242 if (!strncasecmp(a->word, cl->tech->type, wordlen) && ++which > a->n) {
243 ret = ast_strdup(cl->tech->type);
251 /*! \brief Show details about a channel driver - CLI command */
252 static char *handle_cli_core_show_channeltype(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
254 struct chanlist *cl = NULL;
258 e->command = "core show channeltype";
260 "Usage: core show channeltype <name>\n"
261 " Show details about the specified channel type, <name>.\n";
264 return complete_channeltypes(a);
268 return CLI_SHOWUSAGE;
270 AST_RWLIST_RDLOCK(&channels);
272 AST_LIST_TRAVERSE(&backends, cl, list) {
273 if (!strncasecmp(cl->tech->type, a->argv[3], strlen(cl->tech->type)))
279 ast_cli(a->fd, "\n%s is not a registered channel driver.\n", a->argv[3]);
280 AST_RWLIST_UNLOCK(&channels);
285 "-- Info about channel driver: %s --\n"
286 " Device State: %s\n"
289 " Capabilities: %d\n"
293 " Image Support: %s\n"
294 " Text Support: %s\n",
296 (cl->tech->devicestate) ? "yes" : "no",
297 (cl->tech->indicate) ? "yes" : "no",
298 (cl->tech->transfer) ? "yes" : "no",
299 (cl->tech->capabilities) ? cl->tech->capabilities : -1,
300 (cl->tech->send_digit_begin) ? "yes" : "no",
301 (cl->tech->send_digit_end) ? "yes" : "no",
302 (cl->tech->send_html) ? "yes" : "no",
303 (cl->tech->send_image) ? "yes" : "no",
304 (cl->tech->send_text) ? "yes" : "no"
308 AST_RWLIST_UNLOCK(&channels);
312 static struct ast_cli_entry cli_channel[] = {
313 AST_CLI_DEFINE(handle_cli_core_show_channeltypes, "List available channel types"),
314 AST_CLI_DEFINE(handle_cli_core_show_channeltype, "Give more details on that channel type")
317 /*! \brief Checks to see if a channel is needing hang up */
318 int ast_check_hangup(struct ast_channel *chan)
320 if (chan->_softhangup) /* yes if soft hangup flag set */
322 if (!chan->tech_pvt) /* yes if no technology private data */
324 if (!chan->whentohangup) /* no if no hangup scheduled */
326 if (chan->whentohangup > time(NULL)) /* no if hangup time has not come yet. */
328 chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT; /* record event */
332 static int ast_check_hangup_locked(struct ast_channel *chan)
335 ast_channel_lock(chan);
336 res = ast_check_hangup(chan);
337 ast_channel_unlock(chan);
341 /*! \brief Initiate system shutdown */
342 void ast_begin_shutdown(int hangup)
344 struct ast_channel *c;
347 AST_RWLIST_RDLOCK(&channels);
348 AST_RWLIST_TRAVERSE(&channels, c, chan_list)
349 ast_softhangup(c, AST_SOFTHANGUP_SHUTDOWN);
350 AST_RWLIST_UNLOCK(&channels);
354 /*! \brief returns number of active/allocated channels */
355 int ast_active_channels(void)
357 struct ast_channel *c;
359 AST_RWLIST_RDLOCK(&channels);
360 AST_RWLIST_TRAVERSE(&channels, c, chan_list)
362 AST_RWLIST_UNLOCK(&channels);
366 /*! \brief Cancel a shutdown in progress */
367 void ast_cancel_shutdown(void)
372 /*! \brief Returns non-zero if Asterisk is being shut down */
373 int ast_shutting_down(void)
375 return shutting_down;
378 /*! \brief Set when to hangup channel */
379 void ast_channel_setwhentohangup(struct ast_channel *chan, time_t offset)
381 chan->whentohangup = offset ? time(NULL) + offset : 0;
382 ast_queue_frame(chan, &ast_null_frame);
386 /*! \brief Compare a offset with when to hangup channel */
387 int ast_channel_cmpwhentohangup(struct ast_channel *chan, time_t offset)
391 if (!chan->whentohangup)
392 return (offset == 0) ? 0 : -1;
394 if (!offset) /* XXX why is this special? */
397 whentohangup = offset + time(NULL);
399 if (chan->whentohangup < whentohangup)
401 else if (chan->whentohangup == whentohangup)
407 /*! \brief Register a new telephony channel in Asterisk */
408 int ast_channel_register(const struct ast_channel_tech *tech)
410 struct chanlist *chan;
412 AST_RWLIST_WRLOCK(&channels);
414 AST_LIST_TRAVERSE(&backends, chan, list) {
415 if (!strcasecmp(tech->type, chan->tech->type)) {
416 ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", tech->type);
417 AST_RWLIST_UNLOCK(&channels);
422 if (!(chan = ast_calloc(1, sizeof(*chan)))) {
423 AST_RWLIST_UNLOCK(&channels);
427 AST_LIST_INSERT_HEAD(&backends, chan, list);
429 ast_debug(1, "Registered handler for '%s' (%s)\n", chan->tech->type, chan->tech->description);
431 ast_verb(2, "Registered channel type '%s' (%s)\n", chan->tech->type, chan->tech->description);
433 AST_RWLIST_UNLOCK(&channels);
437 /*! \brief Unregister channel driver */
438 void ast_channel_unregister(const struct ast_channel_tech *tech)
440 struct chanlist *chan;
442 ast_debug(1, "Unregistering channel type '%s'\n", tech->type);
444 AST_RWLIST_WRLOCK(&channels);
446 AST_LIST_TRAVERSE_SAFE_BEGIN(&backends, chan, list) {
447 if (chan->tech == tech) {
448 AST_LIST_REMOVE_CURRENT(list);
450 ast_verb(2, "Unregistered channel type '%s'\n", tech->type);
454 AST_LIST_TRAVERSE_SAFE_END;
456 AST_RWLIST_UNLOCK(&channels);
459 /*! \brief Get handle to channel driver based on name */
460 const struct ast_channel_tech *ast_get_channel_tech(const char *name)
462 struct chanlist *chanls;
463 const struct ast_channel_tech *ret = NULL;
465 AST_RWLIST_RDLOCK(&channels);
467 AST_LIST_TRAVERSE(&backends, chanls, list) {
468 if (!strcasecmp(name, chanls->tech->type)) {
474 AST_RWLIST_UNLOCK(&channels);
479 /*! \brief Gives the string form of a given hangup cause */
480 const char *ast_cause2str(int cause)
484 for (x=0; x < sizeof(causes) / sizeof(causes[0]); x++) {
485 if (causes[x].cause == cause)
486 return causes[x].desc;
492 /*! \brief Convert a symbolic hangup cause to number */
493 int ast_str2cause(const char *name)
497 for (x = 0; x < sizeof(causes) / sizeof(causes[0]); x++)
498 if (strncasecmp(causes[x].name, name, strlen(causes[x].name)) == 0)
499 return causes[x].cause;
504 /*! \brief Gives the string form of a given channel state.
505 \note This function is not reentrant.
507 const char *ast_state2str(enum ast_channel_state state)
514 case AST_STATE_RESERVED:
516 case AST_STATE_OFFHOOK:
518 case AST_STATE_DIALING:
522 case AST_STATE_RINGING:
528 case AST_STATE_DIALING_OFFHOOK:
529 return "Dialing Offhook";
530 case AST_STATE_PRERING:
533 if (!(buf = ast_threadstorage_get(&state2str_threadbuf, STATE2STR_BUFSIZE)))
535 snprintf(buf, STATE2STR_BUFSIZE, "Unknown (%d)", state);
540 /*! \brief Gives the string form of a given transfer capability */
541 char *ast_transfercapability2str(int transfercapability)
543 switch (transfercapability) {
544 case AST_TRANS_CAP_SPEECH:
546 case AST_TRANS_CAP_DIGITAL:
548 case AST_TRANS_CAP_RESTRICTED_DIGITAL:
549 return "RESTRICTED_DIGITAL";
550 case AST_TRANS_CAP_3_1K_AUDIO:
552 case AST_TRANS_CAP_DIGITAL_W_TONES:
553 return "DIGITAL_W_TONES";
554 case AST_TRANS_CAP_VIDEO:
561 /*! \brief Pick the best audio codec */
562 int ast_best_codec(int fmts)
564 /* This just our opinion, expressed in code. We are asked to choose
565 the best codec to use, given no information */
567 static const int prefs[] =
569 /*! Okay, ulaw is used by all telephony equipment, so start with it */
571 /*! Unless of course, you're a silly European, so then prefer ALAW */
573 /*! G.722 is better then all below, but not as common as the above... so give ulaw and alaw priority */
575 /*! Okay, well, signed linear is easy to translate into other stuff */
576 AST_FORMAT_SLINEAR16,
578 /*! G.726 is standard ADPCM, in RFC3551 packing order */
580 /*! G.726 is standard ADPCM, in AAL2 packing order */
581 AST_FORMAT_G726_AAL2,
582 /*! ADPCM has great sound quality and is still pretty easy to translate */
584 /*! Okay, we're down to vocoders now, so pick GSM because it's small and easier to
585 translate and sounds pretty good */
587 /*! iLBC is not too bad */
589 /*! Speex is free, but computationally more expensive than GSM */
591 /*! Ick, LPC10 sounds terrible, but at least we have code for it, if you're tacky enough
594 /*! G.729a is faster than 723 and slightly less expensive */
596 /*! Down to G.723.1 which is proprietary but at least designed for voice */
600 /* Strip out video */
601 fmts &= AST_FORMAT_AUDIO_MASK;
603 /* Find the first preferred codec in the format given */
604 for (x = 0; x < (sizeof(prefs) / sizeof(prefs[0]) ); x++) {
609 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");
677 if (tmp->timingfd > -1)
678 close(tmp->timingfd);
680 sched_context_destroy(tmp->sched);
681 ast_string_field_free_memory(tmp);
685 flags = fcntl(tmp->alertpipe[0], F_GETFL);
686 fcntl(tmp->alertpipe[0], F_SETFL, flags | O_NONBLOCK);
687 flags = fcntl(tmp->alertpipe[1], F_GETFL);
688 fcntl(tmp->alertpipe[1], F_SETFL, flags | O_NONBLOCK);
690 } else /* Make sure we've got it done right if they don't */
691 tmp->alertpipe[0] = tmp->alertpipe[1] = -1;
693 /* Always watch the alertpipe */
694 ast_channel_set_fd(tmp, AST_ALERT_FD, tmp->alertpipe[0]);
695 /* And timing pipe */
696 ast_channel_set_fd(tmp, AST_TIMING_FD, tmp->timingfd);
697 ast_string_field_set(tmp, name, "**Unknown**");
704 tmp->fin = global_fin;
705 tmp->fout = global_fout;
707 if (ast_strlen_zero(ast_config_AST_SYSTEM_NAME)) {
708 ast_string_field_build(tmp, uniqueid, "%li.%d", (long) time(NULL),
709 ast_atomic_fetchadd_int(&uniqueint, 1));
711 ast_string_field_build(tmp, uniqueid, "%s-%li.%d", ast_config_AST_SYSTEM_NAME,
712 (long) time(NULL), ast_atomic_fetchadd_int(&uniqueint, 1));
715 tmp->cid.cid_name = ast_strdup(cid_name);
716 tmp->cid.cid_num = ast_strdup(cid_num);
718 if (!ast_strlen_zero(name_fmt)) {
719 /* Almost every channel is calling this function, and setting the name via the ast_string_field_build() call.
720 * And they all use slightly different formats for their name string.
721 * This means, to set the name here, we have to accept variable args, and call the string_field_build from here.
722 * This means, that the stringfields must have a routine that takes the va_lists directly, and
723 * uses them to build the string, instead of forming the va_lists internally from the vararg ... list.
724 * This new function was written so this can be accomplished.
726 va_start(ap1, name_fmt);
727 va_start(ap2, name_fmt);
728 ast_string_field_build_va(tmp, name, name_fmt, ap1, ap2);
733 /* Reminder for the future: under what conditions do we NOT want to track cdrs on channels? */
735 /* These 4 variables need to be set up for the cdr_init() to work right */
737 tmp->amaflags = amaflag;
739 tmp->amaflags = ast_default_amaflags;
741 if (!ast_strlen_zero(acctcode))
742 ast_string_field_set(tmp, accountcode, acctcode);
744 ast_string_field_set(tmp, accountcode, ast_default_accountcode);
746 if (!ast_strlen_zero(context))
747 ast_copy_string(tmp->context, context, sizeof(tmp->context));
749 strcpy(tmp->context, "default");
751 if (!ast_strlen_zero(exten))
752 ast_copy_string(tmp->exten, exten, sizeof(tmp->exten));
754 strcpy(tmp->exten, "s");
758 tmp->cdr = ast_cdr_alloc();
759 ast_cdr_init(tmp->cdr, tmp);
760 ast_cdr_start(tmp->cdr);
762 headp = &tmp->varshead;
763 AST_LIST_HEAD_INIT_NOLOCK(headp);
765 ast_mutex_init(&tmp->lock_dont_use);
767 AST_LIST_HEAD_INIT_NOLOCK(&tmp->datastores);
769 ast_string_field_set(tmp, language, defaultlanguage);
771 tmp->tech = &null_tech;
773 AST_RWLIST_WRLOCK(&channels);
774 AST_RWLIST_INSERT_HEAD(&channels, tmp, chan_list);
775 AST_RWLIST_UNLOCK(&channels);
778 * and now, since the channel structure is built, and has its name, let's
779 * call the manager event generator with this Newchannel event. This is the
780 * proper and correct place to make this call, but you sure do have to pass
781 * a lot of data into this func to do it here!
783 if (!ast_strlen_zero(name_fmt)) {
784 manager_event(EVENT_FLAG_CALL, "Newchannel",
786 "ChannelState: %d\r\n"
787 "ChannelStateDesc: %s\r\n"
788 "CallerIDNum: %s\r\n"
789 "CallerIDName: %s\r\n"
790 "AccountCode: %s\r\n"
794 ast_state2str(state),
804 /*! \brief Queue an outgoing media frame */
805 int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
808 struct ast_frame *cur;
812 /* Build us a copy and free the original one */
813 if (!(f = ast_frdup(fin))) {
814 ast_log(LOG_WARNING, "Unable to duplicate frame\n");
817 ast_channel_lock(chan);
819 /* See if the last frame on the queue is a hangup, if so don't queue anything */
820 if ((cur = AST_LIST_LAST(&chan->readq)) && (cur->frametype == AST_FRAME_CONTROL) && (cur->subclass == AST_CONTROL_HANGUP)) {
822 ast_channel_unlock(chan);
826 /* Count how many frames exist on the queue */
827 AST_LIST_TRAVERSE(&chan->readq, cur, frame_list) {
831 /* Allow up to 96 voice frames outstanding, and up to 128 total frames */
832 if (((fin->frametype == AST_FRAME_VOICE) && (qlen > 96)) || (qlen > 128)) {
833 if (fin->frametype != AST_FRAME_VOICE) {
834 ast_log(LOG_WARNING, "Exceptionally long queue length queuing to %s\n", chan->name);
837 ast_debug(1, "Dropping voice to exceptionally long queue on %s\n", chan->name);
839 ast_channel_unlock(chan);
843 AST_LIST_INSERT_TAIL(&chan->readq, f, frame_list);
844 if (chan->alertpipe[1] > -1) {
845 if (write(chan->alertpipe[1], &blah, sizeof(blah)) != sizeof(blah))
846 ast_log(LOG_WARNING, "Unable to write to alert pipe on %s, frametype/subclass %d/%d (qlen = %d): %s!\n",
847 chan->name, f->frametype, f->subclass, qlen, strerror(errno));
849 } else if (chan->timingfd > -1) {
850 ioctl(chan->timingfd, ZT_TIMERPING, &blah);
852 } else if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
853 pthread_kill(chan->blocker, SIGURG);
855 ast_channel_unlock(chan);
859 /*! \brief Queue a hangup frame for channel */
860 int ast_queue_hangup(struct ast_channel *chan)
862 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
863 /* Yeah, let's not change a lock-critical value without locking */
864 if (!ast_channel_trylock(chan)) {
865 chan->_softhangup |= AST_SOFTHANGUP_DEV;
866 ast_channel_unlock(chan);
868 return ast_queue_frame(chan, &f);
871 /*! \brief Queue a control frame */
872 int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
874 struct ast_frame f = { AST_FRAME_CONTROL, };
876 f.subclass = control;
878 return ast_queue_frame(chan, &f);
881 /*! \brief Queue a control frame with payload */
882 int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control,
883 const void *data, size_t datalen)
885 struct ast_frame f = { AST_FRAME_CONTROL, };
887 f.subclass = control;
888 f.data = (void *) data;
891 return ast_queue_frame(chan, &f);
894 /*! \brief Set defer DTMF flag on channel */
895 int ast_channel_defer_dtmf(struct ast_channel *chan)
900 pre = ast_test_flag(chan, AST_FLAG_DEFER_DTMF);
901 ast_set_flag(chan, AST_FLAG_DEFER_DTMF);
906 /*! \brief Unset defer DTMF flag on channel */
907 void ast_channel_undefer_dtmf(struct ast_channel *chan)
910 ast_clear_flag(chan, AST_FLAG_DEFER_DTMF);
914 * \brief Helper function to find channels.
916 * It supports these modes:
918 * prev != NULL : get channel next in list after prev
919 * name != NULL : get channel with matching name
920 * name != NULL && namelen != 0 : get channel whose name starts with prefix
921 * exten != NULL : get channel whose exten or macroexten matches
922 * context != NULL && exten != NULL : get channel whose context or macrocontext
924 * It returns with the channel's lock held. If getting the individual lock fails,
925 * unlock and retry quickly up to 10 times, then give up.
927 * \note XXX Note that this code has cost O(N) because of the need to verify
928 * that the object is still on the global list.
930 * \note XXX also note that accessing fields (e.g. c->name in ast_log())
931 * can only be done with the lock held or someone could delete the
932 * object while we work on it. This causes some ugliness in the code.
933 * Note that removing the first ast_log() may be harmful, as it would
934 * shorten the retry period and possibly cause failures.
935 * We should definitely go for a better scheme that is deadlock-free.
937 static struct ast_channel *channel_find_locked(const struct ast_channel *prev,
938 const char *name, const int namelen,
939 const char *context, const char *exten)
941 const char *msg = prev ? "deadlock" : "initial deadlock";
943 struct ast_channel *c;
944 const struct ast_channel *_prev = prev;
946 for (retries = 0; retries < 10; retries++) {
948 AST_RWLIST_RDLOCK(&channels);
949 AST_RWLIST_TRAVERSE(&channels, c, chan_list) {
951 if (prev) { /* look for next item */
952 if (c != prev) /* not this one */
954 /* found, prepare to return c->next */
955 if ((c = AST_RWLIST_NEXT(c, chan_list)) == NULL) break;
956 /* If prev was the last item on the channel list, then we just
957 * want to return NULL, instead of trying to deref NULL in the
961 /* We want prev to be NULL in case we end up doing more searching through
962 * the channel list to find the channel (ie: name searching). If we didn't
963 * set this to NULL the logic would just blow up
964 * XXX Need a better explanation for this ...
967 if (name) { /* want match by name */
968 if ((!namelen && strcasecmp(c->name, name) && strcmp(c->uniqueid, name)) ||
969 (namelen && strncasecmp(c->name, name, namelen)))
970 continue; /* name match failed */
972 if (context && strcasecmp(c->context, context) &&
973 strcasecmp(c->macrocontext, context))
974 continue; /* context match failed */
975 if (strcasecmp(c->exten, exten) &&
976 strcasecmp(c->macroexten, exten))
977 continue; /* exten match failed */
979 /* if we get here, c points to the desired record */
982 /* exit if chan not found or mutex acquired successfully */
983 /* this is slightly unsafe, as we _should_ hold the lock to access c->name */
984 done = c == NULL || ast_channel_trylock(c) == 0;
986 ast_debug(1, "Avoiding %s for channel '%p'\n", msg, c);
988 /* We are about to fail due to a deadlock, so report this
989 * while we still have the list lock.
991 ast_debug(1, "Failure, could not lock '%p' after %d retries!\n", c, retries);
992 /* As we have deadlocked, we will skip this channel and
993 * see if there is another match.
994 * NOTE: No point doing this for a full-name match,
995 * as there can be no more matches.
997 if (!(name && !namelen)) {
1003 AST_RWLIST_UNLOCK(&channels);
1006 /* If we reach this point we basically tried to lock a channel and failed. Instead of
1007 * starting from the beginning of the list we can restore our saved pointer to the previous
1008 * channel and start from there.
1011 usleep(1); /* give other threads a chance before retrying */
1017 /*! \brief Browse channels in use */
1018 struct ast_channel *ast_channel_walk_locked(const struct ast_channel *prev)
1020 return channel_find_locked(prev, NULL, 0, NULL, NULL);
1023 /*! \brief Get channel by name and lock it */
1024 struct ast_channel *ast_get_channel_by_name_locked(const char *name)
1026 return channel_find_locked(NULL, name, 0, NULL, NULL);
1029 /*! \brief Get channel by name prefix and lock it */
1030 struct ast_channel *ast_get_channel_by_name_prefix_locked(const char *name, const int namelen)
1032 return channel_find_locked(NULL, name, namelen, NULL, NULL);
1035 /*! \brief Get next channel by name prefix and lock it */
1036 struct ast_channel *ast_walk_channel_by_name_prefix_locked(const struct ast_channel *chan, const char *name,
1039 return channel_find_locked(chan, name, namelen, NULL, NULL);
1042 /*! \brief Get channel by exten (and optionally context) and lock it */
1043 struct ast_channel *ast_get_channel_by_exten_locked(const char *exten, const char *context)
1045 return channel_find_locked(NULL, NULL, 0, context, exten);
1048 /*! \brief Get next channel by exten (and optionally context) and lock it */
1049 struct ast_channel *ast_walk_channel_by_exten_locked(const struct ast_channel *chan, const char *exten,
1050 const char *context)
1052 return channel_find_locked(chan, NULL, 0, context, exten);
1055 /*! \brief Wait, look for hangups and condition arg */
1056 int ast_safe_sleep_conditional(struct ast_channel *chan, int ms, int (*cond)(void*), void *data)
1058 struct ast_frame *f;
1061 if (cond && ((*cond)(data) == 0))
1063 ms = ast_waitfor(chan, ms);
1076 /*! \brief Wait, look for hangups */
1077 int ast_safe_sleep(struct ast_channel *chan, int ms)
1079 return ast_safe_sleep_conditional(chan, ms, NULL, NULL);
1082 static void free_cid(struct ast_callerid *cid)
1085 ast_free(cid->cid_dnid);
1087 ast_free(cid->cid_num);
1089 ast_free(cid->cid_name);
1091 ast_free(cid->cid_ani);
1093 ast_free(cid->cid_rdnis);
1094 cid->cid_dnid = cid->cid_num = cid->cid_name = cid->cid_ani = cid->cid_rdnis = NULL;
1097 /*! \brief Free a channel structure */
1098 void ast_channel_free(struct ast_channel *chan)
1104 struct ast_var_t *vardata;
1105 struct ast_frame *f;
1106 struct varshead *headp;
1107 struct ast_datastore *datastore = NULL;
1108 char name[AST_CHANNEL_NAME];
1110 headp=&chan->varshead;
1112 AST_RWLIST_WRLOCK(&channels);
1113 if (!AST_RWLIST_REMOVE(&channels, chan, chan_list)) {
1114 AST_RWLIST_UNLOCK(&channels);
1115 ast_log(LOG_ERROR, "Unable to find channel in list to free. Assuming it has already been done.\n");
1117 /* Lock and unlock the channel just to be sure nobody
1118 has it locked still */
1119 ast_channel_lock(chan);
1120 ast_channel_unlock(chan);
1121 if (chan->tech_pvt) {
1122 ast_log(LOG_WARNING, "Channel '%s' may not have been hung up properly\n", chan->name);
1123 ast_free(chan->tech_pvt);
1127 sched_context_destroy(chan->sched);
1129 ast_copy_string(name, chan->name, sizeof(name));
1131 /* Stop monitoring */
1133 chan->monitor->stop( chan, 0 );
1135 /* If there is native format music-on-hold state, free it */
1136 if (chan->music_state)
1137 ast_moh_cleanup(chan);
1139 /* Free translators */
1140 if (chan->readtrans)
1141 ast_translator_free_path(chan->readtrans);
1142 if (chan->writetrans)
1143 ast_translator_free_path(chan->writetrans);
1145 ast_log(LOG_WARNING, "PBX may not have been terminated properly on '%s'\n", chan->name);
1146 free_cid(&chan->cid);
1147 ast_mutex_destroy(&chan->lock_dont_use);
1148 /* Close pipes if appropriate */
1149 if ((fd = chan->alertpipe[0]) > -1)
1151 if ((fd = chan->alertpipe[1]) > -1)
1153 if ((fd = chan->timingfd) > -1)
1156 for (i = 0; i < AST_MAX_FDS; i++) {
1157 if (chan->epfd_data[i])
1158 free(chan->epfd_data[i]);
1162 while ((f = AST_LIST_REMOVE_HEAD(&chan->readq, frame_list)))
1165 /* Get rid of each of the data stores on the channel */
1166 while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry)))
1167 /* Free the data store */
1168 ast_channel_datastore_free(datastore);
1169 AST_LIST_HEAD_INIT_NOLOCK(&chan->datastores);
1171 /* loop over the variables list, freeing all data and deleting list items */
1172 /* no need to lock the list, as the channel is already locked */
1174 while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
1175 ast_var_delete(vardata);
1177 ast_app_group_discard(chan);
1179 /* Destroy the jitterbuffer */
1180 ast_jb_destroy(chan);
1182 ast_string_field_free_memory(chan);
1184 AST_RWLIST_UNLOCK(&channels);
1186 ast_device_state_changed_literal(name);
1189 struct ast_datastore *ast_channel_datastore_alloc(const struct ast_datastore_info *info, const char *uid)
1191 struct ast_datastore *datastore = NULL;
1193 /* Make sure we at least have type so we can identify this */
1198 /* Allocate memory for datastore and clear it */
1199 datastore = ast_calloc(1, sizeof(*datastore));
1204 datastore->info = info;
1206 datastore->uid = ast_strdup(uid);
1211 int ast_channel_datastore_free(struct ast_datastore *datastore)
1215 /* Using the destroy function (if present) destroy the data */
1216 if (datastore->info->destroy != NULL && datastore->data != NULL) {
1217 datastore->info->destroy(datastore->data);
1218 datastore->data = NULL;
1221 /* Free allocated UID memory */
1222 if (datastore->uid != NULL) {
1223 ast_free((void *) datastore->uid);
1224 datastore->uid = NULL;
1227 /* Finally free memory used by ourselves */
1228 ast_free(datastore);
1233 int ast_channel_datastore_inherit(struct ast_channel *from, struct ast_channel *to)
1235 struct ast_datastore *datastore = NULL, *datastore2;
1237 AST_LIST_TRAVERSE(&from->datastores, datastore, entry) {
1238 if (datastore->inheritance > 0) {
1239 datastore2 = ast_channel_datastore_alloc(datastore->info, datastore->uid);
1241 datastore2->data = datastore->info->duplicate(datastore->data);
1242 datastore2->inheritance = datastore->inheritance == DATASTORE_INHERIT_FOREVER ? DATASTORE_INHERIT_FOREVER : datastore->inheritance - 1;
1243 AST_LIST_INSERT_TAIL(&to->datastores, datastore2, entry);
1250 int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
1254 AST_LIST_INSERT_HEAD(&chan->datastores, datastore, entry);
1259 int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
1261 return AST_LIST_REMOVE(&chan->datastores, datastore, entry) ? 0 : -1;
1264 struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
1266 struct ast_datastore *datastore = NULL;
1271 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, entry) {
1272 if (datastore->info == info) {
1273 if (uid != NULL && datastore->uid != NULL) {
1274 if (!strcasecmp(uid, datastore->uid)) {
1275 /* Matched by type AND uid */
1279 /* Matched by type at least */
1284 AST_LIST_TRAVERSE_SAFE_END
1289 /*! Set the file descriptor on the channel */
1290 void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
1293 struct epoll_event ev;
1294 struct ast_epoll_data *aed = NULL;
1296 if (chan->fds[which] > -1) {
1297 epoll_ctl(chan->epfd, EPOLL_CTL_DEL, chan->fds[which], &ev);
1298 aed = chan->epfd_data[which];
1301 /* If this new fd is valid, add it to the epoll */
1303 if (!aed && (!(aed = ast_calloc(1, sizeof(*aed)))))
1306 chan->epfd_data[which] = aed;
1310 ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP;
1312 epoll_ctl(chan->epfd, EPOLL_CTL_ADD, fd, &ev);
1314 /* We don't have to keep around this epoll data structure now */
1316 chan->epfd_data[which] = NULL;
1319 chan->fds[which] = fd;
1323 /*! Add a channel to an optimized waitfor */
1324 void ast_poll_channel_add(struct ast_channel *chan0, struct ast_channel *chan1)
1327 struct epoll_event ev;
1330 if (chan0->epfd == -1)
1333 /* Iterate through the file descriptors on chan1, adding them to chan0 */
1334 for (i = 0; i < AST_MAX_FDS; i++) {
1335 if (chan1->fds[i] == -1)
1337 ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP;
1338 ev.data.ptr = chan1->epfd_data[i];
1339 epoll_ctl(chan0->epfd, EPOLL_CTL_ADD, chan1->fds[i], &ev);
1346 /*! Delete a channel from an optimized waitfor */
1347 void ast_poll_channel_del(struct ast_channel *chan0, struct ast_channel *chan1)
1350 struct epoll_event ev;
1353 if (chan0->epfd == -1)
1356 for (i = 0; i < AST_MAX_FDS; i++) {
1357 if (chan1->fds[i] == -1)
1359 epoll_ctl(chan0->epfd, EPOLL_CTL_DEL, chan1->fds[i], &ev);
1366 /*! \brief Softly hangup a channel, don't lock */
1367 int ast_softhangup_nolock(struct ast_channel *chan, int cause)
1369 ast_debug(1, "Soft-Hanging up channel '%s'\n", chan->name);
1370 /* Inform channel driver that we need to be hung up, if it cares */
1371 chan->_softhangup |= cause;
1372 ast_queue_frame(chan, &ast_null_frame);
1373 /* Interrupt any poll call or such */
1374 if (ast_test_flag(chan, AST_FLAG_BLOCKING))
1375 pthread_kill(chan->blocker, SIGURG);
1379 /*! \brief Softly hangup a channel, lock */
1380 int ast_softhangup(struct ast_channel *chan, int cause)
1383 ast_channel_lock(chan);
1384 res = ast_softhangup_nolock(chan, cause);
1385 ast_channel_unlock(chan);
1389 static void free_translation(struct ast_channel *clone)
1391 if (clone->writetrans)
1392 ast_translator_free_path(clone->writetrans);
1393 if (clone->readtrans)
1394 ast_translator_free_path(clone->readtrans);
1395 clone->writetrans = NULL;
1396 clone->readtrans = NULL;
1397 clone->rawwriteformat = clone->nativeformats;
1398 clone->rawreadformat = clone->nativeformats;
1401 /*! \brief Hangup a channel */
1402 int ast_hangup(struct ast_channel *chan)
1405 struct ast_cdr *cdr = NULL;
1407 /* Don't actually hang up a channel that will masquerade as someone else, or
1408 if someone is going to masquerade as us */
1409 ast_channel_lock(chan);
1411 if (chan->audiohooks) {
1412 ast_audiohook_detach_list(chan->audiohooks);
1413 chan->audiohooks = NULL;
1416 ast_autoservice_stop(chan);
1419 if (ast_do_masquerade(chan))
1420 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
1424 ast_log(LOG_WARNING, "%s getting hung up, but someone is trying to masq into us?!?\n", chan->name);
1425 ast_channel_unlock(chan);
1428 /* If this channel is one which will be masqueraded into something,
1429 mark it as a zombie already, so we know to free it later */
1431 ast_set_flag(chan, AST_FLAG_ZOMBIE);
1432 ast_channel_unlock(chan);
1435 free_translation(chan);
1436 /* Close audio stream */
1438 ast_closestream(chan->stream);
1439 chan->stream = NULL;
1441 /* Close video stream */
1442 if (chan->vstream) {
1443 ast_closestream(chan->vstream);
1444 chan->vstream = NULL;
1447 sched_context_destroy(chan->sched);
1451 if (chan->generatordata) /* Clear any tone stuff remaining */
1452 if (chan->generator && chan->generator->release)
1453 chan->generator->release(chan, chan->generatordata);
1454 chan->generatordata = NULL;
1455 chan->generator = NULL;
1456 if (chan->cdr) { /* End the CDR if it hasn't already */
1457 ast_cdr_end(chan->cdr);
1461 if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
1462 ast_log(LOG_WARNING, "Hard hangup called by thread %ld on %s, while fd "
1463 "is blocked by thread %ld in procedure %s! Expect a failure\n",
1464 (long)pthread_self(), chan->name, (long)chan->blocker, chan->blockproc);
1467 if (!ast_test_flag(chan, AST_FLAG_ZOMBIE)) {
1468 ast_debug(1, "Hanging up channel '%s'\n", chan->name);
1469 if (chan->tech->hangup)
1470 res = chan->tech->hangup(chan);
1472 ast_debug(1, "Hanging up zombie '%s'\n", chan->name);
1475 ast_channel_unlock(chan);
1476 manager_event(EVENT_FLAG_CALL, "Hangup",
1479 "CallerIDNum: %s\r\n"
1480 "CallerIDName: %s\r\n"
1482 "Cause-txt: %s\r\n",
1485 S_OR(chan->cid.cid_num, "<unknown>"),
1486 S_OR(chan->cid.cid_name, "<unknown>"),
1488 ast_cause2str(chan->hangupcause)
1490 ast_channel_free(chan);
1493 ast_cdr_detach(cdr);
1498 int __ast_answer(struct ast_channel *chan, unsigned int delay)
1502 ast_channel_lock(chan);
1504 /* You can't answer an outbound call */
1505 if (ast_test_flag(chan, AST_FLAG_OUTGOING)) {
1506 ast_channel_unlock(chan);
1510 /* Stop if we're a zombie or need a soft hangup */
1511 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
1512 ast_channel_unlock(chan);
1516 switch (chan->_state) {
1517 case AST_STATE_RINGING:
1518 case AST_STATE_RING:
1519 if (chan->tech->answer)
1520 res = chan->tech->answer(chan);
1521 ast_setstate(chan, AST_STATE_UP);
1522 ast_cdr_answer(chan->cdr);
1523 ast_channel_unlock(chan);
1525 ast_safe_sleep(chan, delay);
1529 ast_cdr_answer(chan->cdr);
1534 chan->visible_indication = 0;
1535 ast_channel_unlock(chan);
1540 int ast_answer(struct ast_channel *chan)
1542 return __ast_answer(chan, 500);
1545 void ast_deactivate_generator(struct ast_channel *chan)
1547 ast_channel_lock(chan);
1548 if (chan->generatordata) {
1549 if (chan->generator && chan->generator->release)
1550 chan->generator->release(chan, chan->generatordata);
1551 chan->generatordata = NULL;
1552 chan->generator = NULL;
1553 ast_channel_set_fd(chan, AST_GENERATOR_FD, -1);
1554 ast_clear_flag(chan, AST_FLAG_WRITE_INT);
1555 ast_settimeout(chan, 0, NULL, NULL);
1557 ast_channel_unlock(chan);
1560 static int generator_force(const void *data)
1562 /* Called if generator doesn't have data */
1565 int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples);
1566 struct ast_channel *chan = (struct ast_channel *)data;
1567 tmp = chan->generatordata;
1568 chan->generatordata = NULL;
1569 generate = chan->generator->generate;
1570 res = generate(chan, tmp, 0, 160);
1571 chan->generatordata = tmp;
1573 ast_debug(1, "Auto-deactivating generator\n");
1574 ast_deactivate_generator(chan);
1579 int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
1583 ast_channel_lock(chan);
1585 if (chan->generatordata) {
1586 if (chan->generator && chan->generator->release)
1587 chan->generator->release(chan, chan->generatordata);
1588 chan->generatordata = NULL;
1592 if (gen->alloc && !(chan->generatordata = gen->alloc(chan, params))) {
1597 ast_settimeout(chan, 160, generator_force, chan);
1598 chan->generator = gen;
1601 ast_channel_unlock(chan);
1606 /*! \brief Wait for x amount of time on a file descriptor to have input. */
1607 int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception)
1610 ast_waitfor_nandfds(NULL, 0, fds, n, exception, &winner, ms);
1614 /*! \brief Wait for x amount of time on a file descriptor to have input. */
1616 static struct ast_channel *ast_waitfor_nandfds_classic(struct ast_channel **c, int n, int *fds, int nfds,
1617 int *exception, int *outfd, int *ms)
1619 struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
1620 int *exception, int *outfd, int *ms)
1623 struct timeval start = { 0 , 0 };
1624 struct pollfd *pfds;
1630 long whentohangup = 0, diff;
1631 struct ast_channel *winner = NULL;
1637 sz = n * AST_MAX_FDS + nfds;
1638 pfds = alloca(sizeof(*pfds) * sz);
1639 fdmap = alloca(sizeof(*fdmap) * sz);
1646 /* Perform any pending masquerades */
1647 for (x = 0; x < n; x++) {
1648 ast_channel_lock(c[x]);
1649 if (c[x]->masq && ast_do_masquerade(c[x])) {
1650 ast_log(LOG_WARNING, "Masquerade failed\n");
1652 ast_channel_unlock(c[x]);
1655 if (c[x]->whentohangup) {
1658 diff = c[x]->whentohangup - now;
1660 /* Should already be hungup */
1661 c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1662 ast_channel_unlock(c[x]);
1665 if (!whentohangup || (diff < whentohangup))
1666 whentohangup = diff;
1668 ast_channel_unlock(c[x]);
1670 /* Wait full interval */
1673 rms = whentohangup * 1000; /* timeout in milliseconds */
1674 if (*ms >= 0 && *ms < rms) /* original *ms still smaller */
1678 * Build the pollfd array, putting the channels' fds first,
1679 * followed by individual fds. Order is important because
1680 * individual fd's must have priority over channel fds.
1683 for (x = 0; x < n; x++) {
1684 for (y = 0; y < AST_MAX_FDS; y++) {
1685 fdmap[max].fdno = y; /* fd y is linked to this pfds */
1686 fdmap[max].chan = x; /* channel x is linked to this pfds */
1687 max += ast_add_fd(&pfds[max], c[x]->fds[y]);
1689 CHECK_BLOCKING(c[x]);
1691 /* Add the individual fds */
1692 for (x = 0; x < nfds; x++) {
1693 fdmap[max].chan = -1;
1694 max += ast_add_fd(&pfds[max], fds[x]);
1698 start = ast_tvnow();
1700 if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
1705 res = poll(pfds, max, kbrms);
1708 } while (!res && (rms > 0));
1710 res = poll(pfds, max, rms);
1712 for (x = 0; x < n; x++)
1713 ast_clear_flag(c[x], AST_FLAG_BLOCKING);
1714 if (res < 0) { /* Simulate a timeout if we were interrupted */
1719 if (whentohangup) { /* if we have a timeout, check who expired */
1721 for (x = 0; x < n; x++) {
1722 if (c[x]->whentohangup && now >= c[x]->whentohangup) {
1723 c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1729 if (res == 0) { /* no fd ready, reset timeout and done */
1730 *ms = 0; /* XXX use 0 since we may not have an exact timeout. */
1734 * Then check if any channel or fd has a pending event.
1735 * Remember to check channels first and fds last, as they
1736 * must have priority on setting 'winner'
1738 for (x = 0; x < max; x++) {
1739 res = pfds[x].revents;
1742 if (fdmap[x].chan >= 0) { /* this is a channel */
1743 winner = c[fdmap[x].chan]; /* override previous winners */
1745 ast_set_flag(winner, AST_FLAG_EXCEPTION);
1747 ast_clear_flag(winner, AST_FLAG_EXCEPTION);
1748 winner->fdno = fdmap[x].fdno;
1749 } else { /* this is an fd */
1751 *outfd = pfds[x].fd;
1753 *exception = (res & POLLPRI) ? -1 : 0;
1758 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
1766 static struct ast_channel *ast_waitfor_nandfds_simple(struct ast_channel *chan, int *ms)
1768 struct timeval start = { 0 , 0 };
1770 struct epoll_event ev[1];
1771 long whentohangup = 0, rms = *ms;
1773 struct ast_channel *winner = NULL;
1774 struct ast_epoll_data *aed = NULL;
1776 ast_channel_lock(chan);
1778 /* See if this channel needs to be masqueraded */
1779 if (chan->masq && ast_do_masquerade(chan)) {
1780 ast_log(LOG_WARNING, "Failed to perform masquerade on %s\n", chan->name);
1782 ast_channel_unlock(chan);
1786 /* Figure out their timeout */
1787 if (chan->whentohangup) {
1789 if ((whentohangup = chan->whentohangup - now) < 1) {
1790 /* They should already be hungup! */
1791 chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1792 ast_channel_unlock(chan);
1795 /* If this value is smaller then the current one... make it priority */
1796 whentohangup *= 1000;
1797 if (rms > whentohangup)
1801 ast_channel_unlock(chan);
1803 /* Time to make this channel block... */
1804 CHECK_BLOCKING(chan);
1807 start = ast_tvnow();
1809 /* We don't have to add any file descriptors... they are already added, we just have to wait! */
1810 res = epoll_wait(chan->epfd, ev, 1, rms);
1813 ast_clear_flag(chan, AST_FLAG_BLOCKING);
1815 /* Simulate a timeout if we were interrupted */
1822 /* If this channel has a timeout see if it expired */
1823 if (chan->whentohangup) {
1825 if (now >= chan->whentohangup) {
1826 chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1831 /* No fd ready, reset timeout and be done for now */
1837 /* See what events are pending */
1838 aed = ev[0].data.ptr;
1839 chan->fdno = aed->which;
1840 if (ev[0].events & EPOLLPRI)
1841 ast_set_flag(chan, AST_FLAG_EXCEPTION);
1843 ast_clear_flag(chan, AST_FLAG_EXCEPTION);
1846 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
1854 static struct ast_channel *ast_waitfor_nandfds_complex(struct ast_channel **c, int n, int *ms)
1856 struct timeval start = { 0 , 0 };
1858 struct epoll_event ev[25] = { { 0, } };
1859 long whentohangup = 0, diff, rms = *ms;
1861 struct ast_channel *winner = NULL;
1863 for (i = 0; i < n; i++) {
1864 ast_channel_lock(c[i]);
1865 if (c[i]->masq && ast_do_masquerade(c[i])) {
1866 ast_log(LOG_WARNING, "Masquerade failed\n");
1868 ast_channel_unlock(c[i]);
1871 if (c[i]->whentohangup) {
1874 if ((diff = c[i]->whentohangup - now) < 1) {
1875 c[i]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1876 ast_channel_unlock(c[i]);
1879 if (!whentohangup || (diff < whentohangup))
1880 whentohangup = diff;
1882 ast_channel_unlock(c[i]);
1883 CHECK_BLOCKING(c[i]);
1888 rms = whentohangup * 1000;
1889 if (*ms >= 0 && *ms < rms)
1894 start = ast_tvnow();
1896 res = epoll_wait(c[0]->epfd, ev, 25, rms);
1898 for (i = 0; i < n; i++)
1899 ast_clear_flag(c[i], AST_FLAG_BLOCKING);
1909 for (i = 0; i < n; i++) {
1910 if (c[i]->whentohangup && now >= c[i]->whentohangup) {
1911 c[i]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1923 for (i = 0; i < res; i++) {
1924 struct ast_epoll_data *aed = ev[i].data.ptr;
1926 if (!ev[i].events || !aed)
1930 if (ev[i].events & EPOLLPRI)
1931 ast_set_flag(winner, AST_FLAG_EXCEPTION);
1933 ast_clear_flag(winner, AST_FLAG_EXCEPTION);
1934 winner->fdno = aed->which;
1938 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
1946 struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
1947 int *exception, int *outfd, int *ms)
1949 /* Clear all provided values in one place. */
1955 /* If no epoll file descriptor is available resort to classic nandfds */
1956 if (!n || nfds || c[0]->epfd == -1)
1957 return ast_waitfor_nandfds_classic(c, n, fds, nfds, exception, outfd, ms);
1958 else if (!nfds && n == 1)
1959 return ast_waitfor_nandfds_simple(c[0], ms);
1961 return ast_waitfor_nandfds_complex(c, n, ms);
1965 struct ast_channel *ast_waitfor_n(struct ast_channel **c, int n, int *ms)
1967 return ast_waitfor_nandfds(c, n, NULL, 0, NULL, NULL, ms);
1970 int ast_waitfor(struct ast_channel *c, int ms)
1972 int oldms = ms; /* -1 if no timeout */
1974 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
1975 if ((ms < 0) && (oldms < 0))
1980 /* XXX never to be called with ms = -1 */
1981 int ast_waitfordigit(struct ast_channel *c, int ms)
1983 return ast_waitfordigit_full(c, ms, -1, -1);
1986 int ast_settimeout(struct ast_channel *c, int samples, int (*func)(const void *data), void *data)
1990 if (c->timingfd > -1) {
1995 ast_debug(1, "Scheduling timer at %d sample intervals\n", samples);
1996 res = ioctl(c->timingfd, ZT_TIMERCONFIG, &samples);
1997 c->timingfunc = func;
1998 c->timingdata = data;
2004 int ast_waitfordigit_full(struct ast_channel *c, int ms, int audiofd, int cmdfd)
2006 /* Stop if we're a zombie or need a soft hangup */
2007 if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
2010 /* Only look for the end of DTMF, don't bother with the beginning and don't emulate things */
2011 ast_set_flag(c, AST_FLAG_END_DTMF_ONLY);
2013 /* Wait for a digit, no more than ms milliseconds total. */
2016 struct ast_channel *rchan;
2020 rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
2022 if (!rchan && outfd < 0 && ms) {
2023 if (errno == 0 || errno == EINTR)
2025 ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
2026 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
2028 } else if (outfd > -1) {
2029 /* The FD we were watching has something waiting */
2030 ast_log(LOG_WARNING, "The FD we were waiting for has something waiting. Waitfordigit returning numeric 1\n");
2031 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
2035 struct ast_frame *f = ast_read(c);
2039 switch (f->frametype) {
2040 case AST_FRAME_DTMF_BEGIN:
2042 case AST_FRAME_DTMF_END:
2045 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
2047 case AST_FRAME_CONTROL:
2048 switch (f->subclass) {
2049 case AST_CONTROL_HANGUP:
2051 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
2053 case AST_CONTROL_RINGING:
2054 case AST_CONTROL_ANSWER:
2058 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", f->subclass);
2062 case AST_FRAME_VOICE:
2063 /* Write audio if appropriate */
2065 write(audiofd, f->data, f->datalen);
2074 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
2076 return 0; /* Time is up */
2079 static void send_dtmf_event(const struct ast_channel *chan, const char *direction, const char digit, const char *begin, const char *end)
2081 manager_event(EVENT_FLAG_DTMF,
2089 chan->name, chan->uniqueid, digit, direction, begin, end);
2092 static void ast_read_generator_actions(struct ast_channel *chan, struct ast_frame *f)
2094 if (chan->generatordata && !ast_internal_timing_enabled(chan)) {
2095 void *tmp = chan->generatordata;
2098 if (chan->timingfunc) {
2099 if (option_debug > 1)
2100 ast_log(LOG_DEBUG, "Generator got voice, switching to phase locked mode\n");
2101 ast_settimeout(chan, 0, NULL, NULL);
2104 chan->generatordata = NULL; /* reset, to let writes go through */
2105 res = chan->generator->generate(chan, tmp, f->datalen, f->samples);
2106 chan->generatordata = tmp;
2108 if (option_debug > 1)
2109 ast_log(LOG_DEBUG, "Auto-deactivating generator\n");
2110 ast_deactivate_generator(chan);
2113 } else if (f->frametype == AST_FRAME_CNG) {
2114 if (chan->generator && !chan->timingfunc && (chan->timingfd > -1)) {
2115 if (option_debug > 1)
2116 ast_log(LOG_DEBUG, "Generator got CNG, switching to timed mode\n");
2117 ast_settimeout(chan, 160, generator_force, chan);
2122 static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
2124 struct ast_frame *f = NULL; /* the return value */
2129 /* this function is very long so make sure there is only one return
2130 * point at the end (there are only two exceptions to this).
2132 while(ast_channel_trylock(chan)) {
2134 /*cannot goto done since the channel is not locked*/
2135 return &ast_null_frame;
2140 if (ast_do_masquerade(chan))
2141 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
2143 f = &ast_null_frame;
2147 /* Stop if we're a zombie or need a soft hangup */
2148 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
2149 if (chan->generator)
2150 ast_deactivate_generator(chan);
2153 prestate = chan->_state;
2155 if (!ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_EMULATE_DTMF | AST_FLAG_IN_DTMF) &&
2156 !ast_strlen_zero(chan->dtmfq) &&
2157 (ast_tvzero(chan->dtmf_tv) || ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) > AST_MIN_DTMF_GAP) ) {
2158 /* We have DTMF that has been deferred. Return it now */
2159 chan->dtmff.subclass = chan->dtmfq[0];
2160 /* Drop first digit from the buffer */
2161 memmove(chan->dtmfq, chan->dtmfq + 1, sizeof(chan->dtmfq) - 1);
2163 if (ast_test_flag(chan, AST_FLAG_END_DTMF_ONLY)) {
2164 ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass, chan->name);
2165 chan->dtmff.frametype = AST_FRAME_DTMF_END;
2167 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);
2168 chan->dtmff.frametype = AST_FRAME_DTMF_BEGIN;
2169 ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
2170 chan->emulate_dtmf_digit = f->subclass;
2171 chan->emulate_dtmf_duration = AST_DEFAULT_EMULATE_DTMF_DURATION;
2173 chan->dtmf_tv = ast_tvnow();
2177 /* Read and ignore anything on the alertpipe, but read only
2178 one sizeof(blah) per frame that we send from it */
2179 if (chan->alertpipe[0] > -1)
2180 read(chan->alertpipe[0], &blah, sizeof(blah));
2183 if (chan->timingfd > -1 && chan->fdno == AST_TIMING_FD && ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
2186 ast_clear_flag(chan, AST_FLAG_EXCEPTION);
2188 /* IF we can't get event, assume it's an expired as-per the old interface */
2189 res = ioctl(chan->timingfd, ZT_GETEVENT, &blah);
2191 blah = ZT_EVENT_TIMER_EXPIRED;
2193 if (blah == ZT_EVENT_TIMER_PING) {
2194 if (AST_LIST_EMPTY(&chan->readq) || !AST_LIST_NEXT(AST_LIST_FIRST(&chan->readq), frame_list)) {
2195 /* Acknowledge PONG unless we need it again */
2196 if (ioctl(chan->timingfd, ZT_TIMERPONG, &blah)) {
2197 ast_log(LOG_WARNING, "Failed to pong timer on '%s': %s\n", chan->name, strerror(errno));
2200 } else if (blah == ZT_EVENT_TIMER_EXPIRED) {
2201 ioctl(chan->timingfd, ZT_TIMERACK, &blah);
2202 if (chan->timingfunc) {
2203 chan->timingfunc(chan->timingdata);
2206 ioctl(chan->timingfd, ZT_TIMERCONFIG, &blah);
2207 chan->timingdata = NULL;
2209 ast_channel_unlock(chan);
2210 /* cannot 'goto done' because the channel is already unlocked */
2211 return &ast_null_frame;
2213 ast_log(LOG_NOTICE, "No/unknown event '%d' on timer for '%s'?\n", blah, chan->name);
2216 if (chan->fds[AST_GENERATOR_FD] > -1 && chan->fdno == AST_GENERATOR_FD) {
2217 /* if the AST_GENERATOR_FD is set, call the generator with args
2218 * set to -1 so it can do whatever it needs to.
2220 void *tmp = chan->generatordata;
2221 chan->generatordata = NULL; /* reset to let ast_write get through */
2222 chan->generator->generate(chan, tmp, -1, -1);
2223 chan->generatordata = tmp;
2224 f = &ast_null_frame;
2228 /* Check for pending read queue */
2229 if (!AST_LIST_EMPTY(&chan->readq)) {
2230 f = AST_LIST_REMOVE_HEAD(&chan->readq, frame_list);
2231 /* Interpret hangup and return NULL */
2232 /* XXX why not the same for frames from the channel ? */
2233 if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP) {
2238 chan->blocker = pthread_self();
2239 if (ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
2240 if (chan->tech->exception)
2241 f = chan->tech->exception(chan);
2243 ast_log(LOG_WARNING, "Exception flag set on '%s', but no exception handler\n", chan->name);
2244 f = &ast_null_frame;
2246 /* Clear the exception flag */
2247 ast_clear_flag(chan, AST_FLAG_EXCEPTION);
2248 } else if (chan->tech->read)
2249 f = chan->tech->read(chan);
2251 ast_log(LOG_WARNING, "No read routine on channel %s\n", chan->name);
2255 /* if the channel driver returned more than one frame, stuff the excess
2256 into the readq for the next ast_read call (note that we can safely assume
2257 that the readq is empty, because otherwise we would not have called into
2258 the channel driver and f would be only a single frame)
2260 if (AST_LIST_NEXT(f, frame_list)) {
2261 AST_LIST_HEAD_SET_NOLOCK(&chan->readq, AST_LIST_NEXT(f, frame_list));
2262 AST_LIST_NEXT(f, frame_list) = NULL;
2265 switch (f->frametype) {
2266 case AST_FRAME_CONTROL:
2267 if (f->subclass == AST_CONTROL_ANSWER) {
2268 if (!ast_test_flag(chan, AST_FLAG_OUTGOING)) {
2269 ast_debug(1, "Ignoring answer on an inbound call!\n");
2271 f = &ast_null_frame;
2272 } else if (prestate == AST_STATE_UP) {
2273 ast_debug(1, "Dropping duplicate answer!\n");
2275 f = &ast_null_frame;
2277 /* Answer the CDR */
2278 ast_setstate(chan, AST_STATE_UP);
2279 if (!chan->cdr) { /* up till now, this insertion hasn't been done. Therefore,
2280 to keep from throwing off the basic order of the universe,
2281 we will try to keep this cdr from getting posted. */
2282 chan->cdr = ast_cdr_alloc();
2283 ast_cdr_init(chan->cdr, chan);
2284 ast_cdr_start(chan->cdr);
2287 ast_cdr_answer(chan->cdr);
2291 case AST_FRAME_DTMF_END:
2292 send_dtmf_event(chan, "Received", f->subclass, "No", "Yes");
2293 ast_log(LOG_DTMF, "DTMF end '%c' received on %s, duration %ld ms\n", f->subclass, chan->name, f->len);
2294 /* Queue it up if DTMF is deffered, or if DTMF emulation is forced.
2295 * However, only let emulation be forced if the other end cares about BEGIN frames */
2296 if ( ast_test_flag(chan, AST_FLAG_DEFER_DTMF) ||
2297 (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !ast_test_flag(chan, AST_FLAG_END_DTMF_ONLY)) ) {
2298 if (strlen(chan->dtmfq) < sizeof(chan->dtmfq) - 2) {
2299 ast_log(LOG_DTMF, "DTMF end '%c' put into dtmf queue on %s\n", f->subclass, chan->name);
2300 chan->dtmfq[strlen(chan->dtmfq)] = f->subclass;
2302 ast_log(LOG_WARNING, "Dropping deferred DTMF digits on %s\n", chan->name);
2304 f = &ast_null_frame;
2305 } else if (!ast_test_flag(chan, AST_FLAG_IN_DTMF | AST_FLAG_END_DTMF_ONLY)) {
2306 if (!ast_tvzero(chan->dtmf_tv) &&
2307 ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) < AST_MIN_DTMF_GAP) {
2308 /* If it hasn't been long enough, defer this digit */
2309 if (strlen(chan->dtmfq) < sizeof(chan->dtmfq) - 2) {
2310 ast_log(LOG_DTMF, "DTMF end '%c' put into dtmf queue on %s\n", f->subclass, chan->name);
2311 chan->dtmfq[strlen(chan->dtmfq)] = f->subclass;
2313 ast_log(LOG_WARNING, "Dropping deferred DTMF digits on %s\n", chan->name);
2315 f = &ast_null_frame;
2317 /* There was no begin, turn this into a begin and send the end later */
2318 f->frametype = AST_FRAME_DTMF_BEGIN;
2319 ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
2320 chan->emulate_dtmf_digit = f->subclass;
2321 chan->dtmf_tv = ast_tvnow();
2323 if (f->len > AST_MIN_DTMF_DURATION)
2324 chan->emulate_dtmf_duration = f->len;
2326 chan->emulate_dtmf_duration = AST_MIN_DTMF_DURATION;
2328 chan->emulate_dtmf_duration = AST_DEFAULT_EMULATE_DTMF_DURATION;
2329 ast_log(LOG_DTMF, "DTMF begin emulation of '%c' with duration %u queued on %s\n", f->subclass, chan->emulate_dtmf_duration, chan->name);
2331 if (chan->audiohooks) {
2332 struct ast_frame *old_frame = f;
2334 * \todo XXX It is possible to write a digit to the audiohook twice
2335 * if the digit was originally read while the channel was in autoservice. */
2336 f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
2338 ast_frfree(old_frame);
2341 struct timeval now = ast_tvnow();
2342 if (ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
2343 ast_log(LOG_DTMF, "DTMF end accepted with begin '%c' on %s\n", f->subclass, chan->name);
2344 ast_clear_flag(chan, AST_FLAG_IN_DTMF);
2346 f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
2347 } else if (!f->len) {
2348 ast_log(LOG_DTMF, "DTMF end accepted without begin '%c' on %s\n", f->subclass, chan->name);
2349 f->len = AST_MIN_DTMF_DURATION;
2351 if (f->len < AST_MIN_DTMF_DURATION) {
2352 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);
2353 ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
2354 chan->emulate_dtmf_digit = f->subclass;
2355 chan->emulate_dtmf_duration = AST_MIN_DTMF_DURATION - f->len;
2357 f = &ast_null_frame;
2359 ast_log(LOG_DTMF, "DTMF end passthrough '%c' on %s\n", f->subclass, chan->name);
2360 chan->dtmf_tv = now;
2362 if (chan->audiohooks) {
2363 struct ast_frame *old_frame = f;
2364 f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
2366 ast_frfree(old_frame);
2370 case AST_FRAME_DTMF_BEGIN:
2371 send_dtmf_event(chan, "Received", f->subclass, "Yes", "No");
2372 ast_log(LOG_DTMF, "DTMF begin '%c' received on %s\n", f->subclass, chan->name);
2373 if ( ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_END_DTMF_ONLY) ||
2374 (!ast_tvzero(chan->dtmf_tv) &&
2375 ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) < AST_MIN_DTMF_GAP) ) {
2376 ast_log(LOG_DTMF, "DTMF begin ignored '%c' on %s\n", f->subclass, chan->name);
2378 f = &ast_null_frame;
2380 ast_set_flag(chan, AST_FLAG_IN_DTMF);
2381 chan->dtmf_tv = ast_tvnow();
2382 ast_log(LOG_DTMF, "DTMF begin passthrough '%c' on %s\n", f->subclass, chan->name);
2385 case AST_FRAME_NULL:
2386 if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF)) {
2387 struct timeval now = ast_tvnow();
2388 if (ast_tvdiff_ms(now, chan->dtmf_tv) >= chan->emulate_dtmf_duration) {
2389 chan->emulate_dtmf_duration = 0;
2392 f->frametype = AST_FRAME_DTMF_END;
2393 f->subclass = chan->emulate_dtmf_digit;
2394 f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
2395 chan->dtmf_tv = now;
2396 ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
2397 chan->emulate_dtmf_digit = 0;
2398 ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass, chan->name);
2402 case AST_FRAME_VOICE:
2403 /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
2404 * is reached , because we want to make sure we pass at least one
2405 * voice frame through before starting the next digit, to ensure a gap
2406 * between DTMF digits. */
2407 if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !chan->emulate_dtmf_duration) {
2408 ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
2409 chan->emulate_dtmf_digit = 0;
2412 if (dropaudio || ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
2414 ast_read_generator_actions(chan, f);
2416 f = &ast_null_frame;
2419 if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
2420 struct timeval now = ast_tvnow();
2421 if (ast_tvdiff_ms(now, chan->dtmf_tv) >= chan->emulate_dtmf_duration) {
2422 chan->emulate_dtmf_duration = 0;
2425 f->frametype = AST_FRAME_DTMF_END;
2426 f->subclass = chan->emulate_dtmf_digit;
2427 f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
2428 chan->dtmf_tv = now;
2429 if (chan->audiohooks) {
2430 struct ast_frame *old_frame = f;
2431 f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
2433 ast_frfree(old_frame);
2435 ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass, chan->name);
2437 /* Drop voice frames while we're still in the middle of the digit */
2439 f = &ast_null_frame;
2441 } else if ((f->frametype == AST_FRAME_VOICE) && !(f->subclass & chan->nativeformats)) {
2442 /* This frame can't be from the current native formats -- drop it on the
2444 ast_log(LOG_NOTICE, "Dropping incompatible voice frame on %s of format %s since our native format has changed to %s\n",
2445 chan->name, ast_getformatname(f->subclass), ast_getformatname(chan->nativeformats));
2447 f = &ast_null_frame;
2448 } else if ((f->frametype == AST_FRAME_VOICE)) {
2449 /* Send frame to audiohooks if present */
2450 if (chan->audiohooks) {
2451 struct ast_frame *old_frame = f;
2452 f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
2454 ast_frfree(old_frame);
2456 if (chan->monitor && chan->monitor->read_stream ) {
2457 /* XXX what does this do ? */
2458 #ifndef MONITOR_CONSTANT_DELAY
2459 int jump = chan->outsmpl - chan->insmpl - 4 * f->samples;
2461 jump = chan->outsmpl - chan->insmpl;
2462 if (ast_seekstream(chan->monitor->read_stream, jump, SEEK_FORCECUR) == -1)
2463 ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
2464 chan->insmpl += jump + f->samples;
2466 chan->insmpl+= f->samples;
2468 int jump = chan->outsmpl - chan->insmpl;
2469 if (jump - MONITOR_DELAY >= 0) {
2470 if (ast_seekstream(chan->monitor->read_stream, jump - f->samples, SEEK_FORCECUR) == -1)
2471 ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
2472 chan->insmpl += jump;
2474 chan->insmpl += f->samples;
2476 if (chan->monitor->state == AST_MONITOR_RUNNING) {
2477 if (ast_writestream(chan->monitor->read_stream, f) < 0)
2478 ast_log(LOG_WARNING, "Failed to write data to channel monitor read stream\n");
2482 if (chan->readtrans && (f = ast_translate(chan->readtrans, f, 1)) == NULL)
2483 f = &ast_null_frame;
2485 /* Run generator sitting on the line if timing device not available
2486 * and synchronous generation of outgoing frames is necessary */
2487 ast_read_generator_actions(chan, f);
2490 /* Just pass it on! */
2494 /* Make sure we always return NULL in the future */
2495 chan->_softhangup |= AST_SOFTHANGUP_DEV;
2496 if (chan->generator)
2497 ast_deactivate_generator(chan);
2498 /* End the CDR if appropriate */
2500 ast_cdr_end(chan->cdr);
2503 /* High bit prints debugging */
2504 if (chan->fin & DEBUGCHAN_FLAG)
2505 ast_frame_dump(chan->name, f, "<<");
2506 chan->fin = FRAMECOUNT_INC(chan->fin);
2509 if (chan->music_state && chan->generator && chan->generator->digit && f && f->frametype == AST_FRAME_DTMF_END)
2510 chan->generator->digit(chan, f->subclass);
2512 ast_channel_unlock(chan);
2516 int ast_internal_timing_enabled(struct ast_channel *chan)
2518 int ret = ast_opt_internal_timing && chan->timingfd > -1;
2519 ast_debug(5, "Internal timing is %s (option_internal_timing=%d chan->timingfd=%d)\n", ret? "enabled": "disabled", ast_opt_internal_timing, chan->timingfd);
2523 struct ast_frame *ast_read(struct ast_channel *chan)
2525 return __ast_read(chan, 0);
2528 struct ast_frame *ast_read_noaudio(struct ast_channel *chan)
2530 return __ast_read(chan, 1);
2533 int ast_indicate(struct ast_channel *chan, int condition)
2535 return ast_indicate_data(chan, condition, NULL, 0);
2538 int ast_indicate_data(struct ast_channel *chan, int condition, const void *data, size_t datalen)
2542 ast_channel_lock(chan);
2543 /* Stop if we're a zombie or need a soft hangup */
2544 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
2545 ast_channel_unlock(chan);
2548 if (chan->tech->indicate)
2549 res = chan->tech->indicate(chan, condition, data, datalen);
2550 ast_channel_unlock(chan);
2551 if (!chan->tech->indicate || res) {
2553 * Device does not support (that) indication, lets fake
2554 * it by doing our own tone generation. (PM2002)
2557 ast_playtones_stop(chan);
2559 const struct ind_tone_zone_sound *ts = NULL;
2560 switch (condition) {
2561 case AST_CONTROL_RINGING:
2562 ts = ast_get_indication_tone(chan->zone, "ring");
2564 case AST_CONTROL_BUSY:
2565 ts = ast_get_indication_tone(chan->zone, "busy");
2567 case AST_CONTROL_CONGESTION:
2568 ts = ast_get_indication_tone(chan->zone, "congestion");
2571 if (ts && ts->data[0]) {
2572 ast_debug(1, "Driver for channel '%s' does not support indication %d, emulating it\n", chan->name, condition);
2573 ast_playtones_start(chan,0,ts->data, 1);
2575 chan->visible_indication = condition;
2576 } else if (condition == AST_CONTROL_PROGRESS) {
2577 /* ast_playtones_stop(chan); */
2578 } else if (condition == AST_CONTROL_PROCEEDING) {
2579 /* Do nothing, really */
2580 } else if (condition == AST_CONTROL_HOLD) {
2581 /* Do nothing.... */
2582 } else if (condition == AST_CONTROL_UNHOLD) {
2583 /* Do nothing.... */
2584 } else if (condition == AST_CONTROL_VIDUPDATE) {
2585 /* Do nothing.... */
2588 ast_log(LOG_WARNING, "Unable to handle indication %d for '%s'\n", condition, chan->name);
2593 chan->visible_indication = condition;
2598 int ast_recvchar(struct ast_channel *chan, int timeout)
2601 char *buf = ast_recvtext(chan, timeout);
2603 return -1; /* error or timeout */
2604 c = *(unsigned char *)buf;
2609 char *ast_recvtext(struct ast_channel *chan, int timeout)
2615 struct ast_frame *f;
2616 if (ast_check_hangup(chan))
2618 res = ast_waitfor(chan, timeout);
2619 if (res <= 0) /* timeout or error */
2621 timeout = res; /* update timeout */
2624 break; /* no frame */
2625 if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP)
2626 done = 1; /* force a break */
2627 else if (f->frametype == AST_FRAME_TEXT) { /* what we want */
2628 buf = ast_strndup((char *) f->data, f->datalen); /* dup and break */
2636 int ast_sendtext(struct ast_channel *chan, const char *text)
2639 /* Stop if we're a zombie or need a soft hangup */
2640 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
2642 CHECK_BLOCKING(chan);
2643 if (chan->tech->send_text)
2644 res = chan->tech->send_text(chan, text);
2645 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2649 int ast_senddigit_begin(struct ast_channel *chan, char digit)
2651 /* Device does not support DTMF tones, lets fake
2652 * it by doing our own generation. */
2653 static const char* dtmf_tones[] = {
2672 if (!chan->tech->send_digit_begin)
2675 if (!chan->tech->send_digit_begin(chan, digit))
2678 if (digit >= '0' && digit <='9')
2679 ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
2680 else if (digit >= 'A' && digit <= 'D')
2681 ast_playtones_start(chan, 0, dtmf_tones[digit-'A'+10], 0);
2682 else if (digit == '*')
2683 ast_playtones_start(chan, 0, dtmf_tones[14], 0);
2684 else if (digit == '#')
2685 ast_playtones_start(chan, 0, dtmf_tones[15], 0);
2688 ast_debug(1, "Unable to generate DTMF tone '%c' for '%s'\n", digit, chan->name);
2694 int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
2698 if (chan->tech->send_digit_end)
2699 res = chan->tech->send_digit_end(chan, digit, duration);
2701 if (res && chan->generator)
2702 ast_playtones_stop(chan);
2707 int ast_senddigit(struct ast_channel *chan, char digit, unsigned int duration)
2709 if (chan->tech->send_digit_begin) {
2710 ast_senddigit_begin(chan, digit);
2711 ast_safe_sleep(chan, (duration >= AST_DEFAULT_EMULATE_DTMF_DURATION ? duration : AST_DEFAULT_EMULATE_DTMF_DURATION));
2714 return ast_senddigit_end(chan, digit, (duration >= AST_DEFAULT_EMULATE_DTMF_DURATION ? duration : AST_DEFAULT_EMULATE_DTMF_DURATION));
2717 int ast_prod(struct ast_channel *chan)
2719 struct ast_frame a = { AST_FRAME_VOICE };
2722 /* Send an empty audio frame to get things moving */
2723 if (chan->_state != AST_STATE_UP) {
2724 ast_debug(1, "Prodding channel '%s'\n", chan->name);
2725 a.subclass = chan->rawwriteformat;
2726 a.data = nothing + AST_FRIENDLY_OFFSET;
2728 if (ast_write(chan, &a))
2729 ast_log(LOG_WARNING, "Prodding channel '%s' failed\n", chan->name);
2734 int ast_write_video(struct ast_channel *chan, struct ast_frame *fr)
2737 if (!chan->tech->write_video)
2739 res = ast_write(chan, fr);
2745 int ast_write(struct ast_channel *chan, struct ast_frame *fr)
2748 struct ast_frame *f = NULL, *f2 = NULL;
2751 /*Deadlock avoidance*/
2752 while(ast_channel_trylock(chan)) {
2753 /*cannot goto done since the channel is not locked*/
2755 ast_debug(1, "Deadlock avoided for write to channel '%s'\n", chan->name);
2760 /* Stop if we're a zombie or need a soft hangup */
2761 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
2764 /* Handle any pending masquerades */
2765 if (chan->masq && ast_do_masquerade(chan)) {
2766 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
2770 res = 0; /* XXX explain, why 0 ? */
2773 if (chan->generatordata) {
2774 if (ast_test_flag(chan, AST_FLAG_WRITE_INT))
2775 ast_deactivate_generator(chan);
2777 if (fr->frametype == AST_FRAME_DTMF_END) {
2778 /* There is a generator running while we're in the middle of a digit.
2779 * It's probably inband DTMF, so go ahead and pass it so it can
2780 * stop the generator */
2781 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2782 ast_channel_unlock(chan);
2783 res = ast_senddigit_end(chan, fr->subclass, fr->len);
2784 ast_channel_lock(chan);
2785 CHECK_BLOCKING(chan);
2786 } else if (fr->frametype == AST_FRAME_CONTROL && fr->subclass == AST_CONTROL_UNHOLD) {
2787 /* This is a side case where Echo is basically being called and the person put themselves on hold and took themselves off hold */
2788 res = (chan->tech->indicate == NULL) ? 0 :
2789 chan->tech->indicate(chan, fr->subclass, fr->data, fr->datalen);
2791 res = 0; /* XXX explain, why 0 ? */
2795 /* High bit prints debugging */
2796 if (chan->fout & DEBUGCHAN_FLAG)
2797 ast_frame_dump(chan->name, fr, ">>");
2798 CHECK_BLOCKING(chan);
2799 switch (fr->frametype) {
2800 case AST_FRAME_CONTROL:
2801 res = (chan->tech->indicate == NULL) ? 0 :
2802 chan->tech->indicate(chan, fr->subclass, fr->data, fr->datalen);
2804 case AST_FRAME_DTMF_BEGIN:
2805 if (chan->audiohooks) {
2806 struct ast_frame *old_frame = fr;
2807 fr = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_WRITE, fr);
2808 if (old_frame != fr)
2811 send_dtmf_event(chan, "Sent", fr->subclass, "Yes", "No");
2812 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2813 ast_channel_unlock(chan);
2814 res = ast_senddigit_begin(chan, fr->subclass);
2815 ast_channel_lock(chan);
2816 CHECK_BLOCKING(chan);
2818 case AST_FRAME_DTMF_END:
2819 if (chan->audiohooks) {
2820 struct ast_frame *old_frame = fr;
2821 fr = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_WRITE, fr);
2822 if (old_frame != fr)
2825 send_dtmf_event(chan, "Sent", fr->subclass, "No", "Yes");
2826 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2827 ast_channel_unlock(chan);
2828 res = ast_senddigit_end(chan, fr->subclass, fr->len);
2829 ast_channel_lock(chan);
2830 CHECK_BLOCKING(chan);
2832 case AST_FRAME_TEXT:
2833 if (fr->subclass == AST_FORMAT_T140) {
2834 res = (chan->tech->write_text == NULL) ? 0 :
2835 chan->tech->write_text(chan, fr);
2837 res = (chan->tech->send_text == NULL) ? 0 :
2838 chan->tech->send_text(chan, (char *) fr->data);
2841 case AST_FRAME_HTML:
2842 res = (chan->tech->send_html == NULL) ? 0 :
2843 chan->tech->send_html(chan, fr->subclass, (char *) fr->data, fr->datalen);
2845 case AST_FRAME_VIDEO:
2846 /* XXX Handle translation of video codecs one day XXX */
2847 res = (chan->tech->write_video == NULL) ? 0 :
2848 chan->tech->write_video(chan, fr);
2850 case AST_FRAME_MODEM:
2851 res = (chan->tech->write == NULL) ? 0 :
2852 chan->tech->write(chan, fr);
2854 case AST_FRAME_VOICE:
2855 if (chan->tech->write == NULL)
2856 break; /*! \todo XXX should return 0 maybe ? */
2858 /* If audiohooks are present, write the frame out */
2859 if (chan->audiohooks) {
2860 struct ast_frame *old_frame = fr;
2861 fr = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_WRITE, fr);
2862 if (old_frame != fr)
2866 /* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */
2867 if (fr->subclass == chan->rawwriteformat)
2870 f = (chan->writetrans) ? ast_translate(chan->writetrans, fr, 0) : fr;
2877 /* If Monitor is running on this channel, then we have to write frames out there too */
2878 if (chan->monitor && chan->monitor->write_stream) {
2879 /* XXX must explain this code */
2880 #ifndef MONITOR_CONSTANT_DELAY
2881 int jump = chan->insmpl - chan->outsmpl - 4 * f->samples;
2883 jump = chan->insmpl - chan->outsmpl;
2884 if (ast_seekstream(chan->monitor->write_stream, jump, SEEK_FORCECUR) == -1)
2885 ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
2886 chan->outsmpl += jump + f->samples;
2888 chan->outsmpl += f->samples;
2890 int jump = chan->insmpl - chan->outsmpl;
2891 if (jump - MONITOR_DELAY >= 0) {
2892 if (ast_seekstream(chan->monitor->write_stream, jump - f->samples, SEEK_FORCECUR) == -1)
2893 ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
2894 chan->outsmpl += jump;
2896 chan->outsmpl += f->samples;
2898 if (chan->monitor->state == AST_MONITOR_RUNNING) {
2899 if (ast_writestream(chan->monitor->write_stream, f) < 0)
2900 ast_log(LOG_WARNING, "Failed to write data to channel monitor write stream\n");
2905 res = chan->tech->write(chan,f);
2909 case AST_FRAME_NULL:
2915 /* At this point, fr is the incoming frame and f is NULL. Channels do
2916 * not expect to get NULL as a frame pointer and will segfault. Hence,
2917 * we output the original frame passed in. */
2918 res = chan->tech->write(chan, fr);
2926 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2927 /* Consider a write failure to force a soft hangup */
2929 chan->_softhangup |= AST_SOFTHANGUP_DEV;
2931 chan->fout = FRAMECOUNT_INC(chan->fout);
2934 ast_channel_unlock(chan);
2938 static int set_format(struct ast_channel *chan, int fmt, int *rawformat, int *format,
2939 struct ast_trans_pvt **trans, const int direction)
2944 /* Make sure we only consider audio */
2945 fmt &= AST_FORMAT_AUDIO_MASK;
2947 native = chan->nativeformats;
2948 /* Find a translation path from the native format to one of the desired formats */
2951 res = ast_translator_best_choice(&fmt, &native);
2954 res = ast_translator_best_choice(&native, &fmt);
2957 ast_log(LOG_WARNING, "Unable to find a codec translation path from %s to %s\n",
2958 ast_getformatname(native), ast_getformatname(fmt));
2962 /* Now we have a good choice for both. */
2963 ast_channel_lock(chan);
2965 if ((*rawformat == native) && (*format == fmt) && ((*rawformat == *format) || (*trans))) {
2966 /* the channel is already in these formats, so nothing to do */
2967 ast_channel_unlock(chan);
2971 *rawformat = native;
2972 /* User perspective is fmt */
2974 /* Free any read translation we have right now */
2976 ast_translator_free_path(*trans);
2977 /* Build a translation path from the raw format to the desired format */
2980 *trans = ast_translator_build_path(*format, *rawformat);
2983 *trans = ast_translator_build_path(*rawformat, *format);
2984 ast_channel_unlock(chan);
2985 ast_debug(1, "Set channel %s to %s format %s\n", chan->name,
2986 direction ? "write" : "read", ast_getformatname(fmt));
2990 int ast_set_read_format(struct ast_channel *chan, int fmt)
2992 return set_format(chan, fmt, &chan->rawreadformat, &chan->readformat,
2993 &chan->readtrans, 0);
2996 int ast_set_write_format(struct ast_channel *chan, int fmt)
2998 return set_format(chan, fmt, &chan->rawwriteformat, &chan->writeformat,
2999 &chan->writetrans, 1);
3002 const char *ast_channel_reason2str(int reason)
3004 switch (reason) /* the following appear to be the only ones actually returned by request_and_dial */
3007 return "Call Failure (not BUSY, and not NO_ANSWER, maybe Circuit busy or down?)";
3008 case AST_CONTROL_HANGUP:
3010 case AST_CONTROL_RING:
3011 return "Local Ring";
3012 case AST_CONTROL_RINGING:
3013 return "Remote end Ringing";
3014 case AST_CONTROL_ANSWER:
3015 return "Remote end has Answered";
3016 case AST_CONTROL_BUSY:
3017 return "Remote end is Busy";
3018 case AST_CONTROL_CONGESTION:
3019 return "Congestion (circuits busy)";
3021 return "Unknown Reason!!";
3025 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)
3029 struct ast_channel *chan;
3031 int last_subclass = 0;
3036 outstate = &dummy_outstate; /* make outstate always a valid pointer */
3038 chan = ast_request(type, format, data, &cause);
3040 ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, (char *)data);
3041 /* compute error and return */
3042 if (cause == AST_CAUSE_BUSY)
3043 *outstate = AST_CONTROL_BUSY;
3044 else if (cause == AST_CAUSE_CONGESTION)
3045 *outstate = AST_CONTROL_CONGESTION;
3051 ast_set_variables(chan, oh->vars);
3052 /* XXX why is this necessary, for the parent_channel perhaps ? */
3053 if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name))
3054 ast_set_callerid(chan, oh->cid_num, oh->cid_name, oh->cid_num);
3055 if (oh->parent_channel) {
3056 ast_channel_inherit_variables(oh->parent_channel, chan);
3057 ast_channel_datastore_inherit(oh->parent_channel, chan);
3060 ast_cdr_setaccount(chan, oh->account);
3062 ast_set_callerid(chan, cid_num, cid_name, cid_num);
3066 if (!chan->cdr) { /* up till now, this insertion hasn't been done. Therefore,
3067 to keep from throwing off the basic order of the universe,
3068 we will try to keep this cdr from getting posted. */
3069 chan->cdr = ast_cdr_alloc();
3070 ast_cdr_init(chan->cdr, chan);
3071 ast_cdr_start(chan->cdr);
3073 if (ast_call(chan, data, 0)) { /* ast_call failed... */
3074 ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, (char *)data);
3076 res = 1; /* mark success in case chan->_state is already AST_STATE_UP */
3077 while (timeout && chan->_state != AST_STATE_UP) {
3078 struct ast_frame *f;
3079 res = ast_waitfor(chan, timeout);