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$")
40 #include "asterisk/zapata.h"
42 #include "asterisk/pbx.h"
43 #include "asterisk/frame.h"
44 #include "asterisk/sched.h"
45 #include "asterisk/options.h"
46 #include "asterisk/channel.h"
47 #include "asterisk/chanspy.h"
48 #include "asterisk/musiconhold.h"
49 #include "asterisk/logger.h"
50 #include "asterisk/say.h"
51 #include "asterisk/file.h"
52 #include "asterisk/cli.h"
53 #include "asterisk/translate.h"
54 #include "asterisk/manager.h"
55 #include "asterisk/chanvars.h"
56 #include "asterisk/linkedlists.h"
57 #include "asterisk/indications.h"
58 #include "asterisk/monitor.h"
59 #include "asterisk/causes.h"
60 #include "asterisk/callerid.h"
61 #include "asterisk/utils.h"
62 #include "asterisk/lock.h"
63 #include "asterisk/app.h"
64 #include "asterisk/transcap.h"
65 #include "asterisk/devicestate.h"
66 #include "asterisk/sha1.h"
67 #include "asterisk/threadstorage.h"
68 #include "asterisk/slinfactory.h"
70 struct channel_spy_trans {
72 struct ast_trans_pvt *path;
75 /*! \brief List of SPY structures
77 struct ast_channel_spy_list {
78 struct channel_spy_trans read_translator;
79 struct channel_spy_trans write_translator;
80 AST_LIST_HEAD_NOLOCK(, ast_channel_spy) list;
83 /*! \brief Definition of the Whisper buffer */
84 struct ast_channel_whisper_buffer {
86 struct ast_slinfactory sf;
87 unsigned int original_format;
88 struct ast_trans_pvt *path;
91 /* uncomment if you have problems with 'monitoring' synchronized files */
93 #define MONITOR_CONSTANT_DELAY
94 #define MONITOR_DELAY 150 * 8 /*!< 150 ms of MONITORING DELAY */
97 /*! \brief Prevent new channel allocation if shutting down. */
98 static int shutting_down;
100 static int uniqueint;
102 unsigned long global_fin, global_fout;
104 AST_THREADSTORAGE(state2str_threadbuf);
105 #define STATE2STR_BUFSIZE 32
107 /*! Default amount of time to use when emulating a digit as a begin and end
109 #define AST_DEFAULT_EMULATE_DTMF_DURATION 100
111 /*! Minimum allowed digit length - 80ms */
112 #define AST_MIN_DTMF_DURATION 80
114 /*! Minimum amount of time between the end of the last digit and the beginning
115 * of a new one - 45ms */
116 #define AST_MIN_DTMF_GAP 45
118 /*! \brief List of channel drivers */
120 const struct ast_channel_tech *tech;
121 AST_LIST_ENTRY(chanlist) list;
124 /*! \brief the list of registered channel types */
125 static AST_LIST_HEAD_NOLOCK_STATIC(backends, chanlist);
127 /*! \brief the list of channels we have. Note that the lock for this list is used for
128 both the channels list and the backends list. */
129 static AST_RWLIST_HEAD_STATIC(channels, ast_channel);
131 /*! \brief map AST_CAUSE's to readable string representations
135 const struct ast_cause {
140 { AST_CAUSE_UNALLOCATED, "UNALLOCATED", "Unallocated (unassigned) number" },
141 { AST_CAUSE_NO_ROUTE_TRANSIT_NET, "NO_ROUTE_TRANSIT_NET", "No route to specified transmit network" },
142 { AST_CAUSE_NO_ROUTE_DESTINATION, "NO_ROUTE_DESTINATION", "No route to destination" },
143 { AST_CAUSE_CHANNEL_UNACCEPTABLE, "CHANNEL_UNACCEPTABLE", "Channel unacceptable" },
144 { AST_CAUSE_CALL_AWARDED_DELIVERED, "CALL_AWARDED_DELIVERED", "Call awarded and being delivered in an established channel" },
145 { AST_CAUSE_NORMAL_CLEARING, "NORMAL_CLEARING", "Normal Clearing" },
146 { AST_CAUSE_USER_BUSY, "USER_BUSY", "User busy" },
147 { AST_CAUSE_NO_USER_RESPONSE, "NO_USER_RESPONSE", "No user responding" },
148 { AST_CAUSE_NO_ANSWER, "NO_ANSWER", "User alerting, no answer" },
149 { AST_CAUSE_CALL_REJECTED, "CALL_REJECTED", "Call Rejected" },
150 { AST_CAUSE_NUMBER_CHANGED, "NUMBER_CHANGED", "Number changed" },
151 { AST_CAUSE_DESTINATION_OUT_OF_ORDER, "DESTINATION_OUT_OF_ORDER", "Destination out of order" },
152 { AST_CAUSE_INVALID_NUMBER_FORMAT, "INVALID_NUMBER_FORMAT", "Invalid number format" },
153 { AST_CAUSE_FACILITY_REJECTED, "FACILITY_REJECTED", "Facility rejected" },
154 { AST_CAUSE_RESPONSE_TO_STATUS_ENQUIRY, "RESPONSE_TO_STATUS_ENQUIRY", "Response to STATus ENQuiry" },
155 { AST_CAUSE_NORMAL_UNSPECIFIED, "NORMAL_UNSPECIFIED", "Normal, unspecified" },
156 { AST_CAUSE_NORMAL_CIRCUIT_CONGESTION, "NORMAL_CIRCUIT_CONGESTION", "Circuit/channel congestion" },
157 { AST_CAUSE_NETWORK_OUT_OF_ORDER, "NETWORK_OUT_OF_ORDER", "Network out of order" },
158 { AST_CAUSE_NORMAL_TEMPORARY_FAILURE, "NORMAL_TEMPORARY_FAILURE", "Temporary failure" },
159 { AST_CAUSE_SWITCH_CONGESTION, "SWITCH_CONGESTION", "Switching equipment congestion" },
160 { AST_CAUSE_ACCESS_INFO_DISCARDED, "ACCESS_INFO_DISCARDED", "Access information discarded" },
161 { AST_CAUSE_REQUESTED_CHAN_UNAVAIL, "REQUESTED_CHAN_UNAVAIL", "Requested channel not available" },
162 { AST_CAUSE_PRE_EMPTED, "PRE_EMPTED", "Pre-empted" },
163 { AST_CAUSE_FACILITY_NOT_SUBSCRIBED, "FACILITY_NOT_SUBSCRIBED", "Facility not subscribed" },
164 { AST_CAUSE_OUTGOING_CALL_BARRED, "OUTGOING_CALL_BARRED", "Outgoing call barred" },
165 { AST_CAUSE_INCOMING_CALL_BARRED, "INCOMING_CALL_BARRED", "Incoming call barred" },
166 { AST_CAUSE_BEARERCAPABILITY_NOTAUTH, "BEARERCAPABILITY_NOTAUTH", "Bearer capability not authorized" },
167 { AST_CAUSE_BEARERCAPABILITY_NOTAVAIL, "BEARERCAPABILITY_NOTAVAIL", "Bearer capability not available" },
168 { AST_CAUSE_BEARERCAPABILITY_NOTIMPL, "BEARERCAPABILITY_NOTIMPL", "Bearer capability not implemented" },
169 { AST_CAUSE_CHAN_NOT_IMPLEMENTED, "CHAN_NOT_IMPLEMENTED", "Channel not implemented" },
170 { AST_CAUSE_FACILITY_NOT_IMPLEMENTED, "FACILITY_NOT_IMPLEMENTED", "Facility not implemented" },
171 { AST_CAUSE_INVALID_CALL_REFERENCE, "INVALID_CALL_REFERENCE", "Invalid call reference value" },
172 { AST_CAUSE_INCOMPATIBLE_DESTINATION, "INCOMPATIBLE_DESTINATION", "Incompatible destination" },
173 { AST_CAUSE_INVALID_MSG_UNSPECIFIED, "INVALID_MSG_UNSPECIFIED", "Invalid message unspecified" },
174 { AST_CAUSE_MANDATORY_IE_MISSING, "MANDATORY_IE_MISSING", "Mandatory information element is missing" },
175 { AST_CAUSE_MESSAGE_TYPE_NONEXIST, "MESSAGE_TYPE_NONEXIST", "Message type nonexist." },
176 { AST_CAUSE_WRONG_MESSAGE, "WRONG_MESSAGE", "Wrong message" },
177 { AST_CAUSE_IE_NONEXIST, "IE_NONEXIST", "Info. element nonexist or not implemented" },
178 { AST_CAUSE_INVALID_IE_CONTENTS, "INVALID_IE_CONTENTS", "Invalid information element contents" },
179 { AST_CAUSE_WRONG_CALL_STATE, "WRONG_CALL_STATE", "Message not compatible with call state" },
180 { AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE, "RECOVERY_ON_TIMER_EXPIRE", "Recover on timer expiry" },
181 { AST_CAUSE_MANDATORY_IE_LENGTH_ERROR, "MANDATORY_IE_LENGTH_ERROR", "Mandatory IE length error" },
182 { AST_CAUSE_PROTOCOL_ERROR, "PROTOCOL_ERROR", "Protocol error, unspecified" },
183 { AST_CAUSE_INTERWORKING, "INTERWORKING", "Interworking, unspecified" },
186 struct ast_variable *ast_channeltype_list(void)
189 struct ast_variable *var=NULL, *prev = NULL;
190 AST_LIST_TRAVERSE(&backends, cl, list) {
192 if ((prev->next = ast_variable_new(cl->tech->type, cl->tech->description)))
195 var = ast_variable_new(cl->tech->type, cl->tech->description);
202 /*! \brief Show channel types - CLI command */
203 static int show_channeltypes(int fd, int argc, char *argv[])
205 #define FORMAT "%-10.10s %-40.40s %-12.12s %-12.12s %-12.12s\n"
209 ast_cli(fd, FORMAT, "Type", "Description", "Devicestate", "Indications", "Transfer");
210 ast_cli(fd, FORMAT, "----------", "-----------", "-----------", "-----------", "--------");
211 if (AST_RWLIST_RDLOCK(&channels)) {
212 ast_log(LOG_WARNING, "Unable to lock channel list\n");
215 AST_LIST_TRAVERSE(&backends, cl, list) {
216 ast_cli(fd, FORMAT, cl->tech->type, cl->tech->description,
217 (cl->tech->devicestate) ? "yes" : "no",
218 (cl->tech->indicate) ? "yes" : "no",
219 (cl->tech->transfer) ? "yes" : "no");
222 AST_RWLIST_UNLOCK(&channels);
223 ast_cli(fd, "----------\n%d channel drivers registered.\n", count_chan);
224 return RESULT_SUCCESS;
230 /*! \brief Show details about a channel driver - CLI command */
231 static int show_channeltype(int fd, int argc, char *argv[])
233 struct chanlist *cl = NULL;
236 return RESULT_SHOWUSAGE;
238 if (AST_RWLIST_RDLOCK(&channels)) {
239 ast_log(LOG_WARNING, "Unable to lock channel list\n");
240 return RESULT_FAILURE;
243 AST_LIST_TRAVERSE(&backends, cl, list) {
244 if (!strncasecmp(cl->tech->type, argv[3], strlen(cl->tech->type))) {
251 ast_cli(fd, "\n%s is not a registered channel driver.\n", argv[3]);
252 AST_RWLIST_UNLOCK(&channels);
253 return RESULT_FAILURE;
257 "-- Info about channel driver: %s --\n"
258 " Device State: %s\n"
261 " Capabilities: %d\n"
265 " Image Support: %s\n"
266 " Text Support: %s\n",
268 (cl->tech->devicestate) ? "yes" : "no",
269 (cl->tech->indicate) ? "yes" : "no",
270 (cl->tech->transfer) ? "yes" : "no",
271 (cl->tech->capabilities) ? cl->tech->capabilities : -1,
272 (cl->tech->send_digit_begin) ? "yes" : "no",
273 (cl->tech->send_digit_end) ? "yes" : "no",
274 (cl->tech->send_html) ? "yes" : "no",
275 (cl->tech->send_image) ? "yes" : "no",
276 (cl->tech->send_text) ? "yes" : "no"
280 AST_RWLIST_UNLOCK(&channels);
281 return RESULT_SUCCESS;
284 static char *complete_channeltypes(const char *line, const char *word, int pos, int state)
294 wordlen = strlen(word);
296 AST_LIST_TRAVERSE(&backends, cl, list) {
297 if (!strncasecmp(word, cl->tech->type, wordlen) && ++which > state) {
298 ret = strdup(cl->tech->type);
306 static const char show_channeltypes_usage[] =
307 "Usage: core show channeltypes\n"
308 " Lists available channel types registered in your Asterisk server.\n";
310 static const char show_channeltype_usage[] =
311 "Usage: core show channeltype <name>\n"
312 " Show details about the specified channel type, <name>.\n";
314 static struct ast_cli_entry cli_channel[] = {
315 { { "core", "show", "channeltypes", NULL },
316 show_channeltypes, "List available channel types",
317 show_channeltypes_usage },
319 { { "core", "show", "channeltype", NULL },
320 show_channeltype, "Give more details on that channel type",
321 show_channeltype_usage, complete_channeltypes },
324 /*! \brief Checks to see if a channel is needing hang up */
325 int ast_check_hangup(struct ast_channel *chan)
327 if (chan->_softhangup) /* yes if soft hangup flag set */
329 if (!chan->tech_pvt) /* yes if no technology private data */
331 if (!chan->whentohangup) /* no if no hangup scheduled */
333 if (chan->whentohangup > time(NULL)) /* no if hangup time has not come yet. */
335 chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT; /* record event */
339 static int ast_check_hangup_locked(struct ast_channel *chan)
342 ast_channel_lock(chan);
343 res = ast_check_hangup(chan);
344 ast_channel_unlock(chan);
348 /*! \brief Initiate system shutdown */
349 void ast_begin_shutdown(int hangup)
351 struct ast_channel *c;
354 AST_RWLIST_RDLOCK(&channels);
355 AST_RWLIST_TRAVERSE(&channels, c, chan_list)
356 ast_softhangup(c, AST_SOFTHANGUP_SHUTDOWN);
357 AST_RWLIST_UNLOCK(&channels);
361 /*! \brief returns number of active/allocated channels */
362 int ast_active_channels(void)
364 struct ast_channel *c;
366 AST_RWLIST_RDLOCK(&channels);
367 AST_RWLIST_TRAVERSE(&channels, c, chan_list)
369 AST_RWLIST_UNLOCK(&channels);
373 /*! \brief Cancel a shutdown in progress */
374 void ast_cancel_shutdown(void)
379 /*! \brief Returns non-zero if Asterisk is being shut down */
380 int ast_shutting_down(void)
382 return shutting_down;
385 /*! \brief Set when to hangup channel */
386 void ast_channel_setwhentohangup(struct ast_channel *chan, time_t offset)
388 chan->whentohangup = offset ? time(NULL) + offset : 0;
389 ast_queue_frame(chan, &ast_null_frame);
393 /*! \brief Compare a offset with when to hangup channel */
394 int ast_channel_cmpwhentohangup(struct ast_channel *chan, time_t offset)
398 if (!chan->whentohangup)
399 return (offset == 0) ? 0 : -1;
401 if (!offset) /* XXX why is this special? */
404 whentohangup = offset + time(NULL);
406 if (chan->whentohangup < whentohangup)
408 else if (chan->whentohangup == whentohangup)
414 /*! \brief Register a new telephony channel in Asterisk */
415 int ast_channel_register(const struct ast_channel_tech *tech)
417 struct chanlist *chan;
419 AST_RWLIST_WRLOCK(&channels);
421 AST_LIST_TRAVERSE(&backends, chan, list) {
422 if (!strcasecmp(tech->type, chan->tech->type)) {
423 ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", tech->type);
424 AST_RWLIST_UNLOCK(&channels);
429 if (!(chan = ast_calloc(1, sizeof(*chan)))) {
430 AST_RWLIST_UNLOCK(&channels);
434 AST_LIST_INSERT_HEAD(&backends, chan, list);
437 ast_log(LOG_DEBUG, "Registered handler for '%s' (%s)\n", chan->tech->type, chan->tech->description);
439 if (option_verbose > 1)
440 ast_verbose(VERBOSE_PREFIX_2 "Registered channel type '%s' (%s)\n", chan->tech->type,
441 chan->tech->description);
443 AST_RWLIST_UNLOCK(&channels);
447 /*! \brief Unregister channel driver */
448 void ast_channel_unregister(const struct ast_channel_tech *tech)
450 struct chanlist *chan;
453 ast_log(LOG_DEBUG, "Unregistering channel type '%s'\n", tech->type);
455 AST_RWLIST_WRLOCK(&channels);
457 AST_LIST_TRAVERSE_SAFE_BEGIN(&backends, chan, list) {
458 if (chan->tech == tech) {
459 AST_LIST_REMOVE_CURRENT(&backends, list);
461 if (option_verbose > 1)
462 ast_verbose(VERBOSE_PREFIX_2 "Unregistered channel type '%s'\n", tech->type);
466 AST_LIST_TRAVERSE_SAFE_END
468 AST_RWLIST_UNLOCK(&channels);
471 /*! \brief Get handle to channel driver based on name */
472 const struct ast_channel_tech *ast_get_channel_tech(const char *name)
474 struct chanlist *chanls;
475 const struct ast_channel_tech *ret = NULL;
477 if (AST_RWLIST_RDLOCK(&channels)) {
478 ast_log(LOG_WARNING, "Unable to lock channel tech list\n");
482 AST_LIST_TRAVERSE(&backends, chanls, list) {
483 if (!strcasecmp(name, chanls->tech->type)) {
489 AST_RWLIST_UNLOCK(&channels);
494 /*! \brief Gives the string form of a given hangup cause */
495 const char *ast_cause2str(int cause)
499 for (x=0; x < sizeof(causes) / sizeof(causes[0]); x++) {
500 if (causes[x].cause == cause)
501 return causes[x].desc;
507 /*! \brief Convert a symbolic hangup cause to number */
508 int ast_str2cause(const char *name)
512 for (x = 0; x < sizeof(causes) / sizeof(causes[0]); x++)
513 if (strncasecmp(causes[x].name, name, strlen(causes[x].name)) == 0)
514 return causes[x].cause;
519 /*! \brief Gives the string form of a given channel state.
520 \note This function is not reentrant.
522 const char *ast_state2str(enum ast_channel_state state)
529 case AST_STATE_RESERVED:
531 case AST_STATE_OFFHOOK:
533 case AST_STATE_DIALING:
537 case AST_STATE_RINGING:
543 case AST_STATE_DIALING_OFFHOOK:
544 return "Dialing Offhook";
545 case AST_STATE_PRERING:
548 if (!(buf = ast_threadstorage_get(&state2str_threadbuf, STATE2STR_BUFSIZE)))
550 snprintf(buf, STATE2STR_BUFSIZE, "Unknown (%d)", state);
555 /*! \brief Gives the string form of a given transfer capability */
556 char *ast_transfercapability2str(int transfercapability)
558 switch (transfercapability) {
559 case AST_TRANS_CAP_SPEECH:
561 case AST_TRANS_CAP_DIGITAL:
563 case AST_TRANS_CAP_RESTRICTED_DIGITAL:
564 return "RESTRICTED_DIGITAL";
565 case AST_TRANS_CAP_3_1K_AUDIO:
567 case AST_TRANS_CAP_DIGITAL_W_TONES:
568 return "DIGITAL_W_TONES";
569 case AST_TRANS_CAP_VIDEO:
576 /*! \brief Pick the best audio codec */
577 int ast_best_codec(int fmts)
579 /* This just our opinion, expressed in code. We are asked to choose
580 the best codec to use, given no information */
582 static const int prefs[] =
584 /*! Okay, ulaw is used by all telephony equipment, so start with it */
586 /*! Unless of course, you're a silly European, so then prefer ALAW */
588 /*! G.722 is better then all below, but not as common as the above... so give ulaw and alaw priority */
590 /*! Okay, well, signed linear is easy to translate into other stuff */
592 /*! G.726 is standard ADPCM, in RFC3551 packing order */
594 /*! G.726 is standard ADPCM, in AAL2 packing order */
595 AST_FORMAT_G726_AAL2,
596 /*! ADPCM has great sound quality and is still pretty easy to translate */
598 /*! Okay, we're down to vocoders now, so pick GSM because it's small and easier to
599 translate and sounds pretty good */
601 /*! iLBC is not too bad */
603 /*! Speex is free, but computationally more expensive than GSM */
605 /*! Ick, LPC10 sounds terrible, but at least we have code for it, if you're tacky enough
608 /*! G.729a is faster than 723 and slightly less expensive */
610 /*! Down to G.723.1 which is proprietary but at least designed for voice */
614 /* Strip out video */
615 fmts &= AST_FORMAT_AUDIO_MASK;
617 /* Find the first preferred codec in the format given */
618 for (x=0; x < (sizeof(prefs) / sizeof(prefs[0]) ); x++)
621 ast_log(LOG_WARNING, "Don't know any of 0x%x formats\n", fmts);
625 static const struct ast_channel_tech null_tech = {
627 .description = "Null channel (should not see this)",
630 /*! \brief Create a new channel structure */
631 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, ...)
633 struct ast_channel *tmp;
636 struct varshead *headp;
639 /* If shutting down, don't allocate any new channels */
641 ast_log(LOG_WARNING, "Channel allocation failed: Refusing due to active shutdown\n");
645 if (!(tmp = ast_calloc(1, sizeof(*tmp))))
648 if (!(tmp->sched = sched_context_create())) {
649 ast_log(LOG_WARNING, "Channel allocation failed: Unable to create schedule context\n");
654 if ((ast_string_field_init(tmp, 128))) {
655 sched_context_destroy(tmp->sched);
660 /* Don't bother initializing the last two FD here, because they
661 will *always* be set just a few lines down (AST_TIMING_FD,
663 for (x = 0; x < AST_MAX_FDS - 2; x++)
667 tmp->timingfd = open("/dev/zap/timer", O_RDWR);
668 if (tmp->timingfd > -1) {
669 /* Check if timing interface supports new
672 if (!ioctl(tmp->timingfd, ZT_TIMERPONG, &flags))
680 if (pipe(tmp->alertpipe)) {
681 ast_log(LOG_WARNING, "Channel allocation failed: Can't create alert pipe!\n");
682 ast_string_field_free_pools(tmp);
686 flags = fcntl(tmp->alertpipe[0], F_GETFL);
687 fcntl(tmp->alertpipe[0], F_SETFL, flags | O_NONBLOCK);
688 flags = fcntl(tmp->alertpipe[1], F_GETFL);
689 fcntl(tmp->alertpipe[1], F_SETFL, flags | O_NONBLOCK);
691 } else /* Make sure we've got it done right if they don't */
692 tmp->alertpipe[0] = tmp->alertpipe[1] = -1;
694 /* Always watch the alertpipe */
695 tmp->fds[AST_ALERT_FD] = tmp->alertpipe[0];
696 /* And timing pipe */
697 tmp->fds[AST_TIMING_FD] = tmp->timingfd;
698 ast_string_field_set(tmp, name, "**Unknown**");
705 tmp->fin = global_fin;
706 tmp->fout = global_fout;
708 if (ast_strlen_zero(ast_config_AST_SYSTEM_NAME)) {
709 ast_string_field_build(tmp, uniqueid, "%li.%d", (long) time(NULL),
710 ast_atomic_fetchadd_int(&uniqueint, 1));
712 ast_string_field_build(tmp, uniqueid, "%s-%li.%d", ast_config_AST_SYSTEM_NAME,
713 (long) time(NULL), ast_atomic_fetchadd_int(&uniqueint, 1));
716 tmp->cid.cid_name = ast_strdup(cid_name);
717 tmp->cid.cid_num = ast_strdup(cid_num);
719 if (!ast_strlen_zero(name_fmt)) {
720 /* Almost every channel is calling this function, and setting the name via the ast_string_field_build() call.
721 * And they all use slightly different formats for their name string.
722 * This means, to set the name here, we have to accept variable args, and call the string_field_build from here.
723 * This means, that the stringfields must have a routine that takes the va_lists directly, and
724 * uses them to build the string, instead of forming the va_lists internally from the vararg ... list.
725 * This new function was written so this can be accomplished.
727 va_start(ap1, name_fmt);
728 va_start(ap2, name_fmt);
729 ast_string_field_build_va(tmp, name, name_fmt, ap1, ap2);
733 /* and now, since the channel structure is built, and has its name, let's call the
734 * manager event generator with this Newchannel event. This is the proper and correct
735 * place to make this call, but you sure do have to pass a lot of data into this func
738 manager_event(EVENT_FLAG_CALL, "Newchannel",
741 "CallerIDNum: %s\r\n"
742 "CallerIDName: %s\r\n"
744 tmp->name, ast_state2str(state),
745 S_OR(cid_num, "<unknown>"),
746 S_OR(cid_name, "<unknown>"),
750 /* Reminder for the future: under what conditions do we NOT want to track cdrs on channels? */
752 /* These 4 variables need to be set up for the cdr_init() to work right */
754 tmp->amaflags = amaflag;
756 tmp->amaflags = ast_default_amaflags;
758 if (!ast_strlen_zero(acctcode))
759 ast_string_field_set(tmp, accountcode, acctcode);
761 ast_string_field_set(tmp, accountcode, ast_default_accountcode);
763 if (!ast_strlen_zero(context))
764 ast_copy_string(tmp->context, context, sizeof(tmp->context));
766 strcpy(tmp->context, "default");
768 if (!ast_strlen_zero(exten))
769 ast_copy_string(tmp->exten, exten, sizeof(tmp->exten));
771 strcpy(tmp->exten, "s");
775 tmp->cdr = ast_cdr_alloc();
776 ast_cdr_init(tmp->cdr, tmp);
777 ast_cdr_start(tmp->cdr);
779 headp = &tmp->varshead;
780 AST_LIST_HEAD_INIT_NOLOCK(headp);
782 ast_mutex_init(&tmp->lock);
784 AST_LIST_HEAD_INIT_NOLOCK(&tmp->datastores);
786 ast_string_field_set(tmp, language, defaultlanguage);
788 tmp->tech = &null_tech;
790 AST_RWLIST_WRLOCK(&channels);
791 AST_RWLIST_INSERT_HEAD(&channels, tmp, chan_list);
792 AST_RWLIST_UNLOCK(&channels);
797 /*! \brief Queue an outgoing media frame */
798 int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
801 struct ast_frame *cur;
805 /* Build us a copy and free the original one */
806 if (!(f = ast_frdup(fin))) {
807 ast_log(LOG_WARNING, "Unable to duplicate frame\n");
810 ast_channel_lock(chan);
812 /* See if the last frame on the queue is a hangup, if so don't queue anything */
813 if ((cur = AST_LIST_LAST(&chan->readq)) && (cur->frametype == AST_FRAME_CONTROL) && (cur->subclass == AST_CONTROL_HANGUP)) {
815 ast_channel_unlock(chan);
819 /* Count how many frames exist on the queue */
820 AST_LIST_TRAVERSE(&chan->readq, cur, frame_list) {
824 /* Allow up to 96 voice frames outstanding, and up to 128 total frames */
825 if (((fin->frametype == AST_FRAME_VOICE) && (qlen > 96)) || (qlen > 128)) {
826 if (fin->frametype != AST_FRAME_VOICE) {
827 ast_log(LOG_WARNING, "Exceptionally long queue length queuing to %s\n", chan->name);
831 ast_log(LOG_DEBUG, "Dropping voice to exceptionally long queue on %s\n", chan->name);
833 ast_channel_unlock(chan);
837 AST_LIST_INSERT_TAIL(&chan->readq, f, frame_list);
838 if (chan->alertpipe[1] > -1) {
839 if (write(chan->alertpipe[1], &blah, sizeof(blah)) != sizeof(blah))
840 ast_log(LOG_WARNING, "Unable to write to alert pipe on %s, frametype/subclass %d/%d (qlen = %d): %s!\n",
841 chan->name, f->frametype, f->subclass, qlen, strerror(errno));
843 } else if (chan->timingfd > -1) {
844 ioctl(chan->timingfd, ZT_TIMERPING, &blah);
846 } else if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
847 pthread_kill(chan->blocker, SIGURG);
849 ast_channel_unlock(chan);
853 /*! \brief Queue a hangup frame for channel */
854 int ast_queue_hangup(struct ast_channel *chan)
856 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
857 /* Yeah, let's not change a lock-critical value without locking */
858 if (!ast_channel_trylock(chan)) {
859 chan->_softhangup |= AST_SOFTHANGUP_DEV;
860 ast_channel_unlock(chan);
862 return ast_queue_frame(chan, &f);
865 /*! \brief Queue a control frame */
866 int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
868 struct ast_frame f = { AST_FRAME_CONTROL, };
870 f.subclass = control;
872 return ast_queue_frame(chan, &f);
875 /*! \brief Queue a control frame with payload */
876 int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control,
877 const void *data, size_t datalen)
879 struct ast_frame f = { AST_FRAME_CONTROL, };
881 f.subclass = control;
882 f.data = (void *) data;
885 return ast_queue_frame(chan, &f);
888 /*! \brief Set defer DTMF flag on channel */
889 int ast_channel_defer_dtmf(struct ast_channel *chan)
894 pre = ast_test_flag(chan, AST_FLAG_DEFER_DTMF);
895 ast_set_flag(chan, AST_FLAG_DEFER_DTMF);
900 /*! \brief Unset defer DTMF flag on channel */
901 void ast_channel_undefer_dtmf(struct ast_channel *chan)
904 ast_clear_flag(chan, AST_FLAG_DEFER_DTMF);
908 * \brief Helper function to find channels.
910 * It supports these modes:
912 * prev != NULL : get channel next in list after prev
913 * name != NULL : get channel with matching name
914 * name != NULL && namelen != 0 : get channel whose name starts with prefix
915 * exten != NULL : get channel whose exten or macroexten matches
916 * context != NULL && exten != NULL : get channel whose context or macrocontext
918 * It returns with the channel's lock held. If getting the individual lock fails,
919 * unlock and retry quickly up to 10 times, then give up.
921 * \note XXX Note that this code has cost O(N) because of the need to verify
922 * that the object is still on the global list.
924 * \note XXX also note that accessing fields (e.g. c->name in ast_log())
925 * can only be done with the lock held or someone could delete the
926 * object while we work on it. This causes some ugliness in the code.
927 * Note that removing the first ast_log() may be harmful, as it would
928 * shorten the retry period and possibly cause failures.
929 * We should definitely go for a better scheme that is deadlock-free.
931 static struct ast_channel *channel_find_locked(const struct ast_channel *prev,
932 const char *name, const int namelen,
933 const char *context, const char *exten)
935 const char *msg = prev ? "deadlock" : "initial deadlock";
937 struct ast_channel *c;
939 for (retries = 0; retries < 10; retries++) {
941 AST_RWLIST_RDLOCK(&channels);
942 AST_RWLIST_TRAVERSE(&channels, c, chan_list) {
943 if (prev) { /* look for next item */
944 if (c != prev) /* not this one */
946 /* found, prepare to return c->next */
947 if ((c = AST_RWLIST_NEXT(c, chan_list)) == NULL) break;
948 /* If prev was the last item on the channel list, then we just
949 * want to return NULL, instead of trying to deref NULL in the
953 /* We want prev to be NULL in case we end up doing more searching through
954 * the channel list to find the channel (ie: name searching). If we didn't
955 * set this to NULL the logic would just blow up
958 if (name) { /* want match by name */
959 if ((!namelen && strcasecmp(c->name, name)) ||
960 (namelen && strncasecmp(c->name, name, namelen)))
961 continue; /* name match failed */
963 if (context && strcasecmp(c->context, context) &&
964 strcasecmp(c->macrocontext, context))
965 continue; /* context match failed */
966 if (strcasecmp(c->exten, exten) &&
967 strcasecmp(c->macroexten, exten))
968 continue; /* exten match failed */
970 /* if we get here, c points to the desired record */
973 /* exit if chan not found or mutex acquired successfully */
974 /* this is slightly unsafe, as we _should_ hold the lock to access c->name */
975 done = c == NULL || ast_channel_trylock(c) == 0;
978 ast_log(LOG_DEBUG, "Avoiding %s for channel '%p'\n", msg, c);
980 /* We are about to fail due to a deadlock, so report this
981 * while we still have the list lock.
984 ast_log(LOG_DEBUG, "Failure, could not lock '%p' after %d retries!\n", c, retries);
985 /* As we have deadlocked, we will skip this channel and
986 * see if there is another match.
987 * NOTE: No point doing this for a full-name match,
988 * as there can be no more matches.
990 if (!(name && !namelen)) {
996 AST_RWLIST_UNLOCK(&channels);
999 usleep(1); /* give other threads a chance before retrying */
1005 /*! \brief Browse channels in use */
1006 struct ast_channel *ast_channel_walk_locked(const struct ast_channel *prev)
1008 return channel_find_locked(prev, NULL, 0, NULL, NULL);
1011 /*! \brief Get channel by name and lock it */
1012 struct ast_channel *ast_get_channel_by_name_locked(const char *name)
1014 return channel_find_locked(NULL, name, 0, NULL, NULL);
1017 /*! \brief Get channel by name prefix and lock it */
1018 struct ast_channel *ast_get_channel_by_name_prefix_locked(const char *name, const int namelen)
1020 return channel_find_locked(NULL, name, namelen, NULL, NULL);
1023 /*! \brief Get next channel by name prefix and lock it */
1024 struct ast_channel *ast_walk_channel_by_name_prefix_locked(const struct ast_channel *chan, const char *name,
1027 return channel_find_locked(chan, name, namelen, NULL, NULL);
1030 /*! \brief Get channel by exten (and optionally context) and lock it */
1031 struct ast_channel *ast_get_channel_by_exten_locked(const char *exten, const char *context)
1033 return channel_find_locked(NULL, NULL, 0, context, exten);
1036 /*! \brief Get next channel by exten (and optionally context) and lock it */
1037 struct ast_channel *ast_walk_channel_by_exten_locked(const struct ast_channel *chan, const char *exten,
1038 const char *context)
1040 return channel_find_locked(chan, NULL, 0, context, exten);
1043 /*! \brief Wait, look for hangups and condition arg */
1044 int ast_safe_sleep_conditional(struct ast_channel *chan, int ms, int (*cond)(void*), void *data)
1046 struct ast_frame *f;
1049 if (cond && ((*cond)(data) == 0))
1051 ms = ast_waitfor(chan, ms);
1064 /*! \brief Wait, look for hangups */
1065 int ast_safe_sleep(struct ast_channel *chan, int ms)
1067 return ast_safe_sleep_conditional(chan, ms, NULL, NULL);
1070 static void free_cid(struct ast_callerid *cid)
1073 ast_free(cid->cid_dnid);
1075 ast_free(cid->cid_num);
1077 ast_free(cid->cid_name);
1079 ast_free(cid->cid_ani);
1081 ast_free(cid->cid_rdnis);
1082 cid->cid_dnid = cid->cid_num = cid->cid_name = cid->cid_ani = cid->cid_rdnis = NULL;
1085 /*! \brief Free a channel structure */
1086 void ast_channel_free(struct ast_channel *chan)
1089 struct ast_var_t *vardata;
1090 struct ast_frame *f;
1091 struct varshead *headp;
1092 struct ast_datastore *datastore = NULL;
1093 char name[AST_CHANNEL_NAME];
1095 headp=&chan->varshead;
1097 AST_RWLIST_WRLOCK(&channels);
1098 if (!AST_RWLIST_REMOVE(&channels, chan, chan_list)) {
1099 AST_RWLIST_UNLOCK(&channels);
1100 ast_log(LOG_ERROR, "Unable to find channel in list to free. Assuming it has already been done.\n");
1102 /* Lock and unlock the channel just to be sure nobody
1103 has it locked still */
1104 ast_channel_lock(chan);
1105 ast_channel_unlock(chan);
1106 if (chan->tech_pvt) {
1107 ast_log(LOG_WARNING, "Channel '%s' may not have been hung up properly\n", chan->name);
1108 ast_free(chan->tech_pvt);
1112 sched_context_destroy(chan->sched);
1114 ast_copy_string(name, chan->name, sizeof(name));
1116 /* Stop monitoring */
1118 chan->monitor->stop( chan, 0 );
1120 /* If there is native format music-on-hold state, free it */
1121 if (chan->music_state)
1122 ast_moh_cleanup(chan);
1124 /* if someone is whispering on the channel, stop them */
1126 ast_channel_whisper_stop(chan);
1128 /* Free translators */
1129 if (chan->readtrans)
1130 ast_translator_free_path(chan->readtrans);
1131 if (chan->writetrans)
1132 ast_translator_free_path(chan->writetrans);
1134 ast_log(LOG_WARNING, "PBX may not have been terminated properly on '%s'\n", chan->name);
1135 free_cid(&chan->cid);
1136 ast_mutex_destroy(&chan->lock);
1137 /* Close pipes if appropriate */
1138 if ((fd = chan->alertpipe[0]) > -1)
1140 if ((fd = chan->alertpipe[1]) > -1)
1142 if ((fd = chan->timingfd) > -1)
1144 while ((f = AST_LIST_REMOVE_HEAD(&chan->readq, frame_list)))
1147 /* Get rid of each of the data stores on the channel */
1148 while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry)))
1149 /* Free the data store */
1150 ast_channel_datastore_free(datastore);
1151 AST_LIST_HEAD_INIT_NOLOCK(&chan->datastores);
1153 /* loop over the variables list, freeing all data and deleting list items */
1154 /* no need to lock the list, as the channel is already locked */
1156 while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
1157 ast_var_delete(vardata);
1159 ast_app_group_discard(chan);
1161 /* Destroy the jitterbuffer */
1162 ast_jb_destroy(chan);
1164 ast_string_field_free_pools(chan);
1166 AST_RWLIST_UNLOCK(&channels);
1168 ast_device_state_changed_literal(name);
1171 struct ast_datastore *ast_channel_datastore_alloc(const struct ast_datastore_info *info, char *uid)
1173 struct ast_datastore *datastore = NULL;
1175 /* Make sure we at least have type so we can identify this */
1180 /* Allocate memory for datastore and clear it */
1181 datastore = ast_calloc(1, sizeof(*datastore));
1186 datastore->info = info;
1188 datastore->uid = ast_strdup(uid);
1193 int ast_channel_datastore_free(struct ast_datastore *datastore)
1197 /* Using the destroy function (if present) destroy the data */
1198 if (datastore->info->destroy != NULL && datastore->data != NULL) {
1199 datastore->info->destroy(datastore->data);
1200 datastore->data = NULL;
1203 /* Free allocated UID memory */
1204 if (datastore->uid != NULL) {
1205 ast_free(datastore->uid);
1206 datastore->uid = NULL;
1209 /* Finally free memory used by ourselves */
1210 ast_free(datastore);
1215 int ast_channel_datastore_inherit(struct ast_channel *from, struct ast_channel *to)
1217 struct ast_datastore *datastore = NULL, *datastore2;
1219 AST_LIST_TRAVERSE(&from->datastores, datastore, entry) {
1220 if (datastore->inheritance > 0) {
1221 datastore2 = ast_channel_datastore_alloc(datastore->info, datastore->uid);
1223 datastore2->data = datastore->info->duplicate(datastore->data);
1224 datastore2->inheritance = datastore->inheritance == DATASTORE_INHERIT_FOREVER ? DATASTORE_INHERIT_FOREVER : datastore->inheritance - 1;
1225 AST_LIST_INSERT_TAIL(&to->datastores, datastore2, entry);
1232 int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
1236 AST_LIST_INSERT_HEAD(&chan->datastores, datastore, entry);
1241 int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
1243 struct ast_datastore *datastore2 = NULL;
1246 /* Find our position and remove ourselves */
1247 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore2, entry) {
1248 if (datastore2 == datastore) {
1249 AST_LIST_REMOVE_CURRENT(&chan->datastores, entry);
1254 AST_LIST_TRAVERSE_SAFE_END
1259 struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, char *uid)
1261 struct ast_datastore *datastore = NULL;
1266 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, entry) {
1267 if (datastore->info == info) {
1268 if (uid != NULL && datastore->uid != NULL) {
1269 if (!strcasecmp(uid, datastore->uid)) {
1270 /* Matched by type AND uid */
1274 /* Matched by type at least */
1279 AST_LIST_TRAVERSE_SAFE_END
1284 int ast_channel_spy_add(struct ast_channel *chan, struct ast_channel_spy *spy)
1286 /* Link the owner channel to the spy */
1289 if (!ast_test_flag(spy, CHANSPY_FORMAT_AUDIO)) {
1290 ast_log(LOG_WARNING, "Could not add channel spy '%s' to channel '%s', only audio format spies are supported.\n",
1291 spy->type, chan->name);
1295 if (ast_test_flag(spy, CHANSPY_READ_VOLADJUST) && (spy->read_queue.format != AST_FORMAT_SLINEAR)) {
1296 ast_log(LOG_WARNING, "Cannot provide volume adjustment on '%s' format spies\n",
1297 ast_getformatname(spy->read_queue.format));
1301 if (ast_test_flag(spy, CHANSPY_WRITE_VOLADJUST) && (spy->write_queue.format != AST_FORMAT_SLINEAR)) {
1302 ast_log(LOG_WARNING, "Cannot provide volume adjustment on '%s' format spies\n",
1303 ast_getformatname(spy->write_queue.format));
1307 if (ast_test_flag(spy, CHANSPY_MIXAUDIO) &&
1308 ((spy->read_queue.format != AST_FORMAT_SLINEAR) ||
1309 (spy->write_queue.format != AST_FORMAT_SLINEAR))) {
1310 ast_log(LOG_WARNING, "Cannot provide audio mixing on '%s'-'%s' format spies\n",
1311 ast_getformatname(spy->read_queue.format), ast_getformatname(spy->write_queue.format));
1316 if (!(chan->spies = ast_calloc(1, sizeof(*chan->spies)))) {
1320 AST_LIST_HEAD_INIT_NOLOCK(&chan->spies->list);
1321 AST_LIST_INSERT_HEAD(&chan->spies->list, spy, list);
1323 AST_LIST_INSERT_TAIL(&chan->spies->list, spy, list);
1326 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE) {
1327 ast_cond_init(&spy->trigger, NULL);
1328 ast_set_flag(spy, CHANSPY_TRIGGER_READ);
1329 ast_clear_flag(spy, CHANSPY_TRIGGER_WRITE);
1333 ast_log(LOG_DEBUG, "Spy %s added to channel %s\n",
1334 spy->type, chan->name);
1339 /* Clean up a channel's spy information */
1340 static void spy_cleanup(struct ast_channel *chan)
1342 if (!AST_LIST_EMPTY(&chan->spies->list))
1344 if (chan->spies->read_translator.path)
1345 ast_translator_free_path(chan->spies->read_translator.path);
1346 if (chan->spies->write_translator.path)
1347 ast_translator_free_path(chan->spies->write_translator.path);
1348 ast_free(chan->spies);
1353 /* Detach a spy from it's channel */
1354 static void spy_detach(struct ast_channel_spy *spy, struct ast_channel *chan)
1356 ast_mutex_lock(&spy->lock);
1358 /* We only need to poke them if they aren't already done */
1359 if (spy->status != CHANSPY_DONE) {
1360 /* Indicate to the spy to stop */
1361 spy->status = CHANSPY_STOP;
1363 /* Poke the spy if needed */
1364 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE)
1365 ast_cond_signal(&spy->trigger);
1368 /* Print it out while we still have a lock so the structure can't go away (if signalled above) */
1370 ast_log(LOG_DEBUG, "Spy %s removed from channel %s\n", spy->type, chan->name);
1372 ast_mutex_unlock(&spy->lock);
1377 void ast_channel_spy_stop_by_type(struct ast_channel *chan, const char *type)
1379 struct ast_channel_spy *spy = NULL;
1384 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->spies->list, spy, list) {
1385 ast_mutex_lock(&spy->lock);
1386 if ((spy->type == type) && (spy->status == CHANSPY_RUNNING)) {
1387 ast_mutex_unlock(&spy->lock);
1388 AST_LIST_REMOVE_CURRENT(&chan->spies->list, list);
1389 spy_detach(spy, chan);
1391 ast_mutex_unlock(&spy->lock);
1393 AST_LIST_TRAVERSE_SAFE_END
1397 void ast_channel_spy_trigger_wait(struct ast_channel_spy *spy)
1402 tv = ast_tvadd(ast_tvnow(), ast_samp2tv(50000, 1000));
1403 ts.tv_sec = tv.tv_sec;
1404 ts.tv_nsec = tv.tv_usec * 1000;
1406 ast_cond_timedwait(&spy->trigger, &spy->lock, &ts);
1409 void ast_channel_spy_remove(struct ast_channel *chan, struct ast_channel_spy *spy)
1414 AST_LIST_REMOVE(&chan->spies->list, spy, list);
1415 spy_detach(spy, chan);
1419 void ast_channel_spy_free(struct ast_channel_spy *spy)
1421 struct ast_frame *f = NULL;
1423 if (spy->status == CHANSPY_DONE)
1426 /* Switch status to done in case we get called twice */
1427 spy->status = CHANSPY_DONE;
1429 /* Drop any frames in the queue */
1430 while ((f = AST_LIST_REMOVE_HEAD(&spy->write_queue.list, frame_list)))
1432 while ((f = AST_LIST_REMOVE_HEAD(&spy->read_queue.list, frame_list)))
1435 /* Destroy the condition if in use */
1436 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE)
1437 ast_cond_destroy(&spy->trigger);
1439 /* Destroy our mutex since it is no longer in use */
1440 ast_mutex_destroy(&spy->lock);
1445 static void detach_spies(struct ast_channel *chan)
1447 struct ast_channel_spy *spy = NULL;
1452 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->spies->list, spy, list) {
1453 AST_LIST_REMOVE_CURRENT(&chan->spies->list, list);
1454 spy_detach(spy, chan);
1456 AST_LIST_TRAVERSE_SAFE_END
1461 /*! \brief Softly hangup a channel, don't lock */
1462 int ast_softhangup_nolock(struct ast_channel *chan, int cause)
1465 ast_log(LOG_DEBUG, "Soft-Hanging up channel '%s'\n", chan->name);
1466 /* Inform channel driver that we need to be hung up, if it cares */
1467 chan->_softhangup |= cause;
1468 ast_queue_frame(chan, &ast_null_frame);
1469 /* Interrupt any poll call or such */
1470 if (ast_test_flag(chan, AST_FLAG_BLOCKING))
1471 pthread_kill(chan->blocker, SIGURG);
1475 /*! \brief Softly hangup a channel, lock */
1476 int ast_softhangup(struct ast_channel *chan, int cause)
1479 ast_channel_lock(chan);
1480 res = ast_softhangup_nolock(chan, cause);
1481 ast_channel_unlock(chan);
1485 enum spy_direction {
1490 #define SPY_QUEUE_SAMPLE_LIMIT 4000 /* half of one second */
1492 static void queue_frame_to_spies(struct ast_channel *chan, struct ast_frame *f, enum spy_direction dir)
1494 struct ast_frame *translated_frame = NULL;
1495 struct ast_channel_spy *spy;
1496 struct channel_spy_trans *trans;
1498 trans = (dir == SPY_READ) ? &chan->spies->read_translator : &chan->spies->write_translator;
1500 AST_LIST_TRAVERSE(&chan->spies->list, spy, list) {
1501 struct ast_channel_spy_queue *queue;
1502 struct ast_frame *duped_fr;
1504 ast_mutex_lock(&spy->lock);
1506 queue = (dir == SPY_READ) ? &spy->read_queue : &spy->write_queue;
1508 if ((queue->format == AST_FORMAT_SLINEAR) && (f->subclass != AST_FORMAT_SLINEAR)) {
1509 if (!translated_frame) {
1510 if (trans->path && (trans->last_format != f->subclass)) {
1511 ast_translator_free_path(trans->path);
1516 ast_log(LOG_DEBUG, "Building translator from %s to SLINEAR for spies on channel %s\n",
1517 ast_getformatname(f->subclass), chan->name);
1518 if ((trans->path = ast_translator_build_path(AST_FORMAT_SLINEAR, f->subclass)) == NULL) {
1519 ast_log(LOG_WARNING, "Cannot build a path from %s to %s\n",
1520 ast_getformatname(f->subclass), ast_getformatname(AST_FORMAT_SLINEAR));
1521 ast_mutex_unlock(&spy->lock);
1524 trans->last_format = f->subclass;
1527 if (!(translated_frame = ast_translate(trans->path, f, 0))) {
1528 ast_log(LOG_ERROR, "Translation to %s failed, dropping frame for spies\n",
1529 ast_getformatname(AST_FORMAT_SLINEAR));
1530 ast_mutex_unlock(&spy->lock);
1534 duped_fr = ast_frdup(translated_frame);
1535 } else if (f->subclass != queue->format) {
1536 ast_log(LOG_WARNING, "Spy '%s' on channel '%s' wants format '%s', but frame is '%s', dropping\n",
1537 spy->type, chan->name,
1538 ast_getformatname(queue->format), ast_getformatname(f->subclass));
1539 ast_mutex_unlock(&spy->lock);
1542 duped_fr = ast_frdup(f);
1544 AST_LIST_INSERT_TAIL(&queue->list, duped_fr, frame_list);
1546 queue->samples += f->samples;
1548 if (queue->samples > SPY_QUEUE_SAMPLE_LIMIT) {
1549 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE) {
1550 switch (ast_test_flag(spy, CHANSPY_TRIGGER_MODE)) {
1551 case CHANSPY_TRIGGER_READ:
1552 if (dir == SPY_WRITE) {
1553 ast_set_flag(spy, CHANSPY_TRIGGER_WRITE);
1554 ast_clear_flag(spy, CHANSPY_TRIGGER_READ);
1556 ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to write-trigger mode\n",
1557 spy->type, chan->name);
1560 case CHANSPY_TRIGGER_WRITE:
1561 if (dir == SPY_READ) {
1562 ast_set_flag(spy, CHANSPY_TRIGGER_READ);
1563 ast_clear_flag(spy, CHANSPY_TRIGGER_WRITE);
1565 ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to read-trigger mode\n",
1566 spy->type, chan->name);
1571 ast_log(LOG_DEBUG, "Triggering queue flush for spy '%s' on '%s'\n",
1572 spy->type, chan->name);
1573 ast_set_flag(spy, CHANSPY_TRIGGER_FLUSH);
1574 ast_cond_signal(&spy->trigger);
1577 ast_log(LOG_DEBUG, "Spy '%s' on channel '%s' %s queue too long, dropping frames\n",
1578 spy->type, chan->name, (dir == SPY_READ) ? "read" : "write");
1579 while (queue->samples > SPY_QUEUE_SAMPLE_LIMIT) {
1580 struct ast_frame *drop = AST_LIST_REMOVE_HEAD(&queue->list, frame_list);
1581 queue->samples -= drop->samples;
1586 switch (ast_test_flag(spy, CHANSPY_TRIGGER_MODE)) {
1587 case CHANSPY_TRIGGER_READ:
1588 if (dir == SPY_READ)
1589 ast_cond_signal(&spy->trigger);
1591 case CHANSPY_TRIGGER_WRITE:
1592 if (dir == SPY_WRITE)
1593 ast_cond_signal(&spy->trigger);
1598 ast_mutex_unlock(&spy->lock);
1601 if (translated_frame)
1602 ast_frfree(translated_frame);
1605 static void free_translation(struct ast_channel *clone)
1607 if (clone->writetrans)
1608 ast_translator_free_path(clone->writetrans);
1609 if (clone->readtrans)
1610 ast_translator_free_path(clone->readtrans);
1611 clone->writetrans = NULL;
1612 clone->readtrans = NULL;
1613 clone->rawwriteformat = clone->nativeformats;
1614 clone->rawreadformat = clone->nativeformats;
1617 /*! \brief Hangup a channel */
1618 int ast_hangup(struct ast_channel *chan)
1622 /* Don't actually hang up a channel that will masquerade as someone else, or
1623 if someone is going to masquerade as us */
1624 ast_channel_lock(chan);
1626 detach_spies(chan); /* get rid of spies */
1629 if (ast_do_masquerade(chan))
1630 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
1634 ast_log(LOG_WARNING, "%s getting hung up, but someone is trying to masq into us?!?\n", chan->name);
1635 ast_channel_unlock(chan);
1638 /* If this channel is one which will be masqueraded into something,
1639 mark it as a zombie already, so we know to free it later */
1641 ast_set_flag(chan, AST_FLAG_ZOMBIE);
1642 ast_channel_unlock(chan);
1645 free_translation(chan);
1646 /* Close audio stream */
1648 ast_closestream(chan->stream);
1649 chan->stream = NULL;
1651 /* Close video stream */
1652 if (chan->vstream) {
1653 ast_closestream(chan->vstream);
1654 chan->vstream = NULL;
1657 sched_context_destroy(chan->sched);
1661 if (chan->generatordata) /* Clear any tone stuff remaining */
1662 if (chan->generator && chan->generator->release)
1663 chan->generator->release(chan, chan->generatordata);
1664 chan->generatordata = NULL;
1665 chan->generator = NULL;
1666 if (chan->cdr) { /* End the CDR if it hasn't already */
1667 ast_cdr_end(chan->cdr);
1668 ast_cdr_detach(chan->cdr); /* Post and Free the CDR */
1671 if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
1672 ast_log(LOG_WARNING, "Hard hangup called by thread %ld on %s, while fd "
1673 "is blocked by thread %ld in procedure %s! Expect a failure\n",
1674 (long)pthread_self(), chan->name, (long)chan->blocker, chan->blockproc);
1677 if (!ast_test_flag(chan, AST_FLAG_ZOMBIE)) {
1679 ast_log(LOG_DEBUG, "Hanging up channel '%s'\n", chan->name);
1680 if (chan->tech->hangup)
1681 res = chan->tech->hangup(chan);
1684 ast_log(LOG_DEBUG, "Hanging up zombie '%s'\n", chan->name);
1687 ast_channel_unlock(chan);
1688 manager_event(EVENT_FLAG_CALL, "Hangup",
1692 "Cause-txt: %s\r\n",
1696 ast_cause2str(chan->hangupcause)
1698 ast_channel_free(chan);
1702 int __ast_answer(struct ast_channel *chan, unsigned int delay)
1706 ast_channel_lock(chan);
1708 /* You can't answer an outbound call */
1709 if (ast_test_flag(chan, AST_FLAG_OUTGOING)) {
1710 ast_channel_unlock(chan);
1714 /* Stop if we're a zombie or need a soft hangup */
1715 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
1716 ast_channel_unlock(chan);
1720 switch (chan->_state) {
1721 case AST_STATE_RINGING:
1722 case AST_STATE_RING:
1723 if (chan->tech->answer)
1724 res = chan->tech->answer(chan);
1725 ast_setstate(chan, AST_STATE_UP);
1726 ast_cdr_answer(chan->cdr);
1727 ast_channel_unlock(chan);
1729 ast_safe_sleep(chan, delay);
1733 ast_cdr_answer(chan->cdr);
1739 ast_channel_unlock(chan);
1744 int ast_answer(struct ast_channel *chan)
1746 return __ast_answer(chan, 500);
1749 void ast_deactivate_generator(struct ast_channel *chan)
1751 ast_channel_lock(chan);
1752 if (chan->generatordata) {
1753 if (chan->generator && chan->generator->release)
1754 chan->generator->release(chan, chan->generatordata);
1755 chan->generatordata = NULL;
1756 chan->generator = NULL;
1757 chan->fds[AST_GENERATOR_FD] = -1;
1758 ast_clear_flag(chan, AST_FLAG_WRITE_INT);
1759 ast_settimeout(chan, 0, NULL, NULL);
1761 ast_channel_unlock(chan);
1764 static int generator_force(void *data)
1766 /* Called if generator doesn't have data */
1769 int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples);
1770 struct ast_channel *chan = data;
1771 tmp = chan->generatordata;
1772 chan->generatordata = NULL;
1773 generate = chan->generator->generate;
1774 res = generate(chan, tmp, 0, 160);
1775 chan->generatordata = tmp;
1778 ast_log(LOG_DEBUG, "Auto-deactivating generator\n");
1779 ast_deactivate_generator(chan);
1784 int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
1788 ast_channel_lock(chan);
1790 if (chan->generatordata) {
1791 if (chan->generator && chan->generator->release)
1792 chan->generator->release(chan, chan->generatordata);
1793 chan->generatordata = NULL;
1797 if (gen->alloc && !(chan->generatordata = gen->alloc(chan, params))) {
1802 ast_settimeout(chan, 160, generator_force, chan);
1803 chan->generator = gen;
1806 ast_channel_unlock(chan);
1811 /*! \brief Wait for x amount of time on a file descriptor to have input. */
1812 int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception)
1815 ast_waitfor_nandfds(NULL, 0, fds, n, exception, &winner, ms);
1819 /*! \brief Wait for x amount of time on a file descriptor to have input. */
1820 struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
1821 int *exception, int *outfd, int *ms)
1823 struct timeval start = { 0 , 0 };
1824 struct pollfd *pfds;
1830 long whentohangup = 0, diff;
1831 struct ast_channel *winner = NULL;
1837 sz = n * AST_MAX_FDS + nfds;
1838 pfds = alloca(sizeof(*pfds) * sz);
1839 fdmap = alloca(sizeof(*fdmap) * sz);
1846 /* Perform any pending masquerades */
1847 for (x=0; x < n; x++) {
1848 ast_channel_lock(c[x]);
1850 if (ast_do_masquerade(c[x])) {
1851 ast_log(LOG_WARNING, "Masquerade failed\n");
1853 ast_channel_unlock(c[x]);
1857 if (c[x]->whentohangup) {
1860 diff = c[x]->whentohangup - now;
1862 /* Should already be hungup */
1863 c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1864 ast_channel_unlock(c[x]);
1867 if (!whentohangup || (diff < whentohangup))
1868 whentohangup = diff;
1870 ast_channel_unlock(c[x]);
1872 /* Wait full interval */
1875 rms = whentohangup * 1000; /* timeout in milliseconds */
1876 if (*ms >= 0 && *ms < rms) /* original *ms still smaller */
1880 * Build the pollfd array, putting the channels' fds first,
1881 * followed by individual fds. Order is important because
1882 * individual fd's must have priority over channel fds.
1885 for (x=0; x<n; x++) {
1886 for (y=0; y<AST_MAX_FDS; y++) {
1887 fdmap[max].fdno = y; /* fd y is linked to this pfds */
1888 fdmap[max].chan = x; /* channel x is linked to this pfds */
1889 max += ast_add_fd(&pfds[max], c[x]->fds[y]);
1891 CHECK_BLOCKING(c[x]);
1893 /* Add the individual fds */
1894 for (x=0; x<nfds; x++) {
1895 fdmap[max].chan = -1;
1896 max += ast_add_fd(&pfds[max], fds[x]);
1900 start = ast_tvnow();
1902 if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
1907 res = poll(pfds, max, kbrms);
1910 } while (!res && (rms > 0));
1912 res = poll(pfds, max, rms);
1915 ast_clear_flag(c[x], AST_FLAG_BLOCKING);
1916 if (res < 0) { /* Simulate a timeout if we were interrupted */
1921 if (whentohangup) { /* if we have a timeout, check who expired */
1923 for (x=0; x<n; x++) {
1924 if (c[x]->whentohangup && now >= c[x]->whentohangup) {
1925 c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1931 if (res == 0) { /* no fd ready, reset timeout and done */
1932 *ms = 0; /* XXX use 0 since we may not have an exact timeout. */
1936 * Then check if any channel or fd has a pending event.
1937 * Remember to check channels first and fds last, as they
1938 * must have priority on setting 'winner'
1940 for (x = 0; x < max; x++) {
1941 res = pfds[x].revents;
1944 if (fdmap[x].chan >= 0) { /* this is a channel */
1945 winner = c[fdmap[x].chan]; /* override previous winners */
1947 ast_set_flag(winner, AST_FLAG_EXCEPTION);
1949 ast_clear_flag(winner, AST_FLAG_EXCEPTION);
1950 winner->fdno = fdmap[x].fdno;
1951 } else { /* this is an fd */
1953 *outfd = pfds[x].fd;
1955 *exception = (res & POLLPRI) ? -1 : 0;
1960 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
1967 struct ast_channel *ast_waitfor_n(struct ast_channel **c, int n, int *ms)
1969 return ast_waitfor_nandfds(c, n, NULL, 0, NULL, NULL, ms);
1972 int ast_waitfor(struct ast_channel *c, int ms)
1974 int oldms = ms; /* -1 if no timeout */
1976 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
1977 if ((ms < 0) && (oldms < 0))
1982 /* XXX never to be called with ms = -1 */
1983 int ast_waitfordigit(struct ast_channel *c, int ms)
1985 return ast_waitfordigit_full(c, ms, -1, -1);
1988 int ast_settimeout(struct ast_channel *c, int samples, int (*func)(void *data), void *data)
1992 if (c->timingfd > -1) {
1998 ast_log(LOG_DEBUG, "Scheduling timer at %d sample intervals\n", samples);
1999 res = ioctl(c->timingfd, ZT_TIMERCONFIG, &samples);
2000 c->timingfunc = func;
2001 c->timingdata = data;
2007 int ast_waitfordigit_full(struct ast_channel *c, int ms, int audiofd, int cmdfd)
2010 /* Stop if we're a zombie or need a soft hangup */
2011 if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
2013 /* Wait for a digit, no more than ms milliseconds total. */
2015 struct ast_channel *rchan;
2019 rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
2020 if (!rchan && outfd < 0 && ms) {
2021 if (errno == 0 || errno == EINTR)
2023 ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
2025 } else if (outfd > -1) {
2026 /* The FD we were watching has something waiting */
2030 struct ast_frame *f = ast_read(c);
2034 switch (f->frametype) {
2035 case AST_FRAME_DTMF:
2039 case AST_FRAME_CONTROL:
2040 switch (f->subclass) {
2041 case AST_CONTROL_HANGUP:
2044 case AST_CONTROL_RINGING:
2045 case AST_CONTROL_ANSWER:
2049 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", f->subclass);
2053 case AST_FRAME_VOICE:
2054 /* Write audio if appropriate */
2056 write(audiofd, f->data, f->datalen);
2064 return 0; /* Time is up */
2067 static void send_dtmf_event(const struct ast_channel *chan, const char *direction, const char digit, const char *begin, const char *end)
2069 manager_event(EVENT_FLAG_DTMF,
2077 chan->name, chan->uniqueid, digit, direction, begin, end);
2080 static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
2082 struct ast_frame *f = NULL; /* the return value */
2086 /* this function is very long so make sure there is only one return
2087 * point at the end (there is only one exception to this).
2089 ast_channel_lock(chan);
2091 if (ast_do_masquerade(chan))
2092 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
2094 f = &ast_null_frame;
2098 /* Stop if we're a zombie or need a soft hangup */
2099 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
2100 if (chan->generator)
2101 ast_deactivate_generator(chan);
2104 prestate = chan->_state;
2106 if (!ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_EMULATE_DTMF | AST_FLAG_IN_DTMF) &&
2107 !ast_strlen_zero(chan->dtmfq) &&
2108 (ast_tvzero(chan->dtmf_tv) || ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) > AST_MIN_DTMF_GAP) ) {
2109 /* We have DTMF that has been deferred. Return it now */
2110 chan->dtmff.subclass = chan->dtmfq[0];
2111 /* Drop first digit from the buffer */
2112 memmove(chan->dtmfq, chan->dtmfq + 1, sizeof(chan->dtmfq) - 1);
2114 if (ast_test_flag(chan, AST_FLAG_END_DTMF_ONLY))
2115 chan->dtmff.frametype = AST_FRAME_DTMF_END;
2117 chan->dtmff.frametype = AST_FRAME_DTMF_BEGIN;
2118 ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
2119 chan->emulate_dtmf_digit = f->subclass;
2120 chan->emulate_dtmf_duration = AST_DEFAULT_EMULATE_DTMF_DURATION;
2122 chan->dtmf_tv = ast_tvnow();
2126 /* Read and ignore anything on the alertpipe, but read only
2127 one sizeof(blah) per frame that we send from it */
2128 if (chan->alertpipe[0] > -1)
2129 read(chan->alertpipe[0], &blah, sizeof(blah));
2132 if (chan->timingfd > -1 && chan->fdno == AST_TIMING_FD && ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
2135 ast_clear_flag(chan, AST_FLAG_EXCEPTION);
2137 /* IF we can't get event, assume it's an expired as-per the old interface */
2138 res = ioctl(chan->timingfd, ZT_GETEVENT, &blah);
2140 blah = ZT_EVENT_TIMER_EXPIRED;
2142 if (blah == ZT_EVENT_TIMER_PING) {
2143 if (AST_LIST_EMPTY(&chan->readq) || !AST_LIST_NEXT(AST_LIST_FIRST(&chan->readq), frame_list)) {
2144 /* Acknowledge PONG unless we need it again */
2145 if (ioctl(chan->timingfd, ZT_TIMERPONG, &blah)) {
2146 ast_log(LOG_WARNING, "Failed to pong timer on '%s': %s\n", chan->name, strerror(errno));
2149 } else if (blah == ZT_EVENT_TIMER_EXPIRED) {
2150 ioctl(chan->timingfd, ZT_TIMERACK, &blah);
2151 if (chan->timingfunc) {
2152 /* save a copy of func/data before unlocking the channel */
2153 int (*func)(void *) = chan->timingfunc;
2154 void *data = chan->timingdata;
2155 ast_channel_unlock(chan);
2159 ioctl(chan->timingfd, ZT_TIMERCONFIG, &blah);
2160 chan->timingdata = NULL;
2161 ast_channel_unlock(chan);
2163 /* cannot 'goto done' because the channel is already unlocked */
2164 return &ast_null_frame;
2166 ast_log(LOG_NOTICE, "No/unknown event '%d' on timer for '%s'?\n", blah, chan->name);
2169 if (chan->fds[AST_GENERATOR_FD] > -1 && chan->fdno == AST_GENERATOR_FD) {
2170 /* if the AST_GENERATOR_FD is set, call the generator with args
2171 * set to -1 so it can do whatever it needs to.
2173 void *tmp = chan->generatordata;
2174 chan->generatordata = NULL; /* reset to let ast_write get through */
2175 chan->generator->generate(chan, tmp, -1, -1);
2176 chan->generatordata = tmp;
2177 f = &ast_null_frame;
2181 /* Check for pending read queue */
2182 if (!AST_LIST_EMPTY(&chan->readq)) {
2183 f = AST_LIST_REMOVE_HEAD(&chan->readq, frame_list);
2184 /* Interpret hangup and return NULL */
2185 /* XXX why not the same for frames from the channel ? */
2186 if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP) {
2191 chan->blocker = pthread_self();
2192 if (ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
2193 if (chan->tech->exception)
2194 f = chan->tech->exception(chan);
2196 ast_log(LOG_WARNING, "Exception flag set on '%s', but no exception handler\n", chan->name);
2197 f = &ast_null_frame;
2199 /* Clear the exception flag */
2200 ast_clear_flag(chan, AST_FLAG_EXCEPTION);
2201 } else if (chan->tech->read)
2202 f = chan->tech->read(chan);
2204 ast_log(LOG_WARNING, "No read routine on channel %s\n", chan->name);
2208 /* if the channel driver returned more than one frame, stuff the excess
2209 into the readq for the next ast_read call (note that we can safely assume
2210 that the readq is empty, because otherwise we would not have called into
2211 the channel driver and f would be only a single frame)
2213 if (AST_LIST_NEXT(f, frame_list)) {
2214 AST_LIST_HEAD_SET_NOLOCK(&chan->readq, AST_LIST_NEXT(f, frame_list));
2215 AST_LIST_NEXT(f, frame_list) = NULL;
2218 switch (f->frametype) {
2219 case AST_FRAME_CONTROL:
2220 if (f->subclass == AST_CONTROL_ANSWER) {
2221 if (!ast_test_flag(chan, AST_FLAG_OUTGOING)) {
2223 ast_log(LOG_DEBUG, "Ignoring answer on an inbound call!\n");
2225 f = &ast_null_frame;
2226 } else if (prestate == AST_STATE_UP) {
2228 ast_log(LOG_DEBUG, "Dropping duplicate answer!\n");
2230 f = &ast_null_frame;
2232 /* Answer the CDR */
2233 ast_setstate(chan, AST_STATE_UP);
2234 if (!chan->cdr) { /* up till now, this insertion hasn't been done. Therefore,
2235 to keep from throwing off the basic order of the universe,
2236 we will try to keep this cdr from getting posted. */
2237 chan->cdr = ast_cdr_alloc();
2238 ast_cdr_init(chan->cdr, chan);
2239 ast_cdr_start(chan->cdr);
2242 ast_cdr_answer(chan->cdr);
2246 case AST_FRAME_DTMF_END:
2247 send_dtmf_event(chan, "Received", f->subclass, "No", "Yes");
2248 ast_log(LOG_DTMF, "DTMF end '%c' received on %s, duration %ld ms\n", f->subclass, chan->name, f->len);
2249 /* Queue it up if DTMF is deffered, or if DTMF emulation is forced.
2250 * However, only let emulation be forced if the other end cares about BEGIN frames */
2251 if ( ast_test_flag(chan, AST_FLAG_DEFER_DTMF) ||
2252 (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !ast_test_flag(chan, AST_FLAG_END_DTMF_ONLY)) ) {
2253 if (strlen(chan->dtmfq) < sizeof(chan->dtmfq) - 2)
2254 chan->dtmfq[strlen(chan->dtmfq)] = f->subclass;
2256 ast_log(LOG_WARNING, "Dropping deferred DTMF digits on %s\n", chan->name);
2258 f = &ast_null_frame;
2259 } else if (!ast_test_flag(chan, AST_FLAG_IN_DTMF | AST_FLAG_END_DTMF_ONLY)) {
2260 if (!ast_tvzero(chan->dtmf_tv) &&
2261 ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) < AST_MIN_DTMF_GAP) {
2262 /* If it hasn't been long enough, defer this digit */
2263 if (strlen(chan->dtmfq) < sizeof(chan->dtmfq) - 2)
2264 chan->dtmfq[strlen(chan->dtmfq)] = f->subclass;
2266 ast_log(LOG_WARNING, "Dropping deferred DTMF digits on %s\n", chan->name);
2268 f = &ast_null_frame;
2270 /* There was no begin, turn this into a begin and send the end later */
2271 f->frametype = AST_FRAME_DTMF_BEGIN;
2272 ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
2273 chan->emulate_dtmf_digit = f->subclass;
2274 chan->dtmf_tv = ast_tvnow();
2276 if (f->len > AST_MIN_DTMF_DURATION)
2277 chan->emulate_dtmf_duration = f->len;
2279 chan->emulate_dtmf_duration = AST_MIN_DTMF_DURATION;
2281 chan->emulate_dtmf_duration = AST_DEFAULT_EMULATE_DTMF_DURATION;
2284 struct timeval now = ast_tvnow();
2285 ast_clear_flag(chan, AST_FLAG_IN_DTMF);
2287 f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
2288 if (f->len < AST_MIN_DTMF_DURATION) {
2289 ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
2290 chan->emulate_dtmf_digit = f->subclass;
2291 chan->emulate_dtmf_duration = AST_MIN_DTMF_DURATION - f->len;
2292 f = &ast_null_frame;
2294 chan->dtmf_tv = now;
2297 case AST_FRAME_DTMF_BEGIN:
2298 send_dtmf_event(chan, "Received", f->subclass, "Yes", "No");
2299 ast_log(LOG_DTMF, "DTMF begin '%c' received on %s\n", f->subclass, chan->name);
2300 if ( ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_END_DTMF_ONLY) ||
2301 (!ast_tvzero(chan->dtmf_tv) &&
2302 ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) < AST_MIN_DTMF_GAP) ) {
2304 f = &ast_null_frame;
2306 ast_set_flag(chan, AST_FLAG_IN_DTMF);
2307 chan->dtmf_tv = ast_tvnow();
2310 case AST_FRAME_NULL:
2311 if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF)) {
2312 struct timeval now = ast_tvnow();
2313 if (ast_tvdiff_ms(now, chan->dtmf_tv) >= chan->emulate_dtmf_duration) {
2314 chan->emulate_dtmf_duration = 0;
2317 f->frametype = AST_FRAME_DTMF_END;
2318 f->subclass = chan->emulate_dtmf_digit;
2319 f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
2320 chan->dtmf_tv = now;
2321 ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
2322 chan->emulate_dtmf_digit = 0;
2326 case AST_FRAME_VOICE:
2327 /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
2328 * is reached , because we want to make sure we pass at least one
2329 * voice frame through before starting the next digit, to ensure a gap
2330 * between DTMF digits. */
2331 if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !chan->emulate_dtmf_duration) {
2332 ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
2333 chan->emulate_dtmf_digit = 0;
2336 if (dropaudio || ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
2338 f = &ast_null_frame;
2339 } else if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF)) {
2340 struct timeval now = ast_tvnow();
2341 if (ast_tvdiff_ms(now, chan->dtmf_tv) >= chan->emulate_dtmf_duration) {
2342 chan->emulate_dtmf_duration = 0;
2345 f->frametype = AST_FRAME_DTMF_END;
2346 f->subclass = chan->emulate_dtmf_digit;
2347 f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
2348 chan->dtmf_tv = now;
2350 /* Drop voice frames while we're still in the middle of the digit */
2352 f = &ast_null_frame;
2354 } else if (!(f->subclass & chan->nativeformats)) {
2355 /* This frame can't be from the current native formats -- drop it on the
2357 ast_log(LOG_NOTICE, "Dropping incompatible voice frame on %s of format %s since our native format has changed to %s\n",
2358 chan->name, ast_getformatname(f->subclass), ast_getformatname(chan->nativeformats));
2360 f = &ast_null_frame;
2363 queue_frame_to_spies(chan, f, SPY_READ);
2365 if (chan->monitor && chan->monitor->read_stream ) {
2366 /* XXX what does this do ? */
2367 #ifndef MONITOR_CONSTANT_DELAY
2368 int jump = chan->outsmpl - chan->insmpl - 4 * f->samples;
2370 jump = chan->outsmpl - chan->insmpl;
2371 if (ast_seekstream(chan->monitor->read_stream, jump, SEEK_FORCECUR) == -1)
2372 ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
2373 chan->insmpl += jump + f->samples;
2375 chan->insmpl+= f->samples;
2377 int jump = chan->outsmpl - chan->insmpl;
2378 if (jump - MONITOR_DELAY >= 0) {
2379 if (ast_seekstream(chan->monitor->read_stream, jump - f->samples, SEEK_FORCECUR) == -1)
2380 ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
2381 chan->insmpl += jump;
2383 chan->insmpl += f->samples;
2385 if (chan->monitor->state == AST_MONITOR_RUNNING) {
2386 if (ast_writestream(chan->monitor->read_stream, f) < 0)
2387 ast_log(LOG_WARNING, "Failed to write data to channel monitor read stream\n");
2391 if (chan->readtrans && (f = ast_translate(chan->readtrans, f, 1)) == NULL)
2392 f = &ast_null_frame;
2394 /* Run generator sitting on the line if timing device not available
2395 * and synchronous generation of outgoing frames is necessary */
2396 if (chan->generatordata && !ast_internal_timing_enabled(chan)) {
2397 void *tmp = chan->generatordata;
2400 if (chan->timingfunc) {
2401 if (option_debug > 1)
2402 ast_log(LOG_DEBUG, "Generator got voice, switching to phase locked mode\n");
2403 ast_settimeout(chan, 0, NULL, NULL);
2406 chan->generatordata = NULL; /* reset, to let writes go through */
2407 res = chan->generator->generate(chan, tmp, f->datalen, f->samples);
2408 chan->generatordata = tmp;
2410 if (option_debug > 1)
2411 ast_log(LOG_DEBUG, "Auto-deactivating generator\n");
2412 ast_deactivate_generator(chan);
2415 } else if (f->frametype == AST_FRAME_CNG) {
2416 if (chan->generator && !chan->timingfunc && (chan->timingfd > -1)) {
2417 if (option_debug > 1)
2418 ast_log(LOG_DEBUG, "Generator got CNG, switching to timed mode\n");
2419 ast_settimeout(chan, 160, generator_force, chan);
2424 /* Just pass it on! */
2428 /* Make sure we always return NULL in the future */
2429 chan->_softhangup |= AST_SOFTHANGUP_DEV;
2430 if (chan->generator)
2431 ast_deactivate_generator(chan);
2432 /* End the CDR if appropriate */
2434 ast_cdr_end(chan->cdr);
2437 /* High bit prints debugging */
2438 if (chan->fin & DEBUGCHAN_FLAG)
2439 ast_frame_dump(chan->name, f, "<<");
2440 chan->fin = FRAMECOUNT_INC(chan->fin);
2443 if (chan->music_state && chan->generator && chan->generator->digit && f && f->frametype == AST_FRAME_DTMF_END)
2444 chan->generator->digit(chan, f->subclass);
2446 ast_channel_unlock(chan);
2450 int ast_internal_timing_enabled(struct ast_channel *chan)
2452 int ret = ast_opt_internal_timing && chan->timingfd > -1;
2453 if (option_debug > 4)
2454 ast_log(LOG_DEBUG, "Internal timing is %s (option_internal_timing=%d chan->timingfd=%d)\n", ret? "enabled": "disabled", ast_opt_internal_timing, chan->timingfd);
2458 struct ast_frame *ast_read(struct ast_channel *chan)
2460 return __ast_read(chan, 0);
2463 struct ast_frame *ast_read_noaudio(struct ast_channel *chan)
2465 return __ast_read(chan, 1);
2468 int ast_indicate(struct ast_channel *chan, int condition)
2470 return ast_indicate_data(chan, condition, NULL, 0);
2473 int ast_indicate_data(struct ast_channel *chan, int condition, const void *data, size_t datalen)
2477 ast_channel_lock(chan);
2478 /* Stop if we're a zombie or need a soft hangup */
2479 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
2480 ast_channel_unlock(chan);
2483 if (chan->tech->indicate)
2484 res = chan->tech->indicate(chan, condition, data, datalen);
2485 ast_channel_unlock(chan);
2486 if (!chan->tech->indicate || res) {
2488 * Device does not support (that) indication, lets fake
2489 * it by doing our own tone generation. (PM2002)
2492 ast_playtones_stop(chan);
2494 const struct ind_tone_zone_sound *ts = NULL;
2495 switch (condition) {
2496 case AST_CONTROL_RINGING:
2497 ts = ast_get_indication_tone(chan->zone, "ring");
2499 case AST_CONTROL_BUSY:
2500 ts = ast_get_indication_tone(chan->zone, "busy");
2502 case AST_CONTROL_CONGESTION:
2503 ts = ast_get_indication_tone(chan->zone, "congestion");
2506 if (ts && ts->data[0]) {
2508 ast_log(LOG_DEBUG, "Driver for channel '%s' does not support indication %d, emulating it\n", chan->name, condition);
2509 ast_playtones_start(chan,0,ts->data, 1);
2511 } else if (condition == AST_CONTROL_PROGRESS) {
2512 /* ast_playtones_stop(chan); */
2513 } else if (condition == AST_CONTROL_PROCEEDING) {
2514 /* Do nothing, really */
2515 } else if (condition == AST_CONTROL_HOLD) {
2516 /* Do nothing.... */
2517 } else if (condition == AST_CONTROL_UNHOLD) {
2518 /* Do nothing.... */
2519 } else if (condition == AST_CONTROL_VIDUPDATE) {
2520 /* Do nothing.... */
2523 ast_log(LOG_WARNING, "Unable to handle indication %d for '%s'\n", condition, chan->name);
2531 int ast_recvchar(struct ast_channel *chan, int timeout)
2534 char *buf = ast_recvtext(chan, timeout);
2536 return -1; /* error or timeout */
2537 c = *(unsigned char *)buf;
2542 char *ast_recvtext(struct ast_channel *chan, int timeout)
2548 struct ast_frame *f;
2549 if (ast_check_hangup(chan))
2551 res = ast_waitfor(chan, timeout);
2552 if (res <= 0) /* timeout or error */
2554 timeout = res; /* update timeout */
2557 break; /* no frame */
2558 if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP)
2559 done = 1; /* force a break */
2560 else if (f->frametype == AST_FRAME_TEXT) { /* what we want */
2561 buf = ast_strndup((char *) f->data, f->datalen); /* dup and break */
2569 int ast_sendtext(struct ast_channel *chan, const char *text)
2572 /* Stop if we're a zombie or need a soft hangup */
2573 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
2575 CHECK_BLOCKING(chan);
2576 if (chan->tech->send_text)
2577 res = chan->tech->send_text(chan, text);
2578 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2582 int ast_senddigit_begin(struct ast_channel *chan, char digit)
2584 /* Device does not support DTMF tones, lets fake
2585 * it by doing our own generation. */
2586 static const char* dtmf_tones[] = {
2605 if (!chan->tech->send_digit_begin)
2608 if (!chan->tech->send_digit_begin(chan, digit))
2611 if (digit >= '0' && digit <='9')
2612 ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
2613 else if (digit >= 'A' && digit <= 'D')
2614 ast_playtones_start(chan, 0, dtmf_tones[digit-'A'+10], 0);
2615 else if (digit == '*')
2616 ast_playtones_start(chan, 0, dtmf_tones[14], 0);
2617 else if (digit == '#')
2618 ast_playtones_start(chan, 0, dtmf_tones[15], 0);
2622 ast_log(LOG_DEBUG, "Unable to generate DTMF tone '%c' for '%s'\n", digit, chan->name);
2628 int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
2632 if (chan->tech->send_digit_end)
2633 res = chan->tech->send_digit_end(chan, digit, duration);
2635 if (res && chan->generator)
2636 ast_playtones_stop(chan);
2641 int ast_senddigit(struct ast_channel *chan, char digit)
2643 if (chan->tech->send_digit_begin) {
2644 ast_senddigit_begin(chan, digit);
2645 ast_safe_sleep(chan, 100); /* XXX 100ms ... probably should be configurable */
2648 return ast_senddigit_end(chan, digit, 100);
2651 int ast_prod(struct ast_channel *chan)
2653 struct ast_frame a = { AST_FRAME_VOICE };
2656 /* Send an empty audio frame to get things moving */
2657 if (chan->_state != AST_STATE_UP) {
2659 ast_log(LOG_DEBUG, "Prodding channel '%s'\n", chan->name);
2660 a.subclass = chan->rawwriteformat;
2661 a.data = nothing + AST_FRIENDLY_OFFSET;
2663 if (ast_write(chan, &a))
2664 ast_log(LOG_WARNING, "Prodding channel '%s' failed\n", chan->name);
2669 int ast_write_video(struct ast_channel *chan, struct ast_frame *fr)
2672 if (!chan->tech->write_video)
2674 res = ast_write(chan, fr);
2680 int ast_write(struct ast_channel *chan, struct ast_frame *fr)
2683 struct ast_frame *f = NULL;
2685 /* Stop if we're a zombie or need a soft hangup */
2686 ast_channel_lock(chan);
2687 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
2690 /* Handle any pending masquerades */
2691 if (chan->masq && ast_do_masquerade(chan)) {
2692 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
2696 res = 0; /* XXX explain, why 0 ? */
2699 if (chan->generatordata) {
2700 if (ast_test_flag(chan, AST_FLAG_WRITE_INT))
2701 ast_deactivate_generator(chan);
2703 if (fr->frametype == AST_FRAME_DTMF_END) {
2704 /* There is a generator running while we're in the middle of a digit.
2705 * It's probably inband DTMF, so go ahead and pass it so it can
2706 * stop the generator */
2707 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2708 ast_channel_unlock(chan);
2709 res = ast_senddigit_end(chan, fr->subclass, fr->len);
2710 ast_channel_lock(chan);
2711 CHECK_BLOCKING(chan);
2712 } else if (fr->frametype == AST_FRAME_CONTROL && fr->subclass == AST_CONTROL_UNHOLD) {
2713 /* This is a side case where Echo is basically being called and the person put themselves on hold and took themselves off hold */
2714 res = (chan->tech->indicate == NULL) ? 0 :
2715 chan->tech->indicate(chan, fr->subclass, fr->data, fr->datalen);
2717 res = 0; /* XXX explain, why 0 ? */
2721 /* High bit prints debugging */
2722 if (chan->fout & DEBUGCHAN_FLAG)
2723 ast_frame_dump(chan->name, fr, ">>");
2724 CHECK_BLOCKING(chan);
2725 switch (fr->frametype) {
2726 case AST_FRAME_CONTROL:
2727 res = (chan->tech->indicate == NULL) ? 0 :
2728 chan->tech->indicate(chan, fr->subclass, fr->data, fr->datalen);
2730 case AST_FRAME_DTMF_BEGIN:
2731 send_dtmf_event(chan, "Sent", fr->subclass, "Yes", "No");
2732 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2733 ast_channel_unlock(chan);
2734 res = ast_senddigit_begin(chan, fr->subclass);
2735 ast_channel_lock(chan);
2736 CHECK_BLOCKING(chan);
2738 case AST_FRAME_DTMF_END:
2739 send_dtmf_event(chan, "Sent", fr->subclass, "No", "Yes");
2740 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2741 ast_channel_unlock(chan);
2742 res = ast_senddigit_end(chan, fr->subclass, fr->len);
2743 ast_channel_lock(chan);
2744 CHECK_BLOCKING(chan);
2746 case AST_FRAME_TEXT:
2747 if (fr->subclass == AST_FORMAT_T140) {
2748 res = (chan->tech->write_text == NULL) ? 0 :
2749 chan->tech->write_text(chan, fr);
2751 res = (chan->tech->send_text == NULL) ? 0 :
2752 chan->tech->send_text(chan, (char *) fr->data);
2755 case AST_FRAME_HTML:
2756 res = (chan->tech->send_html == NULL) ? 0 :
2757 chan->tech->send_html(chan, fr->subclass, (char *) fr->data, fr->datalen);
2759 case AST_FRAME_VIDEO:
2760 /* XXX Handle translation of video codecs one day XXX */
2761 res = (chan->tech->write_video == NULL) ? 0 :
2762 chan->tech->write_video(chan, fr);
2764 case AST_FRAME_MODEM:
2765 res = (chan->tech->write == NULL) ? 0 :
2766 chan->tech->write(chan, fr);
2768 case AST_FRAME_VOICE:
2769 if (chan->tech->write == NULL)
2770 break; /*! \todo XXX should return 0 maybe ? */
2772 /* If someone is whispering on this channel then we must ensure that we are always getting signed linear frames */
2773 if (ast_test_flag(chan, AST_FLAG_WHISPER)) {
2774 if (fr->subclass == AST_FORMAT_SLINEAR)
2777 ast_mutex_lock(&chan->whisper->lock);
2778 if (chan->writeformat != AST_FORMAT_SLINEAR) {
2779 /* Rebuild the translation path and set our write format back to signed linear */
2780 chan->whisper->original_format = chan->writeformat;
2781 ast_set_write_format(chan, AST_FORMAT_SLINEAR);
2782 if (chan->whisper->path)
2783 ast_translator_free_path(chan->whisper->path);
2784 chan->whisper->path = ast_translator_build_path(AST_FORMAT_SLINEAR, chan->whisper->original_format);
2786 /* Translate frame using the above translation path */
2787 f = (chan->whisper->path) ? ast_translate(chan->whisper->path, fr, 0) : fr;
2788 ast_mutex_unlock(&chan->whisper->lock);
2791 /* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */
2792 if (fr->subclass == chan->rawwriteformat)
2795 f = (chan->writetrans) ? ast_translate(chan->writetrans, fr, 0) : fr;
2798 /* If we have no frame of audio, then we have to bail out */
2804 /* If spies are on the channel then queue the frame out to them */
2806 queue_frame_to_spies(chan, f, SPY_WRITE);
2808 /* If Monitor is running on this channel, then we have to write frames out there too */
2809 if (chan->monitor && chan->monitor->write_stream) {
2810 /* XXX must explain this code */
2811 #ifndef MONITOR_CONSTANT_DELAY
2812 int jump = chan->insmpl - chan->outsmpl - 4 * f->samples;
2814 jump = chan->insmpl - chan->outsmpl;
2815 if (ast_seekstream(chan->monitor->write_stream, jump, SEEK_FORCECUR) == -1)
2816 ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
2817 chan->outsmpl += jump + f->samples;
2819 chan->outsmpl += f->samples;
2821 int jump = chan->insmpl - chan->outsmpl;
2822 if (jump - MONITOR_DELAY >= 0) {
2823 if (ast_seekstream(chan->monitor->write_stream, jump - f->samples, SEEK_FORCECUR) == -1)
2824 ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
2825 chan->outsmpl += jump;
2827 chan->outsmpl += f->samples;
2829 if (chan->monitor->state == AST_MONITOR_RUNNING) {
2830 if (ast_writestream(chan->monitor->write_stream, f) < 0)
2831 ast_log(LOG_WARNING, "Failed to write data to channel monitor write stream\n");
2835 /* Finally the good part! Write this out to the channel */
2836 if (ast_test_flag(chan, AST_FLAG_WHISPER)) {
2837 /* frame is assumed to be in SLINEAR, since that is
2838 required for whisper mode */
2839 ast_frame_adjust_volume(f, -2);
2840 if (ast_slinfactory_available(&chan->whisper->sf) >= f->samples) {
2841 short buf[f->samples];
2842 struct ast_frame whisper = {
2843 .frametype = AST_FRAME_VOICE,
2844 .subclass = AST_FORMAT_SLINEAR,
2846 .datalen = sizeof(buf),
2847 .samples = f->samples,
2850 ast_mutex_lock(&chan->whisper->lock);
2851 if (ast_slinfactory_read(&chan->whisper->sf, buf, f->samples))
2852 ast_frame_slinear_sum(f, &whisper);
2853 ast_mutex_unlock(&chan->whisper->lock);
2855 /* and now put it through the regular translator */
2856 f = (chan->writetrans) ? ast_translate(chan->writetrans, f, 0) : f;
2858 res = f ? chan->tech->write(chan, f) : 0;
2860 case AST_FRAME_NULL:
2866 /* At this point, fr is the incoming frame and f is NULL. Channels do
2867 * not expect to get NULL as a frame pointer and will segfault. Hence,
2868 * we output the original frame passed in. */
2869 res = chan->tech->write(chan, fr);
2875 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2876 /* Consider a write failure to force a soft hangup */
2878 chan->_softhangup |= AST_SOFTHANGUP_DEV;
2880 chan->fout = FRAMECOUNT_INC(chan->fout);
2883 ast_channel_unlock(chan);
2887 static int set_format(struct ast_channel *chan, int fmt, int *rawformat, int *format,
2888 struct ast_trans_pvt **trans, const int direction)
2893 /* Make sure we only consider audio */
2894 fmt &= AST_FORMAT_AUDIO_MASK;
2896 native = chan->nativeformats;
2897 /* Find a translation path from the native format to one of the desired formats */
2900 res = ast_translator_best_choice(&fmt, &native);
2903 res = ast_translator_best_choice(&native, &fmt);
2906 ast_log(LOG_WARNING, "Unable to find a codec translation path from %s to %s\n",
2907 ast_getformatname(native), ast_getformatname(fmt));
2911 /* Now we have a good choice for both. */
2912 ast_channel_lock(chan);
2914 if ((*rawformat == native) && (*format == fmt) && ((*rawformat == *format) || (*trans))) {
2915 /* the channel is already in these formats, so nothing to do */
2916 ast_channel_unlock(chan);
2920 *rawformat = native;
2921 /* User perspective is fmt */
2923 /* Free any read translation we have right now */
2925 ast_translator_free_path(*trans);
2926 /* Build a translation path from the raw format to the desired format */
2929 *trans = ast_translator_build_path(*format, *rawformat);
2932 *trans = ast_translator_build_path(*rawformat, *format);
2933 ast_channel_unlock(chan);
2935 ast_log(LOG_DEBUG, "Set channel %s to %s format %s\n", chan->name,
2936 direction ? "write" : "read", ast_getformatname(fmt));
2940 int ast_set_read_format(struct ast_channel *chan, int fmt)
2942 return set_format(chan, fmt, &chan->rawreadformat, &chan->readformat,
2943 &chan->readtrans, 0);
2946 int ast_set_write_format(struct ast_channel *chan, int fmt)
2948 return set_format(chan, fmt, &chan->rawwriteformat, &chan->writeformat,
2949 &chan->writetrans, 1);
2952 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)
2956 struct ast_channel *chan;
2962 outstate = &dummy_outstate; /* make outstate always a valid pointer */
2964 chan = ast_request(type, format, data, &cause);
2966 ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, (char *)data);
2967 /* compute error and return */
2968 if (cause == AST_CAUSE_BUSY)
2969 *outstate = AST_CONTROL_BUSY;
2970 else if (cause == AST_CAUSE_CONGESTION)
2971 *outstate = AST_CONTROL_CONGESTION;
2977 ast_set_variables(chan, oh->vars);
2978 /* XXX why is this necessary, for the parent_channel perhaps ? */
2979 if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name))
2980 ast_set_callerid(chan, oh->cid_num, oh->cid_name, oh->cid_num);
2981 if (oh->parent_channel) {
2982 ast_channel_inherit_variables(oh->parent_channel, chan);
2983 ast_channel_datastore_inherit(oh->parent_channel, chan);
2986 ast_cdr_setaccount(chan, oh->account);
2988 ast_set_callerid(chan, cid_num, cid_name, cid_num);
2992 if (!chan->cdr) { /* up till now, this insertion hasn't been done. Therefore,
2993 to keep from throwing off the basic order of the universe,
2994 we will try to keep this cdr from getting posted. */
2995 chan->cdr = ast_cdr_alloc();
2996 ast_cdr_init(chan->cdr, chan);
2997 ast_cdr_start(chan->cdr);
2999 if (ast_call(chan, data, 0)) { /* ast_call failed... */
3000 ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, (char *)data);
3002 res = 1; /* mark success in case chan->_state is already AST_STATE_UP */
3003 while (timeout && chan->_state != AST_STATE_UP) {
3004 struct ast_frame *f;
3005 res = ast_waitfor(chan, timeout);
3006 if (res <= 0) /* error, timeout, or done */
3012 *outstate = AST_CONTROL_HANGUP;
3016 if (f->frametype == AST_FRAME_CONTROL) {
3017 switch (f->subclass) {
3018 case AST_CONTROL_RINGING: /* record but keep going */
3019 *outstate = f->subclass;
3022 case AST_CONTROL_BUSY:
3023 case AST_CONTROL_CONGESTION:
3024 case AST_CONTROL_ANSWER:
3025 *outstate = f->subclass;
3026 timeout = 0; /* trick to force exit from the while() */
3030 case AST_CONTROL_PROGRESS:
3031 case AST_CONTROL_PROCEEDING:
3032 case AST_CONTROL_HOLD:
3033 case AST_CONTROL_UNHOLD:
3034 case AST_CONTROL_VIDUPDATE:
3035 case -1: /* Ignore -- just stopping indications */