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>
33 #include <math.h> /* For PI */
38 #include <sys/ioctl.h>
40 #include <linux/zaptel.h>
43 #endif /* __linux__ */
45 #error "You need newer zaptel! Please cvs update zaptel"
49 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
51 #include "asterisk/pbx.h"
52 #include "asterisk/frame.h"
53 #include "asterisk/sched.h"
54 #include "asterisk/options.h"
55 #include "asterisk/channel.h"
56 #include "asterisk/chanspy.h"
57 #include "asterisk/musiconhold.h"
58 #include "asterisk/logger.h"
59 #include "asterisk/say.h"
60 #include "asterisk/file.h"
61 #include "asterisk/cli.h"
62 #include "asterisk/translate.h"
63 #include "asterisk/manager.h"
64 #include "asterisk/chanvars.h"
65 #include "asterisk/linkedlists.h"
66 #include "asterisk/indications.h"
67 #include "asterisk/monitor.h"
68 #include "asterisk/causes.h"
69 #include "asterisk/callerid.h"
70 #include "asterisk/utils.h"
71 #include "asterisk/lock.h"
72 #include "asterisk/app.h"
73 #include "asterisk/transcap.h"
74 #include "asterisk/devicestate.h"
75 #include "asterisk/sha1.h"
77 struct channel_spy_trans {
79 struct ast_trans_pvt *path;
82 struct ast_channel_spy_list {
83 struct channel_spy_trans read_translator;
84 struct channel_spy_trans write_translator;
85 AST_LIST_HEAD_NOLOCK(, ast_channel_spy) list;
88 /* uncomment if you have problems with 'monitoring' synchronized files */
90 #define MONITOR_CONSTANT_DELAY
91 #define MONITOR_DELAY 150 * 8 /* 150 ms of MONITORING DELAY */
94 /*! Prevent new channel allocation if shutting down. */
95 static int shutting_down = 0;
97 AST_MUTEX_DEFINE_STATIC(uniquelock);
98 static int uniqueint = 0;
100 unsigned long global_fin = 0, global_fout = 0;
102 /* XXX Lock appropriately in more functions XXX */
105 const struct ast_channel_tech *tech;
106 AST_LIST_ENTRY(chanlist) list;
109 /*! the list of registered channel types */
110 static AST_LIST_HEAD_NOLOCK_STATIC(backends, chanlist);
112 /*! the list of channels we have. Note that the lock for this list is used for
113 both the channels list and the backends list. */
114 static AST_LIST_HEAD_STATIC(channels, ast_channel);
116 /*! map AST_CAUSE's to readable string representations */
117 const struct ast_cause {
121 { AST_CAUSE_UNALLOCATED, "Unallocated (unassigned) number" },
122 { AST_CAUSE_NO_ROUTE_TRANSIT_NET, "No route to specified transmit network" },
123 { AST_CAUSE_NO_ROUTE_DESTINATION, "No route to destination" },
124 { AST_CAUSE_CHANNEL_UNACCEPTABLE, "Channel unacceptable" },
125 { AST_CAUSE_CALL_AWARDED_DELIVERED, "Call awarded and being delivered in an established channel" },
126 { AST_CAUSE_NORMAL_CLEARING, "Normal Clearing" },
127 { AST_CAUSE_USER_BUSY, "User busy" },
128 { AST_CAUSE_NO_USER_RESPONSE, "No user responding" },
129 { AST_CAUSE_NO_ANSWER, "User alerting, no answer" },
130 { AST_CAUSE_CALL_REJECTED, "Call Rejected" },
131 { AST_CAUSE_NUMBER_CHANGED, "Number changed" },
132 { AST_CAUSE_DESTINATION_OUT_OF_ORDER, "Destination out of order" },
133 { AST_CAUSE_INVALID_NUMBER_FORMAT, "Invalid number format" },
134 { AST_CAUSE_FACILITY_REJECTED, "Facility rejected" },
135 { AST_CAUSE_RESPONSE_TO_STATUS_ENQUIRY, "Response to STATus ENQuiry" },
136 { AST_CAUSE_NORMAL_UNSPECIFIED, "Normal, unspecified" },
137 { AST_CAUSE_NORMAL_CIRCUIT_CONGESTION, "Circuit/channel congestion" },
138 { AST_CAUSE_NETWORK_OUT_OF_ORDER, "Network out of order" },
139 { AST_CAUSE_NORMAL_TEMPORARY_FAILURE, "Temporary failure" },
140 { AST_CAUSE_SWITCH_CONGESTION, "Switching equipment congestion" },
141 { AST_CAUSE_ACCESS_INFO_DISCARDED, "Access information discarded" },
142 { AST_CAUSE_REQUESTED_CHAN_UNAVAIL, "Requested channel not available" },
143 { AST_CAUSE_PRE_EMPTED, "Pre-empted" },
144 { AST_CAUSE_FACILITY_NOT_SUBSCRIBED, "Facility not subscribed" },
145 { AST_CAUSE_OUTGOING_CALL_BARRED, "Outgoing call barred" },
146 { AST_CAUSE_INCOMING_CALL_BARRED, "Incoming call barred" },
147 { AST_CAUSE_BEARERCAPABILITY_NOTAUTH, "Bearer capability not authorized" },
148 { AST_CAUSE_BEARERCAPABILITY_NOTAVAIL, "Bearer capability not available" },
149 { AST_CAUSE_BEARERCAPABILITY_NOTIMPL, "Bearer capability not implemented" },
150 { AST_CAUSE_CHAN_NOT_IMPLEMENTED, "Channel not implemented" },
151 { AST_CAUSE_FACILITY_NOT_IMPLEMENTED, "Facility not implemented" },
152 { AST_CAUSE_INVALID_CALL_REFERENCE, "Invalid call reference value" },
153 { AST_CAUSE_INCOMPATIBLE_DESTINATION, "Incompatible destination" },
154 { AST_CAUSE_INVALID_MSG_UNSPECIFIED, "Invalid message unspecified" },
155 { AST_CAUSE_MANDATORY_IE_MISSING, "Mandatory information element is missing" },
156 { AST_CAUSE_MESSAGE_TYPE_NONEXIST, "Message type nonexist." },
157 { AST_CAUSE_WRONG_MESSAGE, "Wrong message" },
158 { AST_CAUSE_IE_NONEXIST, "Info. element nonexist or not implemented" },
159 { AST_CAUSE_INVALID_IE_CONTENTS, "Invalid information element contents" },
160 { AST_CAUSE_WRONG_CALL_STATE, "Message not compatible with call state" },
161 { AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE, "Recover on timer expiry" },
162 { AST_CAUSE_MANDATORY_IE_LENGTH_ERROR, "Mandatory IE length error" },
163 { AST_CAUSE_PROTOCOL_ERROR, "Protocol error, unspecified" },
164 { AST_CAUSE_INTERWORKING, "Interworking, unspecified" },
168 struct ast_variable *ast_channeltype_list(void)
171 struct ast_variable *var=NULL, *prev = NULL;
172 AST_LIST_TRAVERSE(&backends, cl, list) {
174 if ((prev->next = ast_variable_new(cl->tech->type, cl->tech->description)))
177 var = ast_variable_new(cl->tech->type, cl->tech->description);
184 static int show_channeltypes(int fd, int argc, char *argv[])
186 #define FORMAT "%-10.10s %-40.40s %-12.12s %-12.12s %-12.12s\n"
190 ast_cli(fd, FORMAT, "Type", "Description", "Devicestate", "Indications", "Transfer");
191 ast_cli(fd, FORMAT, "----------", "-----------", "-----------", "-----------", "--------");
192 if (AST_LIST_LOCK(&channels)) {
193 ast_log(LOG_WARNING, "Unable to lock channel list\n");
196 AST_LIST_TRAVERSE(&backends, cl, list) {
197 ast_cli(fd, FORMAT, cl->tech->type, cl->tech->description,
198 (cl->tech->devicestate) ? "yes" : "no",
199 (cl->tech->indicate) ? "yes" : "no",
200 (cl->tech->transfer) ? "yes" : "no");
203 AST_LIST_UNLOCK(&channels);
204 ast_cli(fd, "----------\n%d channel drivers registered.\n", count_chan);
205 return RESULT_SUCCESS;
211 static int show_channeltype(int fd, int argc, char *argv[])
213 struct chanlist *cl = NULL;
216 return RESULT_SHOWUSAGE;
218 if (AST_LIST_LOCK(&channels)) {
219 ast_log(LOG_WARNING, "Unable to lock channel list\n");
220 return RESULT_FAILURE;
223 AST_LIST_TRAVERSE(&backends, cl, list) {
224 if (!strncasecmp(cl->tech->type, argv[2], strlen(cl->tech->type))) {
231 ast_cli(fd, "\n%s is not a registered channel driver.\n", argv[2]);
232 AST_LIST_UNLOCK(&channels);
233 return RESULT_FAILURE;
237 "-- Info about channel driver: %s --\n"
238 " Device State: %s\n"
241 " Capabilities: %d\n"
244 " Image Support: %s\n"
245 " Text Support: %s\n",
247 (cl->tech->devicestate) ? "yes" : "no",
248 (cl->tech->indicate) ? "yes" : "no",
249 (cl->tech->transfer) ? "yes" : "no",
250 (cl->tech->capabilities) ? cl->tech->capabilities : -1,
251 (cl->tech->send_digit) ? "yes" : "no",
252 (cl->tech->send_html) ? "yes" : "no",
253 (cl->tech->send_image) ? "yes" : "no",
254 (cl->tech->send_text) ? "yes" : "no"
258 AST_LIST_UNLOCK(&channels);
259 return RESULT_SUCCESS;
262 static char *complete_channeltypes(const char *line, const char *word, int pos, int state)
272 wordlen = strlen(word);
274 AST_LIST_TRAVERSE(&backends, cl, list) {
275 if (!strncasecmp(word, cl->tech->type, wordlen) && ++which > state) {
276 ret = strdup(cl->tech->type);
284 static char show_channeltypes_usage[] =
285 "Usage: show channeltypes\n"
286 " Shows available channel types registered in your Asterisk server.\n";
288 static char show_channeltype_usage[] =
289 "Usage: show channeltype <name>\n"
290 " Show details about the specified channel type, <name>.\n";
292 static struct ast_cli_entry cli_show_channeltypes =
293 { { "show", "channeltypes", NULL }, show_channeltypes, "Show available channel types", show_channeltypes_usage };
295 static struct ast_cli_entry cli_show_channeltype =
296 { { "show", "channeltype", NULL }, show_channeltype, "Give more details on that channel type", show_channeltype_usage, complete_channeltypes };
298 /*! \brief Checks to see if a channel is needing hang up */
299 int ast_check_hangup(struct ast_channel *chan)
301 if (chan->_softhangup) /* yes if soft hangup flag set */
303 if (!chan->tech_pvt) /* yes if no technology private data */
305 if (!chan->whentohangup) /* no if no hangup scheduled */
307 if (chan->whentohangup > time(NULL)) /* no if hangup time has not come yet. */
309 chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT; /* record event */
313 static int ast_check_hangup_locked(struct ast_channel *chan)
316 ast_channel_lock(chan);
317 res = ast_check_hangup(chan);
318 ast_channel_unlock(chan);
322 /*! \brief Initiate system shutdown */
323 void ast_begin_shutdown(int hangup)
325 struct ast_channel *c;
328 AST_LIST_LOCK(&channels);
329 AST_LIST_TRAVERSE(&channels, c, chan_list)
330 ast_softhangup(c, AST_SOFTHANGUP_SHUTDOWN);
331 AST_LIST_UNLOCK(&channels);
335 /*! \brief returns number of active/allocated channels */
336 int ast_active_channels(void)
338 struct ast_channel *c;
340 AST_LIST_LOCK(&channels);
341 AST_LIST_TRAVERSE(&channels, c, chan_list)
343 AST_LIST_UNLOCK(&channels);
347 /*! \brief Cancel a shutdown in progress */
348 void ast_cancel_shutdown(void)
353 /*! \brief Returns non-zero if Asterisk is being shut down */
354 int ast_shutting_down(void)
356 return shutting_down;
359 /*! \brief Set when to hangup channel */
360 void ast_channel_setwhentohangup(struct ast_channel *chan, time_t offset)
362 chan->whentohangup = offset ? time(NULL) + offset : 0;
363 ast_queue_frame(chan, &ast_null_frame);
367 /*! \brief Compare a offset with when to hangup channel */
368 int ast_channel_cmpwhentohangup(struct ast_channel *chan, time_t offset)
372 if (chan->whentohangup == 0) {
373 return (offset == 0) ? 0 : -1;
375 if (offset == 0) /* XXX why is this special ? */
378 whentohangup = offset + time (NULL);
379 if (chan->whentohangup < whentohangup)
381 else if (chan->whentohangup == whentohangup)
389 /*! \brief Register a new telephony channel in Asterisk */
390 int ast_channel_register(const struct ast_channel_tech *tech)
392 struct chanlist *chan;
394 AST_LIST_LOCK(&channels);
396 AST_LIST_TRAVERSE(&backends, chan, list) {
397 if (!strcasecmp(tech->type, chan->tech->type)) {
398 ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", tech->type);
399 AST_LIST_UNLOCK(&channels);
404 if (!(chan = ast_calloc(1, sizeof(*chan)))) {
405 AST_LIST_UNLOCK(&channels);
409 AST_LIST_INSERT_HEAD(&backends, chan, list);
412 ast_log(LOG_DEBUG, "Registered handler for '%s' (%s)\n", chan->tech->type, chan->tech->description);
414 if (option_verbose > 1)
415 ast_verbose(VERBOSE_PREFIX_2 "Registered channel type '%s' (%s)\n", chan->tech->type,
416 chan->tech->description);
418 AST_LIST_UNLOCK(&channels);
422 void ast_channel_unregister(const struct ast_channel_tech *tech)
424 struct chanlist *chan;
427 ast_log(LOG_DEBUG, "Unregistering channel type '%s'\n", tech->type);
429 AST_LIST_LOCK(&channels);
431 AST_LIST_TRAVERSE_SAFE_BEGIN(&backends, chan, list) {
432 if (chan->tech == tech) {
433 AST_LIST_REMOVE_CURRENT(&backends, list);
435 if (option_verbose > 1)
436 ast_verbose(VERBOSE_PREFIX_2 "Unregistered channel type '%s'\n", tech->type);
440 AST_LIST_TRAVERSE_SAFE_END
442 AST_LIST_UNLOCK(&channels);
445 const struct ast_channel_tech *ast_get_channel_tech(const char *name)
447 struct chanlist *chanls;
448 const struct ast_channel_tech *ret = NULL;
450 if (AST_LIST_LOCK(&channels)) {
451 ast_log(LOG_WARNING, "Unable to lock channel tech list\n");
455 AST_LIST_TRAVERSE(&backends, chanls, list) {
456 if (!strcasecmp(name, chanls->tech->type)) {
462 AST_LIST_UNLOCK(&channels);
467 /*! \brief Gives the string form of a given hangup cause */
468 const char *ast_cause2str(int cause)
472 for (x=0; x < sizeof(causes) / sizeof(causes[0]); x++) {
473 if (causes[x].cause == cause)
474 return causes[x].desc;
480 /*! \brief Gives the string form of a given channel state */
481 char *ast_state2str(int state)
483 /* XXX Not reentrant XXX */
484 static char localtmp[256];
488 case AST_STATE_RESERVED:
490 case AST_STATE_OFFHOOK:
492 case AST_STATE_DIALING:
496 case AST_STATE_RINGING:
503 snprintf(localtmp, sizeof(localtmp), "Unknown (%d)\n", state);
508 /*! \brief Gives the string form of a given transfer capability */
509 char *ast_transfercapability2str(int transfercapability)
511 switch(transfercapability) {
512 case AST_TRANS_CAP_SPEECH:
514 case AST_TRANS_CAP_DIGITAL:
516 case AST_TRANS_CAP_RESTRICTED_DIGITAL:
517 return "RESTRICTED_DIGITAL";
518 case AST_TRANS_CAP_3_1K_AUDIO:
520 case AST_TRANS_CAP_DIGITAL_W_TONES:
521 return "DIGITAL_W_TONES";
522 case AST_TRANS_CAP_VIDEO:
529 /*! \brief Pick the best codec */
530 int ast_best_codec(int fmts)
532 /* This just our opinion, expressed in code. We are asked to choose
533 the best codec to use, given no information */
537 /*! Okay, ulaw is used by all telephony equipment, so start with it */
539 /*! Unless of course, you're a silly European, so then prefer ALAW */
541 /*! Okay, well, signed linear is easy to translate into other stuff */
543 /*! G.726 is standard ADPCM */
545 /*! ADPCM has great sound quality and is still pretty easy to translate */
547 /*! Okay, we're down to vocoders now, so pick GSM because it's small and easier to
548 translate and sounds pretty good */
550 /*! iLBC is not too bad */
552 /*! Speex is free, but computationally more expensive than GSM */
554 /*! Ick, LPC10 sounds terrible, but at least we have code for it, if you're tacky enough
557 /*! G.729a is faster than 723 and slightly less expensive */
559 /*! Down to G.723.1 which is proprietary but at least designed for voice */
564 /* Find the first preferred codec in the format given */
565 for (x=0; x < (sizeof(prefs) / sizeof(prefs[0]) ); x++)
568 ast_log(LOG_WARNING, "Don't know any of 0x%x formats\n", fmts);
572 static const struct ast_channel_tech null_tech = {
574 .description = "Null channel (should not see this)",
577 /*! \brief Create a new channel structure */
578 struct ast_channel *ast_channel_alloc(int needqueue)
580 struct ast_channel *tmp;
583 struct varshead *headp;
585 /* If shutting down, don't allocate any new channels */
587 ast_log(LOG_WARNING, "Channel allocation failed: Refusing due to active shutdown\n");
591 if (!(tmp = ast_calloc(1, sizeof(*tmp))))
594 if (!(tmp->sched = sched_context_create())) {
595 ast_log(LOG_WARNING, "Channel allocation failed: Unable to create schedule context\n");
600 ast_string_field_init(tmp, 128);
602 /* Don't bother initializing the last two FD here, because they
603 will *always* be set just a few lines down (AST_TIMING_FD,
605 for (x=0; x<AST_MAX_FDS - 2; x++)
609 tmp->timingfd = open("/dev/zap/timer", O_RDWR);
610 if (tmp->timingfd > -1) {
611 /* Check if timing interface supports new
614 if (!ioctl(tmp->timingfd, ZT_TIMERPONG, &flags))
622 if (pipe(tmp->alertpipe)) {
623 ast_log(LOG_WARNING, "Channel allocation failed: Can't create alert pipe!\n");
627 flags = fcntl(tmp->alertpipe[0], F_GETFL);
628 fcntl(tmp->alertpipe[0], F_SETFL, flags | O_NONBLOCK);
629 flags = fcntl(tmp->alertpipe[1], F_GETFL);
630 fcntl(tmp->alertpipe[1], F_SETFL, flags | O_NONBLOCK);
632 } else /* Make sure we've got it done right if they don't */
633 tmp->alertpipe[0] = tmp->alertpipe[1] = -1;
635 /* Always watch the alertpipe */
636 tmp->fds[AST_ALERT_FD] = tmp->alertpipe[0];
637 /* And timing pipe */
638 tmp->fds[AST_TIMING_FD] = tmp->timingfd;
639 ast_string_field_set(tmp, name, "**Unknown**");
641 tmp->_state = AST_STATE_DOWN;
645 tmp->fin = global_fin;
646 tmp->fout = global_fout;
647 ast_mutex_lock(&uniquelock);
648 if (ast_strlen_zero(ast_config_AST_SYSTEM_NAME))
649 ast_string_field_build(tmp, uniqueid, "%li.%d", (long) time(NULL), uniqueint++);
651 ast_string_field_build(tmp, uniqueid, "%s-%li.%d", ast_config_AST_SYSTEM_NAME, (long) time(NULL), uniqueint++);
652 ast_mutex_unlock(&uniquelock);
653 headp = &tmp->varshead;
654 ast_mutex_init(&tmp->lock);
655 AST_LIST_HEAD_INIT_NOLOCK(headp);
656 AST_LIST_HEAD_INIT_NOLOCK(&tmp->datastores);
657 strcpy(tmp->context, "default");
658 ast_string_field_set(tmp, language, defaultlanguage);
659 strcpy(tmp->exten, "s");
661 tmp->amaflags = ast_default_amaflags;
662 ast_string_field_set(tmp, accountcode, ast_default_accountcode);
664 tmp->tech = &null_tech;
666 AST_LIST_LOCK(&channels);
667 AST_LIST_INSERT_HEAD(&channels, tmp, chan_list);
668 AST_LIST_UNLOCK(&channels);
672 /*! \brief Queue an outgoing media frame */
673 int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
676 struct ast_frame *prev, *cur;
680 /* Build us a copy and free the original one */
681 if (!(f = ast_frdup(fin))) {
682 ast_log(LOG_WARNING, "Unable to duplicate frame\n");
685 ast_channel_lock(chan);
687 for (cur = chan->readq; cur; cur = cur->next) {
688 if ((cur->frametype == AST_FRAME_CONTROL) && (cur->subclass == AST_CONTROL_HANGUP)) {
689 /* Don't bother actually queueing anything after a hangup */
691 ast_channel_unlock(chan);
697 /* Allow up to 96 voice frames outstanding, and up to 128 total frames */
698 if (((fin->frametype == AST_FRAME_VOICE) && (qlen > 96)) || (qlen > 128)) {
699 if (fin->frametype != AST_FRAME_VOICE) {
700 ast_log(LOG_WARNING, "Exceptionally long queue length queuing to %s\n", chan->name);
703 ast_log(LOG_DEBUG, "Dropping voice to exceptionally long queue on %s\n", chan->name);
705 ast_channel_unlock(chan);
713 if (chan->alertpipe[1] > -1) {
714 if (write(chan->alertpipe[1], &blah, sizeof(blah)) != sizeof(blah))
715 ast_log(LOG_WARNING, "Unable to write to alert pipe on %s, frametype/subclass %d/%d (qlen = %d): %s!\n",
716 chan->name, f->frametype, f->subclass, qlen, strerror(errno));
718 } else if (chan->timingfd > -1) {
719 ioctl(chan->timingfd, ZT_TIMERPING, &blah);
721 } else if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
722 pthread_kill(chan->blocker, SIGURG);
724 ast_channel_unlock(chan);
728 /*! \brief Queue a hangup frame for channel */
729 int ast_queue_hangup(struct ast_channel *chan)
731 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
732 /* Yeah, let's not change a lock-critical value without locking */
733 if (!ast_channel_trylock(chan)) {
734 chan->_softhangup |= AST_SOFTHANGUP_DEV;
735 ast_channel_unlock(chan);
737 return ast_queue_frame(chan, &f);
740 /*! \brief Queue a control frame */
741 int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
743 struct ast_frame f = { AST_FRAME_CONTROL, };
745 f.subclass = control;
747 return ast_queue_frame(chan, &f);
750 /*! \brief Queue a control frame with payload */
751 int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control,
752 const void *data, size_t datalen)
754 struct ast_frame f = { AST_FRAME_CONTROL, };
756 f.subclass = control;
757 f.data = (void *) data;
760 return ast_queue_frame(chan, &f);
763 /*! \brief Set defer DTMF flag on channel */
764 int ast_channel_defer_dtmf(struct ast_channel *chan)
769 pre = ast_test_flag(chan, AST_FLAG_DEFER_DTMF);
770 ast_set_flag(chan, AST_FLAG_DEFER_DTMF);
775 /*! \brief Unset defer DTMF flag on channel */
776 void ast_channel_undefer_dtmf(struct ast_channel *chan)
779 ast_clear_flag(chan, AST_FLAG_DEFER_DTMF);
783 * \brief Helper function to find channels.
785 * It supports these modes:
787 * prev != NULL : get channel next in list after prev
788 * name != NULL : get channel with matching name
789 * name != NULL && namelen != 0 : get channel whose name starts with prefix
790 * exten != NULL : get channel whose exten or macroexten matches
791 * context != NULL && exten != NULL : get channel whose context or macrocontext
793 * It returns with the channel's lock held. If getting the individual lock fails,
794 * unlock and retry quickly up to 10 times, then give up.
796 * \note XXX Note that this code has cost O(N) because of the need to verify
797 * that the object is still on the global list.
799 * \note XXX also note that accessing fields (e.g. c->name in ast_log())
800 * can only be done with the lock held or someone could delete the
801 * object while we work on it. This causes some ugliness in the code.
802 * Note that removing the first ast_log() may be harmful, as it would
803 * shorten the retry period and possibly cause failures.
804 * We should definitely go for a better scheme that is deadlock-free.
806 static struct ast_channel *channel_find_locked(const struct ast_channel *prev,
807 const char *name, const int namelen,
808 const char *context, const char *exten)
810 const char *msg = prev ? "deadlock" : "initial deadlock";
812 struct ast_channel *c;
814 for (retries = 0; retries < 10; retries++) {
816 AST_LIST_LOCK(&channels);
817 AST_LIST_TRAVERSE(&channels, c, chan_list) {
818 if (prev) { /* look for next item */
819 if (c != prev) /* not this one */
821 /* found, prepare to return c->next */
822 c = AST_LIST_NEXT(c, chan_list);
823 } else if (name) { /* want match by name */
824 if ( (!namelen && strcasecmp(c->name, name)) ||
825 (namelen && strncasecmp(c->name, name, namelen)) )
826 continue; /* name match failed */
828 if (context && strcasecmp(c->context, context) &&
829 strcasecmp(c->macrocontext, context))
830 continue; /* context match failed */
831 if (strcasecmp(c->exten, exten) &&
832 strcasecmp(c->macroexten, exten))
833 continue; /* exten match failed */
835 /* if we get here, c points to the desired record */
838 /* exit if chan not found or mutex acquired successfully */
839 /* this is slightly unsafe, as we _should_ hold the lock to access c->name */
840 done = c == NULL || ast_channel_trylock(c) == 0;
842 ast_log(LOG_DEBUG, "Avoiding %s for channel '%p'\n", msg, c);
843 AST_LIST_UNLOCK(&channels);
846 usleep(1); /* give other threads a chance before retrying */
849 * c is surely not null, but we don't have the lock so cannot
852 ast_log(LOG_DEBUG, "Failure, could not lock '%p' after %d retries!\n",
858 /*! \brief Browse channels in use */
859 struct ast_channel *ast_channel_walk_locked(const struct ast_channel *prev)
861 return channel_find_locked(prev, NULL, 0, NULL, NULL);
864 /*! \brief Get channel by name and lock it */
865 struct ast_channel *ast_get_channel_by_name_locked(const char *name)
867 return channel_find_locked(NULL, name, 0, NULL, NULL);
870 /*! \brief Get channel by name prefix and lock it */
871 struct ast_channel *ast_get_channel_by_name_prefix_locked(const char *name, const int namelen)
873 return channel_find_locked(NULL, name, namelen, NULL, NULL);
876 /*! \brief Get next channel by name prefix and lock it */
877 struct ast_channel *ast_walk_channel_by_name_prefix_locked(struct ast_channel *chan, const char *name, const int namelen)
879 return channel_find_locked(chan, name, namelen, NULL, NULL);
882 /*! \brief Get channel by exten (and optionally context) and lock it */
883 struct ast_channel *ast_get_channel_by_exten_locked(const char *exten, const char *context)
885 return channel_find_locked(NULL, NULL, 0, context, exten);
888 /*! \brief Wait, look for hangups and condition arg */
889 int ast_safe_sleep_conditional(struct ast_channel *chan, int ms, int (*cond)(void*), void *data)
894 if (cond && ((*cond)(data) == 0))
896 ms = ast_waitfor(chan, ms);
909 /*! \brief Wait, look for hangups */
910 int ast_safe_sleep(struct ast_channel *chan, int ms)
912 return ast_safe_sleep_conditional(chan, ms, NULL, NULL);
915 static void free_cid(struct ast_callerid *cid)
926 free(cid->cid_rdnis);
929 /*! \brief Free a channel structure */
930 void ast_channel_free(struct ast_channel *chan)
933 struct ast_var_t *vardata;
934 struct ast_frame *f, *fp;
935 struct varshead *headp;
936 struct ast_datastore *datastore = NULL;
937 char name[AST_CHANNEL_NAME];
939 headp=&chan->varshead;
941 AST_LIST_LOCK(&channels);
942 AST_LIST_REMOVE(&channels, chan, chan_list);
943 /* Lock and unlock the channel just to be sure nobody
944 has it locked still */
945 ast_channel_lock(chan);
946 ast_channel_unlock(chan);
947 if (chan->tech_pvt) {
948 ast_log(LOG_WARNING, "Channel '%s' may not have been hung up properly\n", chan->name);
949 free(chan->tech_pvt);
953 sched_context_destroy(chan->sched);
955 ast_copy_string(name, chan->name, sizeof(name));
957 /* Stop monitoring */
959 chan->monitor->stop( chan, 0 );
962 /* If there is native format music-on-hold state, free it */
963 if(chan->music_state)
964 ast_moh_cleanup(chan);
966 /* Free translators */
968 ast_translator_free_path(chan->readtrans);
969 if (chan->writetrans)
970 ast_translator_free_path(chan->writetrans);
972 ast_log(LOG_WARNING, "PBX may not have been terminated properly on '%s'\n", chan->name);
973 free_cid(&chan->cid);
974 ast_mutex_destroy(&chan->lock);
975 /* Close pipes if appropriate */
976 if ((fd = chan->alertpipe[0]) > -1)
978 if ((fd = chan->alertpipe[1]) > -1)
980 if ((fd = chan->timingfd) > -1)
990 /* Get rid of each of the data stores on the channel */
991 while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry)))
992 /* Free the data store */
993 ast_channel_datastore_free(datastore);
994 AST_LIST_HEAD_INIT_NOLOCK(&chan->datastores);
996 /* loop over the variables list, freeing all data and deleting list items */
997 /* no need to lock the list, as the channel is already locked */
999 while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
1000 ast_var_delete(vardata);
1002 ast_string_field_free_all(chan);
1004 AST_LIST_UNLOCK(&channels);
1006 ast_device_state_changed_literal(name);
1009 struct ast_datastore *ast_channel_datastore_alloc(const struct ast_datastore_info *info, char *uid)
1011 struct ast_datastore *datastore = NULL;
1013 /* Make sure we at least have type so we can identify this */
1018 /* Allocate memory for datastore and clear it */
1019 datastore = ast_calloc(1, sizeof(*datastore));
1020 if (datastore == NULL) {
1024 datastore->info = info;
1026 datastore->uid = ast_strdup(uid);
1031 int ast_channel_datastore_free(struct ast_datastore *datastore)
1035 /* Using the destroy function (if present) destroy the data */
1036 if (datastore->info->destroy != NULL && datastore->data != NULL) {
1037 datastore->info->destroy(datastore->data);
1038 datastore->data = NULL;
1041 /* Free allocated UID memory */
1042 if (datastore->uid != NULL) {
1043 free(datastore->uid);
1044 datastore->uid = NULL;
1047 /* Finally free memory used by ourselves */
1053 int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
1057 AST_LIST_INSERT_HEAD(&chan->datastores, datastore, entry);
1062 int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
1064 struct ast_datastore *datastore2 = NULL;
1067 /* Find our position and remove ourselves */
1068 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore2, entry) {
1069 if (datastore2 == datastore) {
1070 AST_LIST_REMOVE_CURRENT(&chan->datastores, entry);
1075 AST_LIST_TRAVERSE_SAFE_END
1080 struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, char *uid)
1082 struct ast_datastore *datastore = NULL;
1087 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, entry) {
1088 if (datastore->info == info) {
1089 if (uid != NULL && datastore->uid != NULL) {
1090 if (!strcasecmp(uid, datastore->uid)) {
1091 /* Matched by type AND uid */
1095 /* Matched by type at least */
1100 AST_LIST_TRAVERSE_SAFE_END
1105 int ast_channel_spy_add(struct ast_channel *chan, struct ast_channel_spy *spy)
1107 if (!ast_test_flag(spy, CHANSPY_FORMAT_AUDIO)) {
1108 ast_log(LOG_WARNING, "Could not add channel spy '%s' to channel '%s', only audio format spies are supported.\n",
1109 spy->type, chan->name);
1113 if (ast_test_flag(spy, CHANSPY_READ_VOLADJUST) && (spy->read_queue.format != AST_FORMAT_SLINEAR)) {
1114 ast_log(LOG_WARNING, "Cannot provide volume adjustment on '%s' format spies\n",
1115 ast_getformatname(spy->read_queue.format));
1119 if (ast_test_flag(spy, CHANSPY_WRITE_VOLADJUST) && (spy->write_queue.format != AST_FORMAT_SLINEAR)) {
1120 ast_log(LOG_WARNING, "Cannot provide volume adjustment on '%s' format spies\n",
1121 ast_getformatname(spy->write_queue.format));
1125 if (ast_test_flag(spy, CHANSPY_MIXAUDIO) &&
1126 ((spy->read_queue.format != AST_FORMAT_SLINEAR) ||
1127 (spy->write_queue.format != AST_FORMAT_SLINEAR))) {
1128 ast_log(LOG_WARNING, "Cannot provide audio mixing on '%s'-'%s' format spies\n",
1129 ast_getformatname(spy->read_queue.format), ast_getformatname(spy->write_queue.format));
1134 if (!(chan->spies = ast_calloc(1, sizeof(*chan->spies)))) {
1138 AST_LIST_HEAD_INIT_NOLOCK(&chan->spies->list);
1139 AST_LIST_INSERT_HEAD(&chan->spies->list, spy, list);
1141 AST_LIST_INSERT_TAIL(&chan->spies->list, spy, list);
1144 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE) {
1145 ast_cond_init(&spy->trigger, NULL);
1146 ast_set_flag(spy, CHANSPY_TRIGGER_READ);
1147 ast_clear_flag(spy, CHANSPY_TRIGGER_WRITE);
1150 ast_log(LOG_DEBUG, "Spy %s added to channel %s\n",
1151 spy->type, chan->name);
1156 void ast_channel_spy_stop_by_type(struct ast_channel *chan, const char *type)
1158 struct ast_channel_spy *spy;
1163 AST_LIST_TRAVERSE(&chan->spies->list, spy, list) {
1164 ast_mutex_lock(&spy->lock);
1165 if ((spy->type == type) && (spy->status == CHANSPY_RUNNING)) {
1166 spy->status = CHANSPY_STOP;
1167 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE)
1168 ast_cond_signal(&spy->trigger);
1170 ast_mutex_unlock(&spy->lock);
1174 void ast_channel_spy_trigger_wait(struct ast_channel_spy *spy)
1176 ast_cond_wait(&spy->trigger, &spy->lock);
1179 void ast_channel_spy_remove(struct ast_channel *chan, struct ast_channel_spy *spy)
1181 struct ast_frame *f;
1186 AST_LIST_REMOVE(&chan->spies->list, spy, list);
1188 ast_mutex_lock(&spy->lock);
1190 for (f = spy->read_queue.head; f; f = spy->read_queue.head) {
1191 spy->read_queue.head = f->next;
1194 for (f = spy->write_queue.head; f; f = spy->write_queue.head) {
1195 spy->write_queue.head = f->next;
1199 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE)
1200 ast_cond_destroy(&spy->trigger);
1202 ast_mutex_unlock(&spy->lock);
1204 ast_log(LOG_DEBUG, "Spy %s removed from channel %s\n",
1205 spy->type, chan->name);
1207 if (AST_LIST_EMPTY(&chan->spies->list)) {
1208 if (chan->spies->read_translator.path)
1209 ast_translator_free_path(chan->spies->read_translator.path);
1210 if (chan->spies->write_translator.path)
1211 ast_translator_free_path(chan->spies->write_translator.path);
1217 static void detach_spies(struct ast_channel *chan)
1219 struct ast_channel_spy *spy;
1224 /* Marking the spies as done is sufficient. Chanspy or spy users will get the picture. */
1225 AST_LIST_TRAVERSE(&chan->spies->list, spy, list) {
1226 ast_mutex_lock(&spy->lock);
1227 if (spy->status == CHANSPY_RUNNING)
1228 spy->status = CHANSPY_DONE;
1229 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE)
1230 ast_cond_signal(&spy->trigger);
1231 ast_mutex_unlock(&spy->lock);
1234 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->spies->list, spy, list)
1235 ast_channel_spy_remove(chan, spy);
1236 AST_LIST_TRAVERSE_SAFE_END;
1239 /*! \brief Softly hangup a channel, don't lock */
1240 int ast_softhangup_nolock(struct ast_channel *chan, int cause)
1243 ast_log(LOG_DEBUG, "Soft-Hanging up channel '%s'\n", chan->name);
1244 /* Inform channel driver that we need to be hung up, if it cares */
1245 chan->_softhangup |= cause;
1246 ast_queue_frame(chan, &ast_null_frame);
1247 /* Interrupt any poll call or such */
1248 if (ast_test_flag(chan, AST_FLAG_BLOCKING))
1249 pthread_kill(chan->blocker, SIGURG);
1253 /*! \brief Softly hangup a channel, lock */
1254 int ast_softhangup(struct ast_channel *chan, int cause)
1257 ast_channel_lock(chan);
1258 res = ast_softhangup_nolock(chan, cause);
1259 ast_channel_unlock(chan);
1263 enum spy_direction {
1268 #define SPY_QUEUE_SAMPLE_LIMIT 4000 /* half of one second */
1270 static void queue_frame_to_spies(struct ast_channel *chan, struct ast_frame *f, enum spy_direction dir)
1272 struct ast_frame *translated_frame = NULL;
1273 struct ast_channel_spy *spy;
1274 struct channel_spy_trans *trans;
1276 trans = (dir == SPY_READ) ? &chan->spies->read_translator : &chan->spies->write_translator;
1278 AST_LIST_TRAVERSE(&chan->spies->list, spy, list) {
1279 struct ast_frame *last;
1280 struct ast_frame *f1; /* the frame to append */
1281 struct ast_channel_spy_queue *queue;
1283 ast_mutex_lock(&spy->lock);
1285 queue = (dir == SPY_READ) ? &spy->read_queue : &spy->write_queue;
1287 if ((queue->format == AST_FORMAT_SLINEAR) && (f->subclass != AST_FORMAT_SLINEAR)) {
1288 if (!translated_frame) {
1289 if (trans->path && (trans->last_format != f->subclass)) {
1290 ast_translator_free_path(trans->path);
1294 ast_log(LOG_DEBUG, "Building translator from %s to SLINEAR for spies on channel %s\n",
1295 ast_getformatname(f->subclass), chan->name);
1296 if ((trans->path = ast_translator_build_path(AST_FORMAT_SLINEAR, f->subclass)) == NULL) {
1297 ast_log(LOG_WARNING, "Cannot build a path from %s to %s\n",
1298 ast_getformatname(f->subclass), ast_getformatname(AST_FORMAT_SLINEAR));
1299 ast_mutex_unlock(&spy->lock);
1302 trans->last_format = f->subclass;
1305 if (!(translated_frame = ast_translate(trans->path, f, 0))) {
1306 ast_log(LOG_ERROR, "Translation to %s failed, dropping frame for spies\n",
1307 ast_getformatname(AST_FORMAT_SLINEAR));
1308 ast_mutex_unlock(&spy->lock);
1312 f1 = translated_frame;
1314 if (f->subclass != queue->format) {
1315 ast_log(LOG_WARNING, "Spy '%s' on channel '%s' wants format '%s', but frame is '%s', dropping\n",
1316 spy->type, chan->name,
1317 ast_getformatname(queue->format), ast_getformatname(f->subclass));
1318 ast_mutex_unlock(&spy->lock);
1323 /* duplicate and append f1 to the tail */
1326 for (last = queue->head; last && last->next; last = last->next)
1333 queue->samples += f->samples;
1335 if (queue->samples > SPY_QUEUE_SAMPLE_LIMIT) {
1336 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE) {
1337 switch (ast_test_flag(spy, CHANSPY_TRIGGER_MODE)) {
1338 case CHANSPY_TRIGGER_READ:
1339 if (dir == SPY_WRITE) {
1340 ast_set_flag(spy, CHANSPY_TRIGGER_WRITE);
1341 ast_clear_flag(spy, CHANSPY_TRIGGER_READ);
1343 ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to write-trigger mode\n",
1344 spy->type, chan->name);
1347 case CHANSPY_TRIGGER_WRITE:
1348 if (dir == SPY_READ) {
1349 ast_set_flag(spy, CHANSPY_TRIGGER_READ);
1350 ast_clear_flag(spy, CHANSPY_TRIGGER_WRITE);
1352 ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to read-trigger mode\n",
1353 spy->type, chan->name);
1358 ast_log(LOG_DEBUG, "Triggering queue flush for spy '%s' on '%s'\n",
1359 spy->type, chan->name);
1360 ast_set_flag(spy, CHANSPY_TRIGGER_FLUSH);
1361 ast_cond_signal(&spy->trigger);
1364 ast_log(LOG_DEBUG, "Spy '%s' on channel '%s' %s queue too long, dropping frames\n",
1365 spy->type, chan->name, (dir == SPY_READ) ? "read" : "write");
1366 while (queue->samples > SPY_QUEUE_SAMPLE_LIMIT) {
1367 struct ast_frame *drop = queue->head;
1369 queue->samples -= drop->samples;
1370 queue->head = drop->next;
1375 switch (ast_test_flag(spy, CHANSPY_TRIGGER_MODE)) {
1376 case CHANSPY_TRIGGER_READ:
1377 if (dir == SPY_READ)
1378 ast_cond_signal(&spy->trigger);
1380 case CHANSPY_TRIGGER_WRITE:
1381 if (dir == SPY_WRITE)
1382 ast_cond_signal(&spy->trigger);
1387 ast_mutex_unlock(&spy->lock);
1390 if (translated_frame)
1391 ast_frfree(translated_frame);
1394 static void free_translation(struct ast_channel *clone)
1396 if (clone->writetrans)
1397 ast_translator_free_path(clone->writetrans);
1398 if (clone->readtrans)
1399 ast_translator_free_path(clone->readtrans);
1400 clone->writetrans = NULL;
1401 clone->readtrans = NULL;
1402 clone->rawwriteformat = clone->nativeformats;
1403 clone->rawreadformat = clone->nativeformats;
1406 /*! \brief Hangup a channel */
1407 int ast_hangup(struct ast_channel *chan)
1411 /* Don't actually hang up a channel that will masquerade as someone else, or
1412 if someone is going to masquerade as us */
1413 ast_channel_lock(chan);
1415 detach_spies(chan); /* get rid of spies */
1418 if (ast_do_masquerade(chan))
1419 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
1423 ast_log(LOG_WARNING, "%s getting hung up, but someone is trying to masq into us?!?\n", chan->name);
1424 ast_channel_unlock(chan);
1427 /* If this channel is one which will be masqueraded into something,
1428 mark it as a zombie already, so we know to free it later */
1430 ast_set_flag(chan, AST_FLAG_ZOMBIE);
1431 ast_channel_unlock(chan);
1434 free_translation(chan);
1435 if (chan->stream) /* Close audio stream */
1436 ast_closestream(chan->stream);
1437 if (chan->vstream) /* Close video stream */
1438 ast_closestream(chan->vstream);
1440 sched_context_destroy(chan->sched);
1444 if (chan->generatordata) /* Clear any tone stuff remaining */
1445 chan->generator->release(chan, chan->generatordata);
1446 chan->generatordata = NULL;
1447 chan->generator = NULL;
1448 if (chan->cdr) { /* End the CDR if it hasn't already */
1449 ast_cdr_end(chan->cdr);
1450 ast_cdr_detach(chan->cdr); /* Post and Free the CDR */
1453 if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
1454 ast_log(LOG_WARNING, "Hard hangup called by thread %ld on %s, while fd "
1455 "is blocked by thread %ld in procedure %s! Expect a failure\n",
1456 (long)pthread_self(), chan->name, (long)chan->blocker, chan->blockproc);
1459 if (!ast_test_flag(chan, AST_FLAG_ZOMBIE)) {
1461 ast_log(LOG_DEBUG, "Hanging up channel '%s'\n", chan->name);
1462 if (chan->tech->hangup)
1463 res = chan->tech->hangup(chan);
1466 ast_log(LOG_DEBUG, "Hanging up zombie '%s'\n", chan->name);
1469 ast_channel_unlock(chan);
1470 manager_event(EVENT_FLAG_CALL, "Hangup",
1474 "Cause-txt: %s\r\n",
1478 ast_cause2str(chan->hangupcause)
1480 ast_channel_free(chan);
1484 int ast_answer(struct ast_channel *chan)
1487 ast_channel_lock(chan);
1488 /* You can't answer an outbound call */
1489 if (ast_test_flag(chan, AST_FLAG_OUTGOING))
1491 /* Stop if we're a zombie or need a soft hangup */
1492 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
1493 ast_channel_unlock(chan);
1496 switch(chan->_state) {
1497 case AST_STATE_RINGING:
1498 case AST_STATE_RING:
1499 if (chan->tech->answer)
1500 res = chan->tech->answer(chan);
1501 ast_setstate(chan, AST_STATE_UP);
1502 ast_cdr_answer(chan->cdr);
1505 ast_cdr_answer(chan->cdr);
1508 ast_channel_unlock(chan);
1512 void ast_deactivate_generator(struct ast_channel *chan)
1514 ast_channel_lock(chan);
1515 if (chan->generatordata) {
1516 if (chan->generator && chan->generator->release)
1517 chan->generator->release(chan, chan->generatordata);
1518 chan->generatordata = NULL;
1519 chan->generator = NULL;
1520 chan->fds[AST_GENERATOR_FD] = -1;
1521 ast_clear_flag(chan, AST_FLAG_WRITE_INT);
1522 ast_settimeout(chan, 0, NULL, NULL);
1524 ast_channel_unlock(chan);
1527 static int generator_force(void *data)
1529 /* Called if generator doesn't have data */
1532 int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples);
1533 struct ast_channel *chan = data;
1534 tmp = chan->generatordata;
1535 chan->generatordata = NULL;
1536 generate = chan->generator->generate;
1537 res = generate(chan, tmp, 0, 160);
1538 chan->generatordata = tmp;
1540 ast_log(LOG_DEBUG, "Auto-deactivating generator\n");
1541 ast_deactivate_generator(chan);
1546 int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
1550 ast_channel_lock(chan);
1552 if (chan->generatordata) {
1553 if (chan->generator && chan->generator->release)
1554 chan->generator->release(chan, chan->generatordata);
1555 chan->generatordata = NULL;
1559 if (gen->alloc && !(chan->generatordata = gen->alloc(chan, params))) {
1564 ast_settimeout(chan, 160, generator_force, chan);
1565 chan->generator = gen;
1568 ast_channel_unlock(chan);
1573 /*! \brief Wait for x amount of time on a file descriptor to have input. */
1574 int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception)
1577 ast_waitfor_nandfds(NULL, 0, fds, n, exception, &winner, ms);
1581 /*! \brief Wait for x amount of time on a file descriptor to have input. */
1582 struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
1583 int *exception, int *outfd, int *ms)
1585 struct timeval start = { 0 , 0 };
1586 struct pollfd *pfds;
1592 long whentohangup = 0, diff;
1593 struct ast_channel *winner = NULL;
1599 sz = n * AST_MAX_FDS + nfds;
1600 pfds = alloca(sizeof(*pfds) * sz);
1601 fdmap = alloca(sizeof(*fdmap) * sz);
1608 /* Perform any pending masquerades */
1609 for (x=0; x < n; x++) {
1610 ast_channel_lock(c[x]);
1612 if (ast_do_masquerade(c[x])) {
1613 ast_log(LOG_WARNING, "Masquerade failed\n");
1615 ast_channel_unlock(c[x]);
1619 if (c[x]->whentohangup) {
1622 diff = c[x]->whentohangup - now;
1624 /* Should already be hungup */
1625 c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1626 ast_channel_unlock(c[x]);
1629 if (!whentohangup || (diff < whentohangup))
1630 whentohangup = diff;
1632 ast_channel_unlock(c[x]);
1634 /* Wait full interval */
1637 rms = (whentohangup - now) * 1000; /* timeout in milliseconds */
1638 if (*ms >= 0 && *ms < rms) /* original *ms still smaller */
1642 * Build the pollfd array, putting the channels' fds first,
1643 * followed by individual fds. Order is important because
1644 * individual fd's must have priority over channel fds.
1647 for (x=0; x<n; x++) {
1648 for (y=0; y<AST_MAX_FDS; y++) {
1649 fdmap[max].fdno = y; /* fd y is linked to this pfds */
1650 fdmap[max].chan = x; /* channel x is linked to this pfds */
1651 max += ast_add_fd(&pfds[max], c[x]->fds[y]);
1653 CHECK_BLOCKING(c[x]);
1655 /* Add the individual fds */
1656 for (x=0; x<nfds; x++) {
1657 fdmap[max].chan = -1;
1658 max += ast_add_fd(&pfds[max], fds[x]);
1662 start = ast_tvnow();
1664 if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
1669 res = poll(pfds, max, kbrms);
1672 } while (!res && (rms > 0));
1674 res = poll(pfds, max, rms);
1677 ast_clear_flag(c[x], AST_FLAG_BLOCKING);
1678 if (res < 0) { /* Simulate a timeout if we were interrupted */
1683 if (whentohangup) { /* if we have a timeout, check who expired */
1685 for (x=0; x<n; x++) {
1686 if (c[x]->whentohangup && now >= c[x]->whentohangup) {
1687 c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1693 if (res == 0) { /* no fd ready, reset timeout and done */
1694 *ms = 0; /* XXX use 0 since we may not have an exact timeout. */
1698 * Then check if any channel or fd has a pending event.
1699 * Remember to check channels first and fds last, as they
1700 * must have priority on setting 'winner'
1702 for (x = 0; x < max; x++) {
1703 res = pfds[x].revents;
1706 if (fdmap[x].chan >= 0) { /* this is a channel */
1707 winner = c[fdmap[x].chan]; /* override previous winners */
1709 ast_set_flag(winner, AST_FLAG_EXCEPTION);
1711 ast_clear_flag(winner, AST_FLAG_EXCEPTION);
1712 winner->fdno = fdmap[x].fdno;
1713 } else { /* this is an fd */
1715 *outfd = pfds[x].fd;
1717 *exception = (res & POLLPRI) ? -1 : 0;
1722 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
1729 struct ast_channel *ast_waitfor_n(struct ast_channel **c, int n, int *ms)
1731 return ast_waitfor_nandfds(c, n, NULL, 0, NULL, NULL, ms);
1734 int ast_waitfor(struct ast_channel *c, int ms)
1736 int oldms = ms; /* -1 if no timeout */
1738 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
1739 if ((ms < 0) && (oldms < 0))
1744 /* XXX never to be called with ms = -1 */
1745 int ast_waitfordigit(struct ast_channel *c, int ms)
1747 return ast_waitfordigit_full(c, ms, -1, -1);
1750 int ast_settimeout(struct ast_channel *c, int samples, int (*func)(void *data), void *data)
1754 if (c->timingfd > -1) {
1759 ast_log(LOG_DEBUG, "Scheduling timer at %d sample intervals\n", samples);
1760 res = ioctl(c->timingfd, ZT_TIMERCONFIG, &samples);
1761 c->timingfunc = func;
1762 c->timingdata = data;
1768 int ast_waitfordigit_full(struct ast_channel *c, int ms, int audiofd, int cmdfd)
1771 /* Stop if we're a zombie or need a soft hangup */
1772 if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
1774 /* Wait for a digit, no more than ms milliseconds total. */
1776 struct ast_channel *rchan;
1780 rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
1781 if (!rchan && outfd < 0 && ms) {
1782 if (errno == 0 || errno == EINTR)
1784 ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
1786 } else if (outfd > -1) {
1787 /* The FD we were watching has something waiting */
1791 struct ast_frame *f = ast_read(c);
1795 switch(f->frametype) {
1796 case AST_FRAME_DTMF:
1800 case AST_FRAME_CONTROL:
1801 switch(f->subclass) {
1802 case AST_CONTROL_HANGUP:
1805 case AST_CONTROL_RINGING:
1806 case AST_CONTROL_ANSWER:
1810 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", f->subclass);
1812 case AST_FRAME_VOICE:
1813 /* Write audio if appropriate */
1815 write(audiofd, f->data, f->datalen);
1821 return 0; /* Time is up */
1824 static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
1826 struct ast_frame *f = NULL; /* the return value */
1830 /* this function is very long so make sure there is only one return
1831 * point at the end (there is only one exception to this).
1833 ast_channel_lock(chan);
1835 if (ast_do_masquerade(chan)) {
1836 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
1838 f = &ast_null_frame;
1843 /* Stop if we're a zombie or need a soft hangup */
1844 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
1845 if (chan->generator)
1846 ast_deactivate_generator(chan);
1849 prestate = chan->_state;
1851 if (!ast_test_flag(chan, AST_FLAG_DEFER_DTMF) && !ast_strlen_zero(chan->dtmfq)) {
1852 /* We have DTMF that has been deferred. Return it now */
1853 chan->dtmff.frametype = AST_FRAME_DTMF;
1854 chan->dtmff.subclass = chan->dtmfq[0];
1855 /* Drop first digit from the buffer */
1856 memmove(chan->dtmfq, chan->dtmfq + 1, sizeof(chan->dtmfq) - 1);
1861 /* Read and ignore anything on the alertpipe, but read only
1862 one sizeof(blah) per frame that we send from it */
1863 if (chan->alertpipe[0] > -1)
1864 read(chan->alertpipe[0], &blah, sizeof(blah));
1867 if (chan->timingfd > -1 && chan->fdno == AST_TIMING_FD && ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
1870 ast_clear_flag(chan, AST_FLAG_EXCEPTION);
1872 /* IF we can't get event, assume it's an expired as-per the old interface */
1873 res = ioctl(chan->timingfd, ZT_GETEVENT, &blah);
1875 blah = ZT_EVENT_TIMER_EXPIRED;
1877 if (blah == ZT_EVENT_TIMER_PING) {
1878 if (!chan->readq || !chan->readq->next) {
1879 /* Acknowledge PONG unless we need it again */
1880 if (ioctl(chan->timingfd, ZT_TIMERPONG, &blah)) {
1881 ast_log(LOG_WARNING, "Failed to pong timer on '%s': %s\n", chan->name, strerror(errno));
1884 } else if (blah == ZT_EVENT_TIMER_EXPIRED) {
1885 ioctl(chan->timingfd, ZT_TIMERACK, &blah);
1886 if (chan->timingfunc) {
1887 /* save a copy of func/data before unlocking the channel */
1888 int (*func)(void *) = chan->timingfunc;
1889 void *data = chan->timingdata;
1890 ast_channel_unlock(chan);
1894 ioctl(chan->timingfd, ZT_TIMERCONFIG, &blah);
1895 chan->timingdata = NULL;
1896 ast_channel_unlock(chan);
1898 /* cannot 'goto done' because the channel is already unlocked */
1899 return &ast_null_frame;
1901 ast_log(LOG_NOTICE, "No/unknown event '%d' on timer for '%s'?\n", blah, chan->name);
1904 if (chan->fds[AST_GENERATOR_FD] > -1 && chan->fdno == AST_GENERATOR_FD) {
1905 /* if the AST_GENERATOR_FD is set, call the generator with args
1906 * set to -1 so it can do whatever it needs to.
1908 void *tmp = chan->generatordata;
1909 chan->generatordata = NULL; /* reset to let ast_write get through */
1910 chan->generator->generate(chan, tmp, -1, -1);
1911 chan->generatordata = tmp;
1912 f = &ast_null_frame;
1916 /* Check for pending read queue */
1919 chan->readq = f->next;
1921 /* Interpret hangup and return NULL */
1922 /* XXX why not the same for frames from the channel ? */
1923 if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP) {
1928 chan->blocker = pthread_self();
1929 if (ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
1930 if (chan->tech->exception)
1931 f = chan->tech->exception(chan);
1933 ast_log(LOG_WARNING, "Exception flag set on '%s', but no exception handler\n", chan->name);
1934 f = &ast_null_frame;
1936 /* Clear the exception flag */
1937 ast_clear_flag(chan, AST_FLAG_EXCEPTION);
1938 } else if (chan->tech->read)
1939 f = chan->tech->read(chan);
1941 ast_log(LOG_WARNING, "No read routine on channel %s\n", chan->name);
1945 /* if the channel driver returned more than one frame, stuff the excess
1946 into the readq for the next ast_read call
1949 chan->readq = f->next;
1953 switch (f->frametype) {
1954 case AST_FRAME_CONTROL:
1955 if (f->subclass == AST_CONTROL_ANSWER) {
1956 if (!ast_test_flag(chan, AST_FLAG_OUTGOING)) {
1957 ast_log(LOG_DEBUG, "Ignoring answer on an inbound call!\n");
1959 f = &ast_null_frame;
1960 } else if (prestate == AST_STATE_UP) {
1961 ast_log(LOG_DEBUG, "Dropping duplicate answer!\n");
1963 f = &ast_null_frame;
1965 /* Answer the CDR */
1966 ast_setstate(chan, AST_STATE_UP);
1967 ast_cdr_answer(chan->cdr);
1971 case AST_FRAME_DTMF:
1972 ast_log(LOG_DTMF, "DTMF '%c' received on %s\n", f->subclass, chan->name);
1973 if (ast_test_flag(chan, AST_FLAG_DEFER_DTMF)) {
1974 if (strlen(chan->dtmfq) < sizeof(chan->dtmfq) - 2)
1975 chan->dtmfq[strlen(chan->dtmfq)] = f->subclass;
1977 ast_log(LOG_WARNING, "Dropping deferred DTMF digits on %s\n", chan->name);
1979 f = &ast_null_frame;
1982 case AST_FRAME_DTMF_BEGIN:
1983 ast_log(LOG_DTMF, "DTMF begin '%c' received on %s\n", f->subclass, chan->name);
1985 case AST_FRAME_DTMF_END:
1986 ast_log(LOG_DTMF, "DTMF end '%c' received on %s\n", f->subclass, chan->name);
1988 case AST_FRAME_VOICE:
1991 f = &ast_null_frame;
1992 } else if (!(f->subclass & chan->nativeformats)) {
1993 /* This frame can't be from the current native formats -- drop it on the
1995 ast_log(LOG_NOTICE, "Dropping incompatible voice frame on %s of format %s since our native format has changed to %s\n",
1996 chan->name, ast_getformatname(f->subclass), ast_getformatname(chan->nativeformats));
1998 f = &ast_null_frame;
2001 queue_frame_to_spies(chan, f, SPY_READ);
2003 if (chan->monitor && chan->monitor->read_stream ) {
2004 /* XXX what does this do ? */
2005 #ifndef MONITOR_CONSTANT_DELAY
2006 int jump = chan->outsmpl - chan->insmpl - 4 * f->samples;
2008 if (ast_seekstream(chan->monitor->read_stream, jump + f->samples, SEEK_FORCECUR) == -1)
2009 ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
2010 chan->insmpl += jump + 4 * f->samples;
2012 chan->insmpl+= f->samples;
2014 int jump = chan->outsmpl - chan->insmpl;
2015 if (jump - MONITOR_DELAY >= 0) {
2016 if (ast_seekstream(chan->monitor->read_stream, jump - f->samples, SEEK_FORCECUR) == -1)
2017 ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
2018 chan->insmpl += jump;
2020 chan->insmpl += f->samples;
2022 if (chan->monitor->state == AST_MONITOR_RUNNING) {
2023 if (ast_writestream(chan->monitor->read_stream, f) < 0)
2024 ast_log(LOG_WARNING, "Failed to write data to channel monitor read stream\n");
2028 if (chan->readtrans && (f = ast_translate(chan->readtrans, f, 1)) == NULL)
2029 f = &ast_null_frame;
2031 /* Run generator sitting on the line if timing device not available
2032 * and synchronous generation of outgoing frames is necessary */
2033 if (chan->generatordata && !ast_internal_timing_enabled(chan)) {
2034 void *tmp = chan->generatordata;
2037 if (chan->timingfunc) {
2038 if (option_debug > 1)
2039 ast_log(LOG_DEBUG, "Generator got voice, switching to phase locked mode\n");
2040 ast_settimeout(chan, 0, NULL, NULL);
2043 chan->generatordata = NULL; /* reset, to let writes go through */
2044 res = chan->generator->generate(chan, tmp, f->datalen, f->samples);
2045 chan->generatordata = tmp;
2047 if (option_debug > 1)
2048 ast_log(LOG_DEBUG, "Auto-deactivating generator\n");
2049 ast_deactivate_generator(chan);
2052 } else if (f->frametype == AST_FRAME_CNG) {
2053 if (chan->generator && !chan->timingfunc && (chan->timingfd > -1)) {
2054 if (option_debug > 1)
2055 ast_log(LOG_DEBUG, "Generator got CNG, switching to timed mode\n");
2056 ast_settimeout(chan, 160, generator_force, chan);
2062 /* Make sure we always return NULL in the future */
2063 chan->_softhangup |= AST_SOFTHANGUP_DEV;
2064 if (chan->generator)
2065 ast_deactivate_generator(chan);
2066 /* End the CDR if appropriate */
2068 ast_cdr_end(chan->cdr);
2071 /* High bit prints debugging */
2072 if (chan->fin & DEBUGCHAN_FLAG)
2073 ast_frame_dump(chan->name, f, "<<");
2074 chan->fin = FRAMECOUNT_INC(chan->fin);
2077 ast_channel_unlock(chan);
2081 int ast_internal_timing_enabled(struct ast_channel *chan)
2083 int ret = ast_opt_internal_timing && chan->timingfd > -1;
2084 if (option_debug > 3)
2085 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);
2089 struct ast_frame *ast_read(struct ast_channel *chan)
2091 return __ast_read(chan, 0);
2094 struct ast_frame *ast_read_noaudio(struct ast_channel *chan)
2096 return __ast_read(chan, 1);
2099 int ast_indicate(struct ast_channel *chan, int condition)
2101 return ast_indicate_data(chan, condition, NULL, 0);
2104 int ast_indicate_data(struct ast_channel *chan, int condition, const void *data, size_t datalen)
2108 ast_channel_lock(chan);
2109 /* Stop if we're a zombie or need a soft hangup */
2110 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
2111 ast_channel_unlock(chan);
2114 if (chan->tech->indicate)
2115 res = chan->tech->indicate(chan, condition, data, datalen);
2116 ast_channel_unlock(chan);
2117 if (!chan->tech->indicate || res) {
2119 * Device does not support (that) indication, lets fake
2120 * it by doing our own tone generation. (PM2002)
2123 ast_playtones_stop(chan);
2125 const struct tone_zone_sound *ts = NULL;
2126 switch (condition) {
2127 case AST_CONTROL_RINGING:
2128 ts = ast_get_indication_tone(chan->zone, "ring");
2130 case AST_CONTROL_BUSY:
2131 ts = ast_get_indication_tone(chan->zone, "busy");
2133 case AST_CONTROL_CONGESTION:
2134 ts = ast_get_indication_tone(chan->zone, "congestion");
2137 if (ts && ts->data[0]) {
2138 ast_log(LOG_DEBUG, "Driver for channel '%s' does not support indication %d, emulating it\n", chan->name, condition);
2139 ast_playtones_start(chan,0,ts->data, 1);
2141 } else if (condition == AST_CONTROL_PROGRESS) {
2142 /* ast_playtones_stop(chan); */
2143 } else if (condition == AST_CONTROL_PROCEEDING) {
2144 /* Do nothing, really */
2145 } else if (condition == AST_CONTROL_HOLD) {
2146 /* Do nothing.... */
2147 } else if (condition == AST_CONTROL_UNHOLD) {
2148 /* Do nothing.... */
2149 } else if (condition == AST_CONTROL_VIDUPDATE) {
2150 /* Do nothing.... */
2153 ast_log(LOG_WARNING, "Unable to handle indication %d for '%s'\n", condition, chan->name);
2161 int ast_recvchar(struct ast_channel *chan, int timeout)
2164 char *buf = ast_recvtext(chan, timeout);
2166 return -1; /* error or timeout */
2167 c = *(unsigned char *)buf;
2172 char *ast_recvtext(struct ast_channel *chan, int timeout)
2178 struct ast_frame *f;
2179 if (ast_check_hangup(chan))
2181 res = ast_waitfor(chan, timeout);
2182 if (res <= 0) /* timeout or error */
2184 timeout = res; /* update timeout */
2187 break; /* no frame */
2188 if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP)
2189 done = 1; /* force a break */
2190 else if (f->frametype == AST_FRAME_TEXT) { /* what we want */
2191 buf = ast_strndup((char *) f->data, f->datalen); /* dup and break */
2199 int ast_sendtext(struct ast_channel *chan, const char *text)
2202 /* Stop if we're a zombie or need a soft hangup */
2203 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
2205 CHECK_BLOCKING(chan);
2206 if (chan->tech->send_text)
2207 res = chan->tech->send_text(chan, text);
2208 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2212 static int do_senddigit(struct ast_channel *chan, char digit)
2216 if (chan->tech->send_digit)
2217 res = chan->tech->send_digit(chan, digit);
2220 * Device does not support DTMF tones, lets fake
2221 * it by doing our own generation. (PM2002)
2223 static const char* dtmf_tones[] = {
2224 "!941+1336/100,!0/100", /* 0 */
2225 "!697+1209/100,!0/100", /* 1 */
2226 "!697+1336/100,!0/100", /* 2 */
2227 "!697+1477/100,!0/100", /* 3 */
2228 "!770+1209/100,!0/100", /* 4 */
2229 "!770+1336/100,!0/100", /* 5 */
2230 "!770+1477/100,!0/100", /* 6 */
2231 "!852+1209/100,!0/100", /* 7 */
2232 "!852+1336/100,!0/100", /* 8 */
2233 "!852+1477/100,!0/100", /* 9 */
2234 "!697+1633/100,!0/100", /* A */
2235 "!770+1633/100,!0/100", /* B */
2236 "!852+1633/100,!0/100", /* C */
2237 "!941+1633/100,!0/100", /* D */
2238 "!941+1209/100,!0/100", /* * */
2239 "!941+1477/100,!0/100" }; /* # */
2240 if (digit >= '0' && digit <='9')
2241 ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
2242 else if (digit >= 'A' && digit <= 'D')
2243 ast_playtones_start(chan, 0, dtmf_tones[digit-'A'+10], 0);
2244 else if (digit == '*')
2245 ast_playtones_start(chan, 0, dtmf_tones[14], 0);
2246 else if (digit == '#')
2247 ast_playtones_start(chan, 0, dtmf_tones[15], 0);
2250 ast_log(LOG_DEBUG, "Unable to generate DTMF tone '%c' for '%s'\n", digit, chan->name);
2256 int ast_senddigit(struct ast_channel *chan, char digit)
2258 return do_senddigit(chan, digit);
2261 int ast_prod(struct ast_channel *chan)
2263 struct ast_frame a = { AST_FRAME_VOICE };
2266 /* Send an empty audio frame to get things moving */
2267 if (chan->_state != AST_STATE_UP) {
2268 ast_log(LOG_DEBUG, "Prodding channel '%s'\n", chan->name);
2269 a.subclass = chan->rawwriteformat;
2270 a.data = nothing + AST_FRIENDLY_OFFSET;
2272 if (ast_write(chan, &a))
2273 ast_log(LOG_WARNING, "Prodding channel '%s' failed\n", chan->name);
2278 int ast_write_video(struct ast_channel *chan, struct ast_frame *fr)
2281 if (!chan->tech->write_video)
2283 res = ast_write(chan, fr);
2289 int ast_write(struct ast_channel *chan, struct ast_frame *fr)
2292 struct ast_frame *f = NULL;
2294 /* Stop if we're a zombie or need a soft hangup */
2295 ast_channel_lock(chan);
2296 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
2299 /* Handle any pending masquerades */
2300 if (chan->masq && ast_do_masquerade(chan)) {
2301 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
2305 res = 0; /* XXX explain, why 0 ? */
2308 if (chan->generatordata) {
2309 if (ast_test_flag(chan, AST_FLAG_WRITE_INT))
2310 ast_deactivate_generator(chan);
2312 res = 0; /* XXX explain, why 0 ? */
2316 /* High bit prints debugging */
2317 if (chan->fout & DEBUGCHAN_FLAG)
2318 ast_frame_dump(chan->name, fr, ">>");
2319 CHECK_BLOCKING(chan);
2320 switch(fr->frametype) {
2321 case AST_FRAME_CONTROL:
2322 /* XXX Interpret control frames XXX */
2323 ast_log(LOG_WARNING, "Don't know how to handle control frames yet\n");
2325 case AST_FRAME_DTMF_BEGIN:
2326 res = (chan->tech->send_digit_begin == NULL) ? 0 :
2327 chan->tech->send_digit_begin(chan, fr->subclass);
2329 case AST_FRAME_DTMF_END:
2330 res = (chan->tech->send_digit_end == NULL) ? 0 :
2331 chan->tech->send_digit_end(chan);
2333 case AST_FRAME_DTMF:
2334 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2335 ast_channel_unlock(chan);
2336 res = do_senddigit(chan,fr->subclass);
2337 ast_channel_lock(chan);
2338 CHECK_BLOCKING(chan);
2340 case AST_FRAME_TEXT:
2341 res = (chan->tech->send_text == NULL) ? 0 :
2342 chan->tech->send_text(chan, (char *) fr->data);
2344 case AST_FRAME_HTML:
2345 res = (chan->tech->send_html == NULL) ? 0 :
2346 chan->tech->send_html(chan, fr->subclass, (char *) fr->data, fr->datalen);
2348 case AST_FRAME_VIDEO:
2349 /* XXX Handle translation of video codecs one day XXX */
2350 res = (chan->tech->write_video == NULL) ? 0 :
2351 chan->tech->write_video(chan, fr);
2353 case AST_FRAME_VOICE:
2354 if (chan->tech->write == NULL)
2355 break; /*! \todo XXX should return 0 maybe ? */
2357 /* Bypass translator if we're writing format in the raw write format. This
2358 allows mixing of native / non-native formats */
2359 if (fr->subclass == chan->rawwriteformat)
2362 f = (chan->writetrans) ? ast_translate(chan->writetrans, fr, 0) : fr;
2367 queue_frame_to_spies(chan, f, SPY_WRITE);
2369 if (chan->monitor && chan->monitor->write_stream) {
2370 /* XXX must explain this code */
2371 #ifndef MONITOR_CONSTANT_DELAY
2372 int jump = chan->insmpl - chan->outsmpl - 4 * f->samples;
2374 if (ast_seekstream(chan->monitor->write_stream, jump + f->samples, SEEK_FORCECUR) == -1)
2375 ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
2376 chan->outsmpl += jump + 4 * f->samples;
2378 chan->outsmpl += f->samples;
2380 int jump = chan->insmpl - chan->outsmpl;
2381 if (jump - MONITOR_DELAY >= 0) {
2382 if (ast_seekstream(chan->monitor->write_stream, jump - f->samples, SEEK_FORCECUR) == -1)
2383 ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
2384 chan->outsmpl += jump;
2386 chan->outsmpl += f->samples;
2388 if (chan->monitor->state == AST_MONITOR_RUNNING) {
2389 if (ast_writestream(chan->monitor->write_stream, f) < 0)
2390 ast_log(LOG_WARNING, "Failed to write data to channel monitor write stream\n");
2394 res = chan->tech->write(chan, f);
2401 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2402 /* Consider a write failure to force a soft hangup */
2404 chan->_softhangup |= AST_SOFTHANGUP_DEV;
2406 chan->fout = FRAMECOUNT_INC(chan->fout);
2409 ast_channel_unlock(chan);
2413 static int set_format(struct ast_channel *chan, int fmt, int *rawformat, int *format,
2414 struct ast_trans_pvt **trans, const int direction)
2419 /* Make sure we only consider audio */
2420 fmt &= AST_FORMAT_AUDIO_MASK;
2422 native = chan->nativeformats;
2423 /* Find a translation path from the native format to one of the desired formats */
2426 res = ast_translator_best_choice(&fmt, &native);
2429 res = ast_translator_best_choice(&native, &fmt);
2432 ast_log(LOG_WARNING, "Unable to find a codec translation path from %s to %s\n",
2433 ast_getformatname(native), ast_getformatname(fmt));
2437 /* Now we have a good choice for both. */
2438 ast_channel_lock(chan);
2439 *rawformat = native;
2440 /* User perspective is fmt */
2442 /* Free any read translation we have right now */
2444 ast_translator_free_path(*trans);
2445 /* Build a translation path from the raw format to the desired format */
2448 *trans = ast_translator_build_path(*format, *rawformat);
2451 *trans = ast_translator_build_path(*rawformat, *format);
2452 ast_channel_unlock(chan);
2454 ast_log(LOG_DEBUG, "Set channel %s to %s format %s\n", chan->name,
2455 direction ? "write" : "read", ast_getformatname(fmt));
2459 int ast_set_read_format(struct ast_channel *chan, int fmt)
2461 return set_format(chan, fmt, &chan->rawreadformat, &chan->readformat,
2462 &chan->readtrans, 0);
2465 int ast_set_write_format(struct ast_channel *chan, int fmt)
2467 return set_format(chan, fmt, &chan->rawwriteformat, &chan->writeformat,
2468 &chan->writetrans, 1);
2471 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)
2475 struct ast_channel *chan;
2481 outstate = &dummy_outstate; /* make outstate always a valid pointer */
2483 chan = ast_request(type, format, data, &cause);
2485 ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, (char *)data);
2486 /* compute error and return */
2487 if (cause == AST_CAUSE_BUSY)
2488 *outstate = AST_CONTROL_BUSY;
2489 else if (cause == AST_CAUSE_CONGESTION)
2490 *outstate = AST_CONTROL_CONGESTION;
2496 ast_set_variables(chan, oh->vars);
2497 /* XXX why is this necessary, for the parent_channel perhaps ? */
2498 if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name))
2499 ast_set_callerid(chan, oh->cid_num, oh->cid_name, oh->cid_num);
2500 if (oh->parent_channel)
2501 ast_channel_inherit_variables(oh->parent_channel, chan);
2503 ast_cdr_setaccount(chan, oh->account);
2505 ast_set_callerid(chan, cid_num, cid_name, cid_num);
2507 if (ast_call(chan, data, 0)) { /* ast_call failed... */
2508 ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, (char *)data);
2510 res = 1; /* mark success in case chan->_state is already AST_STATE_UP */
2511 while (timeout && chan->_state != AST_STATE_UP) {
2512 struct ast_frame *f;
2513 res = ast_waitfor(chan, timeout);
2514 if (res <= 0) /* error, timeout, or done */
2520 *outstate = AST_CONTROL_HANGUP;
2524 if (f->frametype == AST_FRAME_CONTROL) {
2525 switch (f->subclass) {
2526 case AST_CONTROL_RINGING: /* record but keep going */
2527 *outstate = f->subclass;
2530 case AST_CONTROL_BUSY:
2531 case AST_CONTROL_CONGESTION:
2532 case AST_CONTROL_ANSWER:
2533 *outstate = f->subclass;
2534 timeout = 0; /* trick to force exit from the while() */
2537 case AST_CONTROL_PROGRESS: /* Ignore */
2538 case -1: /* Ignore -- just stopping indications */
2542 ast_log(LOG_NOTICE, "Don't know what to do with control frame %d\n", f->subclass);
2551 if (!ast_strlen_zero(oh->context))
2552 ast_copy_string(chan->context, oh->context, sizeof(chan->context));
2553 if (!ast_strlen_zero(oh->exten))
2554 ast_copy_string(chan->exten, oh->exten, sizeof(chan->exten));
2556 chan->priority = oh->priority;
2558 if (chan->_state == AST_STATE_UP)
2559 *outstate = AST_CONTROL_ANSWER;
2562 if (!chan->cdr && (chan->cdr = ast_cdr_alloc()))
2563 ast_cdr_init(chan->cdr, chan);
2566 snprintf(tmp, sizeof(tmp), "%s/%s", type, (char *)data);
2567 ast_cdr_setapp(chan->cdr,"Dial",tmp);
2568 ast_cdr_update(chan);
2569 ast_cdr_start(chan->cdr);
2570 ast_cdr_end(chan->cdr);
2571 /* If the cause wasn't handled properly */
2572 if (ast_cdr_disposition(chan->cdr,chan->hangupcause))
2573 ast_cdr_failed(chan->cdr);
2581 struct ast_channel *ast_request_and_dial(const char *type, int format, void *data, int timeout, int *outstate, const char *cidnum, const char *cidname)
2583 return __ast_request_and_dial(type, format, data, timeout, outstate, cidnum, cidname, NULL);
2586 struct ast_channel *ast_request(const char *type, int format, void *data, int *cause)
2588 struct chanlist *chan;
2589 struct ast_channel *c;
2597 *cause = AST_CAUSE_NOTDEFINED;
2599 if (AST_LIST_LOCK(&channels)) {
2600 ast_log(LOG_WARNING, "Unable to lock channel list\n");
2604 AST_LIST_TRAVERSE(&backends, chan, list) {
2605 if (strcasecmp(type, chan->tech->type))
2608 capabilities = chan->tech->capabilities;
2610 res = ast_translator_best_choice(&fmt, &capabilities);
2612 ast_log(LOG_WARNING, "No translator path exists for channel type %s (native %d) to %d\n", type, chan->tech->capabilities, format);
2613 AST_LIST_UNLOCK(&channels);
2616 AST_LIST_UNLOCK(&channels);
2617 if (!chan->tech->requester)
2620 if (!(c = chan->tech->requester(type, capabilities, data, cause)))
2623 if (c->_state == AST_STATE_DOWN) {
2624 manager_event(EVENT_FLAG_CALL, "Newchannel",
2628 "CallerIDName: %s\r\n"
2630 c->name, ast_state2str(c->_state),
2631 S_OR(c->cid.cid_num, "<unknown>"),
2632 S_OR(c->cid.cid_name, "<unknown>"),
2638 ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
2639 *cause = AST_CAUSE_NOSUCHDRIVER;
2640 AST_LIST_UNLOCK(&channels);
2645 int ast_call(struct ast_channel *chan, char *addr, int timeout)
2647 /* Place an outgoing call, but don't wait any longer than timeout ms before returning.
2648 If the remote end does not answer within the timeout, then do NOT hang up, but
2651 /* Stop if we're a zombie or need a soft hangup */
2652 ast_channel_lock(chan);
2653 if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan)) {
2654 if (chan->tech->call)
2655 res = chan->tech->call(chan, addr, timeout);
2656 ast_set_flag(chan, AST_FLAG_OUTGOING);
2658 ast_channel_unlock(chan);
2663 \brief Transfer a call to dest, if the channel supports transfer
2667 \arg the manager interface
2669 int ast_transfer(struct ast_channel *chan, char *dest)
2673 /* Stop if we're a zombie or need a soft hangup */
2674 ast_channel_lock(chan);
2675 if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan)) {
2676 if (chan->tech->transfer) {
2677 res = chan->tech->transfer(chan, dest);
2683 ast_channel_unlock(chan);
2687 int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders)
2689 return ast_readstring_full(c, s, len, timeout, ftimeout, enders, -1, -1);
2692 int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders, int audiofd, int ctrlfd)
2694 int pos = 0; /* index in the buffer where we accumulate digits */
2697 /* Stop if we're a zombie or need a soft hangup */
2698 if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
2705 d = ast_waitstream_full(c, AST_DIGIT_ANY, audiofd, ctrlfd);
2709 d = ast_waitfordigit_full(c, to, audiofd, ctrlfd);
2711 d = ast_waitfordigit_full(c, to, audiofd, ctrlfd);
2723 if (!strchr(enders, d))
2725 if (strchr(enders, d) || (pos >= len)) {
2735 int ast_channel_supports_html(struct ast_channel *chan)
2737 return (chan->tech->send_html) ? 1 : 0;
2740 int ast_channel_sendhtml(struct ast_channel *chan, int subclass, const char *data, int datalen)
2742 if (chan->tech->send_html)
2743 return chan->tech->send_html(chan, subclass, data, datalen);
2747 int ast_channel_sendurl(struct ast_channel *chan, const char *url)
2749 return ast_channel_sendhtml(chan, AST_HTML_URL, url, strlen(url) + 1);
2752 int ast_channel_make_compatible(struct ast_channel *chan, struct ast_channel *peer)
2757 /* Set up translation from the chan to the peer */
2758 src = chan->nativeformats;
2759 dst = peer->nativeformats;
2760 if (ast_translator_best_choice(&dst, &src) < 0) {
2761 ast_log(LOG_WARNING, "No path to translate from %s(%d) to %s(%d)\n", chan->name, src, peer->name, dst);
2765 /* if the best path is not 'pass through', then
2766 transcoding is needed; if desired, force transcode path
2767 to use SLINEAR between channels, but only if there is
2768 no direct conversion available */
2769 if ((src != dst) && ast_opt_transcode_via_slin &&
2770 (ast_translate_path_steps(dst, src) != 1))
2771 dst = AST_FORMAT_SLINEAR;
2772 if (ast_set_read_format(chan, dst) < 0) {
2773 ast_log(LOG_WARNING, "Unable to set read format on channel %s to %d\n", chan->name, dst);
2776 if (ast_set_write_format(peer, dst) < 0) {
2777 ast_log(LOG_WARNING, "Unable to set write format on channel %s to %d\n", peer->name, dst);
2781 /* Set up translation from the peer to the chan */
2782 src = peer->nativeformats;
2783 dst = chan->nativeformats;
2784 if (ast_translator_best_choice(&dst, &src) < 0) {
2785 ast_log(LOG_WARNING, "No path to translate from %s(%d) to %s(%d)\n", peer->name, src, chan->name, dst);
2789 /* if the best path is not 'pass through', then
2790 transcoding is needed; if desired, force transcode path
2791 to use SLINEAR between channels, but only if there is
2792 no direct conversion available */
2793 if ((src != dst) && ast_opt_transcode_via_slin &&
2794 (ast_translate_path_steps(dst, src) != 1))
2795 dst = AST_FORMAT_SLINEAR;
2796 if (ast_set_read_format(peer, dst) < 0) {
2797 ast_log(LOG_WARNING, "Unable to set read format on channel %s to %d\n", peer->name, dst);
2800 if (ast_set_write_format(chan, dst) < 0) {
2801 ast_log(LOG_WARNING, "Unable to set write format on channel %s to %d\n", chan->name, dst);
2807 int ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clone)
2811 if (original == clone) {
2812 ast_log(LOG_WARNING, "Can't masquerade channel '%s' into itself!\n", original->name);
2815 ast_channel_lock(original);
2816 while(ast_channel_trylock(clone)) {
2817 ast_channel_unlock(original);
2819 ast_channel_lock(original);
2821 ast_log(LOG_DEBUG, "Planning to masquerade channel %s into the structure of %s\n",
2822 clone->name, original->name);
2823 if (original->masq) {
2824 ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
2825 original->masq->name, original->name);
2826 } else if (clone->masqr) {
2827 ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
2828 clone->name, clone->masqr->name);
2830 original->masq = clone;
2831 clone->masqr = original;
2832 ast_queue_frame(original, &ast_null_frame);
2833 ast_queue_frame(clone, &ast_null_frame);
2834 ast_log(LOG_DEBUG, "Done planning to masquerade channel %s into the structure of %s\n", clone->name, original->name);
2837 ast_channel_unlock(clone);
2838 ast_channel_unlock(original);
2842 void ast_change_name(struct ast_channel *chan, char *newname)
2844 manager_event(EVENT_FLAG_CALL, "Rename", "Oldname: %s\r\nNewname: %s\r\nUniqueid: %s\r\n", chan->name, newname, chan->uniqueid);
2845 ast_string_field_set(chan, name, newname);
2848 void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child)
2850 struct ast_var_t *current, *newvar;
2851 const char *varname;
2853 AST_LIST_TRAVERSE(&parent->varshead, current, entries) {
2856 varname = ast_var_full_name(current);
2860 if (varname[0] == '_') {
2862 if (varname[1] == '_')
2868 newvar = ast_var_assign(&varname[1], ast_var_value(current));
2870 AST_LIST_INSERT_TAIL(&child->varshead, newvar, entries);
2872 ast_log(LOG_DEBUG, "Copying soft-transferable variable %s.\n", ast_var_name(newvar));
2876 newvar = ast_var_assign(ast_var_full_name(current), ast_var_value(current));
2878 AST_LIST_INSERT_TAIL(&child->varshead, newvar, entries);
2880 ast_log(LOG_DEBUG, "Copying hard-transferable variable %s.\n", ast_var_name(newvar));
2885 ast_log(LOG_DEBUG, "Not copying variable %s.\n", ast_var_name(current));
2892 \brief Clone channel variables from 'clone' channel into 'original' channel
2894 All variables except those related to app_groupcount are cloned.
2895 Variables are actually _removed_ from 'clone' channel, presumably
2896 because it will subsequently be destroyed.
2898 \note Assumes locks will be in place on both channels when called.
2900 static void clone_variables(struct ast_channel *original, struct ast_channel *clone)
2902 struct ast_var_t *varptr;
2904 /* we need to remove all app_groupcount related variables from the original
2905 channel before merging in the clone's variables; any groups assigned to the
2906 original channel should be released, only those assigned to the clone
2910 AST_LIST_TRAVERSE_SAFE_BEGIN(&original->varshead, varptr, entries) {
2911 if (!strncmp(ast_var_name(varptr), GROUP_CATEGORY_PREFIX, strlen(GROUP_CATEGORY_PREFIX))) {
2912 AST_LIST_REMOVE(&original->varshead, varptr, entries);
2913 ast_var_delete(varptr);
2916 AST_LIST_TRAVERSE_SAFE_END;
2918 /* Append variables from clone channel into original channel */
2919 /* XXX Is this always correct? We have to in order to keep MACROS working XXX */
2920 if (AST_LIST_FIRST(&clone->varshead))
2921 AST_LIST_INSERT_TAIL(&original->varshead, AST_LIST_FIRST(&clone->varshead), entries);
2925 \brief Masquerade a channel
2927 \note Assumes channel will be locked when called
2929 int ast_do_masquerade(struct ast_channel *original)
2934 struct ast_frame *cur, *prev;
2935 const struct ast_channel_tech *t;
2937 struct ast_callerid tmpcid;
2938 struct ast_channel *clone = original->masq;
2939 int rformat = original->readformat;
2940 int wformat = original->writeformat;
2946 if (option_debug > 3)
2947 ast_log(LOG_DEBUG, "Actually Masquerading %s(%d) into the structure of %s(%d)\n",
2948 clone->name, clone->_state, original->name, original->_state);
2950 /* XXX This is a seriously wacked out operation. We're essentially putting the guts of
2951 the clone channel into the original channel. Start by killing off the original
2952 channel's backend. I'm not sure we're going to keep this function, because
2953 while the features are nice, the cost is very high in terms of pure nastiness. XXX */
2955 /* We need the clone's lock, too */
2956 ast_channel_lock(clone);
2958 if (option_debug > 1)
2959 ast_log(LOG_DEBUG, "Got clone lock for masquerade on '%s' at %p\n", clone->name, &clone->lock);
2961 /* Having remembered the original read/write formats, we turn off any translation on either
2963 free_translation(clone);
2964 free_translation(original);
2967 /* Unlink the masquerade */
2968 original->masq = NULL;
2969 clone->masqr = NULL;
2971 /* Save the original name */
2972 ast_copy_string(orig, original->name, sizeof(orig));
2973 /* Save the new name */
2974 ast_copy_string(newn, clone->name, sizeof(newn));
2975 /* Create the masq name */
2976 snprintf(masqn, sizeof(masqn), "%s<MASQ>", newn);
2978 /* Copy the name from the clone channel */
2979 ast_string_field_set(original, name, newn);
2981 /* Mangle the name of the clone channel */
2982 ast_string_field_set(clone, name, masqn);
2984 /* Notify any managers of the change, first the masq then the other */
2985 manager_event(EVENT_FLAG_CALL, "Rename", "Oldname: %s\r\nNewname: %s\r\nUniqueid: %s\r\n", newn, masqn, clone->uniqueid);
2986 manager_event(EVENT_FLAG_CALL, "Rename", "Oldname: %s\r\nNewname: %s\r\nUniqueid: %s\r\n", orig, newn, original->uniqueid);
2988 /* Swap the technologies */
2990 original->tech = clone->tech;
2993 t_pvt = original->tech_pvt;
2994 original->tech_pvt = clone->tech_pvt;
2995 clone->tech_pvt = t_pvt;
2997 /* Swap the readq's */
2998 cur = original->readq;
2999 original->readq = clone->readq;
3002 /* Swap the alertpipes */
3003 for (i = 0; i < 2; i++) {
3004 x = original->alertpipe[i];
3005 original->alertpipe[i] = clone->alertpipe[i];
3006 clone->alertpipe[i] = x;
3009 /* Swap the raw formats */
3010 x = original->rawreadformat;
3011 original->rawreadformat = clone->rawreadformat;
3012 clone->rawreadformat = x;
3013 x = original->rawwriteformat;
3014 original->rawwriteformat = clone->rawwriteformat;
3015 clone->rawwriteformat = x;
3017 /* Save any pending frames on both sides. Start by counting
3018 * how many we're going to need... */
3021 for (cur = clone->readq; cur; cur = cur->next) {
3025 /* If we had any, prepend them to the ones already in the queue, and
3026 * load up the alertpipe */
3028 prev->next = original->readq;
3029 original->readq = clone->readq;
3030 clone->readq = NULL;
3031 if (original->alertpipe[1] > -1) {
3032 for (i = 0; i < x; i++)
3033 write(original->alertpipe[1], &x, sizeof(x));
3036 clone->_softhangup = AST_SOFTHANGUP_DEV;
3039 /* And of course, so does our current state. Note we need not
3040 call ast_setstate since the event manager doesn't really consider
3041 these separate. We do this early so that the clone has the proper
3042 state of the original channel. */
3043 origstate = original->_state;
3044 original->_state = clone->_state;
3045 clone->_state = origstate;
3047 if (clone->tech->fixup){
3048 res = clone->tech->fixup(original, clone);
3050 ast_log(LOG_WARNING, "Fixup failed on channel %s, strange things may happen.\n", clone->name);
3053 /* Start by disconnecting the original's physical side */
3054 if (clone->tech->hangup)
3055 res = clone->tech->hangup(clone);
3057 ast_log(LOG_WARNING, "Hangup failed! Strange things may happen!\n");
3058 ast_channel_unlock(clone);
3062 snprintf(zombn, sizeof(zombn), "%s<ZOMBIE>", orig);
3063 /* Mangle the name of the clone channel */
3064 ast_string_field_set(clone, name, zombn);
3065 manager_event(EVENT_FLAG_CALL, "Rename", "Oldname: %s\r\nNewname: %s\r\nUniqueid: %s\r\n", masqn, zombn, clone->uniqueid);
3067 /* Update the type. */
3068 t_pvt = original->monitor;
3069 original->monitor = clone->monitor;
3070 clone->monitor = t_pvt;
3072 /* Keep the same language. */
3073 ast_string_field_set(original, language, clone->language);
3074 /* Copy the FD's other than the generator fd */
3075 for (x = 0; x < AST_MAX_FDS; x++) {
3076 if (x != AST_GENERATOR_FD)
3077 original->fds[x] = clone->fds[x];
3079 /* Move data stores over */
3080 if (AST_LIST_FIRST(&clone->datastores))
3081 AST_LIST_INSERT_TAIL(&original->datastores, AST_LIST_FIRST(&clone->datastores), entry);
3082 AST_LIST_HEAD_INIT_NOLOCK(&clone->datastores);
3084 clone_variables(original, clone);
3085 AST_LIST_HEAD_INIT_NOLOCK(&clone->varshead);
3086 /* Presense of ADSI capable CPE follows clone */
3087 original->adsicpe = clone->adsicpe;
3088 /* Bridge remains the same */
3089 /* CDR fields remain the same */
3090 /* XXX What about blocking, softhangup, blocker, and lock and blockproc? XXX */
3091 /* Application and data remain the same */
3092 /* Clone exception becomes real one, as with fdno */
3093 ast_copy_flags(original, clone, AST_FLAG_EXCEPTION);
3094 original->fdno = clone->fdno;
3095 /* Schedule context remains the same */
3096 /* Stream stuff stays the same */
3097 /* Keep the original state. The fixup code will need to work with it most likely */
3099 /* Just swap the whole structures, nevermind the allocations, they'll work themselves
3101 tmpcid = original->cid;
3102 original->cid = clone->cid;
3103 clone->cid = tmpcid;
3105 /* Restore original timing file descriptor */
3106 original->fds[AST_TIMING_FD] = original->timingfd;
3108 /* Our native formats are different now */
3109 original->nativeformats = clone->nativeformats;
3111 /* Context, extension, priority, app data, jump table, remain the same */
3112 /* pvt switches. pbx stays the same, as does next */
3114 /* Set the write format */
3115 ast_set_write_format(original, wformat);
3117 /* Set the read format */
3118 ast_set_read_format(original, rformat);
3120 /* Copy the music class */
3121 ast_string_field_set(original, musicclass, clone->musicclass);
3124 ast_log(LOG_DEBUG, "Putting channel %s in %d/%d formats\n", original->name, wformat, rformat);
3126 /* Okay. Last thing is to let the channel driver know about all this mess, so he
3127 can fix up everything as best as possible */
3128 if (original->tech->fixup) {
3129 res = original->tech->fixup(clone, original);
3131 ast_log(LOG_WARNING, "Channel for type '%s' could not fixup channel %s\n",
3132 original->tech->type, original->name);
3133 ast_channel_unlock(clone);
3137 ast_log(LOG_WARNING, "Channel type '%s' does not have a fixup routine (for %s)! Bad things may happen.\n",
3138 original->tech->type, original->name);
3140 /* Now, at this point, the "clone" channel is totally F'd up. We mark it as
3141 a zombie so nothing tries to touch it. If it's already been marked as a
3142 zombie, then free it now (since it already is considered invalid). */
3143 if (ast_test_flag(clone, AST_FLAG_ZOMBIE)) {
3145 ast_log(LOG_DEBUG, "Destroying channel clone '%s'\n", clone->name);
3146 ast_channel_unlock(clone);
3147 manager_event(EVENT_FLAG_CALL, "Hangup",
3151 "Cause-txt: %s\r\n",
3155 ast_cause2str(clone->hangupcause)
3157 ast_channel_free(clone);
3159 ast_log(LOG_DEBUG, "Released clone lock on '%s'\n", clone->name);
3160 ast_set_flag(clone, AST_FLAG_ZOMBIE);
3161 ast_queue_frame(clone, &ast_null_frame);
3162 ast_channel_unlock(clone);
3165 /* Signal any blocker */
3166 if (ast_test_flag(original, AST_FLAG_BLOCKING))
3167 pthread_kill(original->blocker, S