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$")
41 #include <sys/ioctl.h>
42 #include <zaptel/zaptel.h>
45 #include "asterisk/pbx.h"
46 #include "asterisk/frame.h"
47 #include "asterisk/sched.h"
48 #include "asterisk/options.h"
49 #include "asterisk/channel.h"
50 #include "asterisk/chanspy.h"
51 #include "asterisk/musiconhold.h"
52 #include "asterisk/logger.h"
53 #include "asterisk/say.h"
54 #include "asterisk/file.h"
55 #include "asterisk/cli.h"
56 #include "asterisk/translate.h"
57 #include "asterisk/manager.h"
58 #include "asterisk/chanvars.h"
59 #include "asterisk/linkedlists.h"
60 #include "asterisk/indications.h"
61 #include "asterisk/monitor.h"
62 #include "asterisk/causes.h"
63 #include "asterisk/callerid.h"
64 #include "asterisk/utils.h"
65 #include "asterisk/lock.h"
66 #include "asterisk/app.h"
67 #include "asterisk/transcap.h"
68 #include "asterisk/devicestate.h"
69 #include "asterisk/sha1.h"
70 #include "asterisk/threadstorage.h"
71 #include "asterisk/slinfactory.h"
73 struct channel_spy_trans {
75 struct ast_trans_pvt *path;
78 struct ast_channel_spy_list {
79 struct channel_spy_trans read_translator;
80 struct channel_spy_trans write_translator;
81 AST_LIST_HEAD_NOLOCK(, ast_channel_spy) list;
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 /*! 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 /* XXX 100ms ... this won't work with wideband support */
108 #define AST_DEFAULT_EMULATE_DTMF_SAMPLES 800
111 const struct ast_channel_tech *tech;
112 AST_LIST_ENTRY(chanlist) list;
115 /*! the list of registered channel types */
116 static AST_LIST_HEAD_NOLOCK_STATIC(backends, chanlist);
118 /*! the list of channels we have. Note that the lock for this list is used for
119 both the channels list and the backends list. */
120 static AST_LIST_HEAD_STATIC(channels, ast_channel);
122 /*! map AST_CAUSE's to readable string representations */
123 const struct ast_cause {
128 { AST_CAUSE_UNALLOCATED, "UNALLOCATED", "Unallocated (unassigned) number" },
129 { AST_CAUSE_NO_ROUTE_TRANSIT_NET, "NO_ROUTE_TRANSIT_NET", "No route to specified transmit network" },
130 { AST_CAUSE_NO_ROUTE_DESTINATION, "NO_ROUTE_DESTINATION", "No route to destination" },
131 { AST_CAUSE_CHANNEL_UNACCEPTABLE, "CHANNEL_UNACCEPTABLE", "Channel unacceptable" },
132 { AST_CAUSE_CALL_AWARDED_DELIVERED, "CALL_AWARDED_DELIVERED", "Call awarded and being delivered in an established channel" },
133 { AST_CAUSE_NORMAL_CLEARING, "NORMAL_CLEARING", "Normal Clearing" },
134 { AST_CAUSE_USER_BUSY, "USER_BUSY", "User busy" },
135 { AST_CAUSE_NO_USER_RESPONSE, "NO_USER_RESPONSE", "No user responding" },
136 { AST_CAUSE_NO_ANSWER, "NO_ANSWER", "User alerting, no answer" },
137 { AST_CAUSE_CALL_REJECTED, "CALL_REJECTED", "Call Rejected" },
138 { AST_CAUSE_NUMBER_CHANGED, "NUMBER_CHANGED", "Number changed" },
139 { AST_CAUSE_DESTINATION_OUT_OF_ORDER, "DESTINATION_OUT_OF_ORDER", "Destination out of order" },
140 { AST_CAUSE_INVALID_NUMBER_FORMAT, "INVALID_NUMBER_FORMAT", "Invalid number format" },
141 { AST_CAUSE_FACILITY_REJECTED, "FACILITY_REJECTED", "Facility rejected" },
142 { AST_CAUSE_RESPONSE_TO_STATUS_ENQUIRY, "RESPONSE_TO_STATUS_ENQUIRY", "Response to STATus ENQuiry" },
143 { AST_CAUSE_NORMAL_UNSPECIFIED, "NORMAL_UNSPECIFIED", "Normal, unspecified" },
144 { AST_CAUSE_NORMAL_CIRCUIT_CONGESTION, "NORMAL_CIRCUIT_CONGESTION", "Circuit/channel congestion" },
145 { AST_CAUSE_NETWORK_OUT_OF_ORDER, "NETWORK_OUT_OF_ORDER", "Network out of order" },
146 { AST_CAUSE_NORMAL_TEMPORARY_FAILURE, "NORMAL_TEMPORARY_FAILURE", "Temporary failure" },
147 { AST_CAUSE_SWITCH_CONGESTION, "SWITCH_CONGESTION", "Switching equipment congestion" },
148 { AST_CAUSE_ACCESS_INFO_DISCARDED, "ACCESS_INFO_DISCARDED", "Access information discarded" },
149 { AST_CAUSE_REQUESTED_CHAN_UNAVAIL, "REQUESTED_CHAN_UNAVAIL", "Requested channel not available" },
150 { AST_CAUSE_PRE_EMPTED, "PRE_EMPTED", "Pre-empted" },
151 { AST_CAUSE_FACILITY_NOT_SUBSCRIBED, "FACILITY_NOT_SUBSCRIBED", "Facility not subscribed" },
152 { AST_CAUSE_OUTGOING_CALL_BARRED, "OUTGOING_CALL_BARRED", "Outgoing call barred" },
153 { AST_CAUSE_INCOMING_CALL_BARRED, "INCOMING_CALL_BARRED", "Incoming call barred" },
154 { AST_CAUSE_BEARERCAPABILITY_NOTAUTH, "BEARERCAPABILITY_NOTAUTH", "Bearer capability not authorized" },
155 { AST_CAUSE_BEARERCAPABILITY_NOTAVAIL, "BEARERCAPABILITY_NOTAVAIL", "Bearer capability not available" },
156 { AST_CAUSE_BEARERCAPABILITY_NOTIMPL, "BEARERCAPABILITY_NOTIMPL", "Bearer capability not implemented" },
157 { AST_CAUSE_CHAN_NOT_IMPLEMENTED, "CHAN_NOT_IMPLEMENTED", "Channel not implemented" },
158 { AST_CAUSE_FACILITY_NOT_IMPLEMENTED, "FACILITY_NOT_IMPLEMENTED", "Facility not implemented" },
159 { AST_CAUSE_INVALID_CALL_REFERENCE, "INVALID_CALL_REFERENCE", "Invalid call reference value" },
160 { AST_CAUSE_INCOMPATIBLE_DESTINATION, "INCOMPATIBLE_DESTINATION", "Incompatible destination" },
161 { AST_CAUSE_INVALID_MSG_UNSPECIFIED, "INVALID_MSG_UNSPECIFIED", "Invalid message unspecified" },
162 { AST_CAUSE_MANDATORY_IE_MISSING, "MANDATORY_IE_MISSING", "Mandatory information element is missing" },
163 { AST_CAUSE_MESSAGE_TYPE_NONEXIST, "MESSAGE_TYPE_NONEXIST", "Message type nonexist." },
164 { AST_CAUSE_WRONG_MESSAGE, "WRONG_MESSAGE", "Wrong message" },
165 { AST_CAUSE_IE_NONEXIST, "IE_NONEXIST", "Info. element nonexist or not implemented" },
166 { AST_CAUSE_INVALID_IE_CONTENTS, "INVALID_IE_CONTENTS", "Invalid information element contents" },
167 { AST_CAUSE_WRONG_CALL_STATE, "WRONG_CALL_STATE", "Message not compatible with call state" },
168 { AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE, "RECOVERY_ON_TIMER_EXPIRE", "Recover on timer expiry" },
169 { AST_CAUSE_MANDATORY_IE_LENGTH_ERROR, "MANDATORY_IE_LENGTH_ERROR", "Mandatory IE length error" },
170 { AST_CAUSE_PROTOCOL_ERROR, "PROTOCOL_ERROR", "Protocol error, unspecified" },
171 { AST_CAUSE_INTERWORKING, "INTERWORKING", "Interworking, unspecified" },
174 struct ast_variable *ast_channeltype_list(void)
177 struct ast_variable *var=NULL, *prev = NULL;
178 AST_LIST_TRAVERSE(&backends, cl, list) {
180 if ((prev->next = ast_variable_new(cl->tech->type, cl->tech->description)))
183 var = ast_variable_new(cl->tech->type, cl->tech->description);
190 static int show_channeltypes(int fd, int argc, char *argv[])
192 #define FORMAT "%-10.10s %-40.40s %-12.12s %-12.12s %-12.12s\n"
196 ast_cli(fd, FORMAT, "Type", "Description", "Devicestate", "Indications", "Transfer");
197 ast_cli(fd, FORMAT, "----------", "-----------", "-----------", "-----------", "--------");
198 if (AST_LIST_LOCK(&channels)) {
199 ast_log(LOG_WARNING, "Unable to lock channel list\n");
202 AST_LIST_TRAVERSE(&backends, cl, list) {
203 ast_cli(fd, FORMAT, cl->tech->type, cl->tech->description,
204 (cl->tech->devicestate) ? "yes" : "no",
205 (cl->tech->indicate) ? "yes" : "no",
206 (cl->tech->transfer) ? "yes" : "no");
209 AST_LIST_UNLOCK(&channels);
210 ast_cli(fd, "----------\n%d channel drivers registered.\n", count_chan);
211 return RESULT_SUCCESS;
217 static int show_channeltype(int fd, int argc, char *argv[])
219 struct chanlist *cl = NULL;
222 return RESULT_SHOWUSAGE;
224 if (AST_LIST_LOCK(&channels)) {
225 ast_log(LOG_WARNING, "Unable to lock channel list\n");
226 return RESULT_FAILURE;
229 AST_LIST_TRAVERSE(&backends, cl, list) {
230 if (!strncasecmp(cl->tech->type, argv[2], strlen(cl->tech->type))) {
237 ast_cli(fd, "\n%s is not a registered channel driver.\n", argv[2]);
238 AST_LIST_UNLOCK(&channels);
239 return RESULT_FAILURE;
243 "-- Info about channel driver: %s --\n"
244 " Device State: %s\n"
247 " Capabilities: %d\n"
251 " Image Support: %s\n"
252 " Text Support: %s\n",
254 (cl->tech->devicestate) ? "yes" : "no",
255 (cl->tech->indicate) ? "yes" : "no",
256 (cl->tech->transfer) ? "yes" : "no",
257 (cl->tech->capabilities) ? cl->tech->capabilities : -1,
258 (cl->tech->send_digit_begin) ? "yes" : "no",
259 (cl->tech->send_digit_end) ? "yes" : "no",
260 (cl->tech->send_html) ? "yes" : "no",
261 (cl->tech->send_image) ? "yes" : "no",
262 (cl->tech->send_text) ? "yes" : "no"
266 AST_LIST_UNLOCK(&channels);
267 return RESULT_SUCCESS;
270 static char *complete_channeltypes(const char *line, const char *word, int pos, int state)
280 wordlen = strlen(word);
282 AST_LIST_TRAVERSE(&backends, cl, list) {
283 if (!strncasecmp(word, cl->tech->type, wordlen) && ++which > state) {
284 ret = strdup(cl->tech->type);
292 static const char show_channeltypes_usage[] =
293 "Usage: core show channeltypes\n"
294 " Lists available channel types registered in your Asterisk server.\n";
296 static const char show_channeltype_usage[] =
297 "Usage: core show channeltype <name>\n"
298 " Show details about the specified channel type, <name>.\n";
300 static struct ast_cli_entry cli_channel[] = {
301 { { "core", "show", "channeltypes", NULL },
302 show_channeltypes, "List available channel types",
303 show_channeltypes_usage },
305 { { "core", "show", "channeltype", NULL },
306 show_channeltype, "Give more details on that channel type",
307 show_channeltype_usage, complete_channeltypes },
310 /*! \brief Checks to see if a channel is needing hang up */
311 int ast_check_hangup(struct ast_channel *chan)
313 if (chan->_softhangup) /* yes if soft hangup flag set */
315 if (!chan->tech_pvt) /* yes if no technology private data */
317 if (!chan->whentohangup) /* no if no hangup scheduled */
319 if (chan->whentohangup > time(NULL)) /* no if hangup time has not come yet. */
321 chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT; /* record event */
325 static int ast_check_hangup_locked(struct ast_channel *chan)
328 ast_channel_lock(chan);
329 res = ast_check_hangup(chan);
330 ast_channel_unlock(chan);
334 /*! \brief Initiate system shutdown */
335 void ast_begin_shutdown(int hangup)
337 struct ast_channel *c;
340 AST_LIST_LOCK(&channels);
341 AST_LIST_TRAVERSE(&channels, c, chan_list)
342 ast_softhangup(c, AST_SOFTHANGUP_SHUTDOWN);
343 AST_LIST_UNLOCK(&channels);
347 /*! \brief returns number of active/allocated channels */
348 int ast_active_channels(void)
350 struct ast_channel *c;
352 AST_LIST_LOCK(&channels);
353 AST_LIST_TRAVERSE(&channels, c, chan_list)
355 AST_LIST_UNLOCK(&channels);
359 /*! \brief Cancel a shutdown in progress */
360 void ast_cancel_shutdown(void)
365 /*! \brief Returns non-zero if Asterisk is being shut down */
366 int ast_shutting_down(void)
368 return shutting_down;
371 /*! \brief Set when to hangup channel */
372 void ast_channel_setwhentohangup(struct ast_channel *chan, time_t offset)
374 chan->whentohangup = offset ? time(NULL) + offset : 0;
375 ast_queue_frame(chan, &ast_null_frame);
379 /*! \brief Compare a offset with when to hangup channel */
380 int ast_channel_cmpwhentohangup(struct ast_channel *chan, time_t offset)
384 if (chan->whentohangup == 0) {
385 return (offset == 0) ? 0 : -1;
387 if (offset == 0) /* XXX why is this special ? */
390 whentohangup = offset + time (NULL);
391 if (chan->whentohangup < whentohangup)
393 else if (chan->whentohangup == whentohangup)
401 /*! \brief Register a new telephony channel in Asterisk */
402 int ast_channel_register(const struct ast_channel_tech *tech)
404 struct chanlist *chan;
406 AST_LIST_LOCK(&channels);
408 AST_LIST_TRAVERSE(&backends, chan, list) {
409 if (!strcasecmp(tech->type, chan->tech->type)) {
410 ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", tech->type);
411 AST_LIST_UNLOCK(&channels);
416 if (!(chan = ast_calloc(1, sizeof(*chan)))) {
417 AST_LIST_UNLOCK(&channels);
421 AST_LIST_INSERT_HEAD(&backends, chan, list);
424 ast_log(LOG_DEBUG, "Registered handler for '%s' (%s)\n", chan->tech->type, chan->tech->description);
426 if (option_verbose > 1)
427 ast_verbose(VERBOSE_PREFIX_2 "Registered channel type '%s' (%s)\n", chan->tech->type,
428 chan->tech->description);
430 AST_LIST_UNLOCK(&channels);
434 void ast_channel_unregister(const struct ast_channel_tech *tech)
436 struct chanlist *chan;
439 ast_log(LOG_DEBUG, "Unregistering channel type '%s'\n", tech->type);
441 AST_LIST_LOCK(&channels);
443 AST_LIST_TRAVERSE_SAFE_BEGIN(&backends, chan, list) {
444 if (chan->tech == tech) {
445 AST_LIST_REMOVE_CURRENT(&backends, list);
447 if (option_verbose > 1)
448 ast_verbose(VERBOSE_PREFIX_2 "Unregistered channel type '%s'\n", tech->type);
452 AST_LIST_TRAVERSE_SAFE_END
454 AST_LIST_UNLOCK(&channels);
457 const struct ast_channel_tech *ast_get_channel_tech(const char *name)
459 struct chanlist *chanls;
460 const struct ast_channel_tech *ret = NULL;
462 if (AST_LIST_LOCK(&channels)) {
463 ast_log(LOG_WARNING, "Unable to lock channel tech list\n");
467 AST_LIST_TRAVERSE(&backends, chanls, list) {
468 if (!strcasecmp(name, chanls->tech->type)) {
474 AST_LIST_UNLOCK(&channels);
479 /*! \brief Gives the string form of a given hangup cause */
480 const char *ast_cause2str(int cause)
484 for (x=0; x < sizeof(causes) / sizeof(causes[0]); x++) {
485 if (causes[x].cause == cause)
486 return causes[x].desc;
492 /*! \brief Convert a symbolic hangup cause to number */
493 int ast_str2cause(const char *name)
497 for (x = 0; x < sizeof(causes) / sizeof(causes[0]); x++)
498 if (strncasecmp(causes[x].name, name, strlen(causes[x].name)) == 0)
499 return causes[x].cause;
504 /*! \brief Gives the string form of a given channel state.
505 \note This function is not reentrant.
507 const char *ast_state2str(enum ast_channel_state state)
514 case AST_STATE_RESERVED:
516 case AST_STATE_OFFHOOK:
518 case AST_STATE_DIALING:
522 case AST_STATE_RINGING:
528 case AST_STATE_DIALING_OFFHOOK:
529 return "Dialing Offhook";
530 case AST_STATE_PRERING:
533 if (!(buf = ast_threadstorage_get(&state2str_threadbuf, STATE2STR_BUFSIZE)))
535 snprintf(buf, STATE2STR_BUFSIZE, "Unknown (%d)", state);
540 /*! \brief Gives the string form of a given transfer capability */
541 char *ast_transfercapability2str(int transfercapability)
543 switch(transfercapability) {
544 case AST_TRANS_CAP_SPEECH:
546 case AST_TRANS_CAP_DIGITAL:
548 case AST_TRANS_CAP_RESTRICTED_DIGITAL:
549 return "RESTRICTED_DIGITAL";
550 case AST_TRANS_CAP_3_1K_AUDIO:
552 case AST_TRANS_CAP_DIGITAL_W_TONES:
553 return "DIGITAL_W_TONES";
554 case AST_TRANS_CAP_VIDEO:
561 /*! \brief Pick the best audio codec */
562 int ast_best_codec(int fmts)
564 /* This just our opinion, expressed in code. We are asked to choose
565 the best codec to use, given no information */
569 /*! Okay, ulaw is used by all telephony equipment, so start with it */
571 /*! Unless of course, you're a silly European, so then prefer ALAW */
573 /*! Okay, well, signed linear is easy to translate into other stuff */
575 /*! G.726 is standard ADPCM, in RFC3551 packing order */
577 /*! G.726 is standard ADPCM, in AAL2 packing order */
578 AST_FORMAT_G726_AAL2,
579 /*! ADPCM has great sound quality and is still pretty easy to translate */
581 /*! Okay, we're down to vocoders now, so pick GSM because it's small and easier to
582 translate and sounds pretty good */
584 /*! iLBC is not too bad */
586 /*! Speex is free, but computationally more expensive than GSM */
588 /*! Ick, LPC10 sounds terrible, but at least we have code for it, if you're tacky enough
591 /*! G.729a is faster than 723 and slightly less expensive */
593 /*! Down to G.723.1 which is proprietary but at least designed for voice */
597 /* Strip out video */
598 fmts &= AST_FORMAT_AUDIO_MASK;
600 /* Find the first preferred codec in the format given */
601 for (x=0; x < (sizeof(prefs) / sizeof(prefs[0]) ); x++)
604 ast_log(LOG_WARNING, "Don't know any of 0x%x formats\n", fmts);
608 static const struct ast_channel_tech null_tech = {
610 .description = "Null channel (should not see this)",
613 /*! \brief Create a new channel structure */
614 struct ast_channel *ast_channel_alloc(int needqueue, int state, const char *cid_num, const char *cid_name, const char *name_fmt, ...)
616 struct ast_channel *tmp;
619 struct varshead *headp;
622 /* If shutting down, don't allocate any new channels */
624 ast_log(LOG_WARNING, "Channel allocation failed: Refusing due to active shutdown\n");
628 if (!(tmp = ast_calloc(1, sizeof(*tmp))))
631 if (!(tmp->sched = sched_context_create())) {
632 ast_log(LOG_WARNING, "Channel allocation failed: Unable to create schedule context\n");
637 ast_string_field_init(tmp, 128);
639 /* Don't bother initializing the last two FD here, because they
640 will *always* be set just a few lines down (AST_TIMING_FD,
642 for (x = 0; x < AST_MAX_FDS - 2; x++)
646 tmp->timingfd = open("/dev/zap/timer", O_RDWR);
647 if (tmp->timingfd > -1) {
648 /* Check if timing interface supports new
651 if (!ioctl(tmp->timingfd, ZT_TIMERPONG, &flags))
659 if (pipe(tmp->alertpipe)) {
660 ast_log(LOG_WARNING, "Channel allocation failed: Can't create alert pipe!\n");
661 ast_string_field_free_pools(tmp);
665 flags = fcntl(tmp->alertpipe[0], F_GETFL);
666 fcntl(tmp->alertpipe[0], F_SETFL, flags | O_NONBLOCK);
667 flags = fcntl(tmp->alertpipe[1], F_GETFL);
668 fcntl(tmp->alertpipe[1], F_SETFL, flags | O_NONBLOCK);
670 } else /* Make sure we've got it done right if they don't */
671 tmp->alertpipe[0] = tmp->alertpipe[1] = -1;
673 /* Always watch the alertpipe */
674 tmp->fds[AST_ALERT_FD] = tmp->alertpipe[0];
675 /* And timing pipe */
676 tmp->fds[AST_TIMING_FD] = tmp->timingfd;
677 ast_string_field_set(tmp, name, "**Unknown**");
684 tmp->fin = global_fin;
685 tmp->fout = global_fout;
687 if (ast_strlen_zero(ast_config_AST_SYSTEM_NAME)) {
688 ast_string_field_build(tmp, uniqueid, "%li.%d", (long) time(NULL),
689 ast_atomic_fetchadd_int(&uniqueint, 1));
691 ast_string_field_build(tmp, uniqueid, "%s-%li.%d", ast_config_AST_SYSTEM_NAME,
692 (long) time(NULL), ast_atomic_fetchadd_int(&uniqueint, 1));
695 if (!ast_strlen_zero(name_fmt)) {
696 /* Almost every channel is calling this function, and setting the name via the ast_string_field_build() call.
697 * And they all use slightly different formats for their name string.
698 * This means, to set the name here, we have to accept variable args, and call the string_field_build from here.
699 * This means, that the stringfields must have a routine that takes the va_lists directly, and
700 * uses them to build the string, instead of forming the va_lists internally from the vararg ... list.
701 * This new function was written so this can be accomplished.
703 va_start(ap1, name_fmt);
704 va_start(ap2, name_fmt);
705 ast_string_field_build_va(tmp, name, name_fmt, ap1, ap2);
709 /* and now, since the channel structure is built, and has its name, let's call the
710 * manager event generator with this Newchannel event. This is the proper and correct
711 * place to make this call, but you sure do have to pass a lot of data into this func
714 manager_event(EVENT_FLAG_CALL, "Newchannel",
717 "CallerIDNum: %s\r\n"
718 "CallerIDName: %s\r\n"
720 tmp->name, ast_state2str(state),
721 S_OR(cid_num, "<unknown>"),
722 S_OR(cid_name, "<unknown>"),
726 headp = &tmp->varshead;
727 AST_LIST_HEAD_INIT_NOLOCK(headp);
729 ast_mutex_init(&tmp->lock);
731 AST_LIST_HEAD_INIT_NOLOCK(&tmp->datastores);
733 strcpy(tmp->context, "default");
734 strcpy(tmp->exten, "s");
737 ast_string_field_set(tmp, language, defaultlanguage);
738 tmp->amaflags = ast_default_amaflags;
739 ast_string_field_set(tmp, accountcode, ast_default_accountcode);
741 tmp->tech = &null_tech;
743 AST_LIST_LOCK(&channels);
744 AST_LIST_INSERT_HEAD(&channels, tmp, chan_list);
745 AST_LIST_UNLOCK(&channels);
750 /*! \brief Queue an outgoing media frame */
751 int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
754 struct ast_frame *cur;
758 /* Build us a copy and free the original one */
759 if (!(f = ast_frdup(fin))) {
760 ast_log(LOG_WARNING, "Unable to duplicate frame\n");
763 ast_channel_lock(chan);
765 /* See if the last frame on the queue is a hangup, if so don't queue anything */
766 if ((cur = AST_LIST_LAST(&chan->readq)) && (cur->frametype == AST_FRAME_CONTROL) && (cur->subclass == AST_CONTROL_HANGUP)) {
768 ast_channel_unlock(chan);
772 /* Count how many frames exist on the queue */
773 AST_LIST_TRAVERSE(&chan->readq, cur, frame_list) {
777 /* Allow up to 96 voice frames outstanding, and up to 128 total frames */
778 if (((fin->frametype == AST_FRAME_VOICE) && (qlen > 96)) || (qlen > 128)) {
779 if (fin->frametype != AST_FRAME_VOICE) {
780 ast_log(LOG_WARNING, "Exceptionally long queue length queuing to %s\n", chan->name);
784 ast_log(LOG_DEBUG, "Dropping voice to exceptionally long queue on %s\n", chan->name);
786 ast_channel_unlock(chan);
790 AST_LIST_INSERT_TAIL(&chan->readq, f, frame_list);
791 if (chan->alertpipe[1] > -1) {
792 if (write(chan->alertpipe[1], &blah, sizeof(blah)) != sizeof(blah))
793 ast_log(LOG_WARNING, "Unable to write to alert pipe on %s, frametype/subclass %d/%d (qlen = %d): %s!\n",
794 chan->name, f->frametype, f->subclass, qlen, strerror(errno));
796 } else if (chan->timingfd > -1) {
797 ioctl(chan->timingfd, ZT_TIMERPING, &blah);
799 } else if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
800 pthread_kill(chan->blocker, SIGURG);
802 ast_channel_unlock(chan);
806 /*! \brief Queue a hangup frame for channel */
807 int ast_queue_hangup(struct ast_channel *chan)
809 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
810 /* Yeah, let's not change a lock-critical value without locking */
811 if (!ast_channel_trylock(chan)) {
812 chan->_softhangup |= AST_SOFTHANGUP_DEV;
813 ast_channel_unlock(chan);
815 return ast_queue_frame(chan, &f);
818 /*! \brief Queue a control frame */
819 int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
821 struct ast_frame f = { AST_FRAME_CONTROL, };
823 f.subclass = control;
825 return ast_queue_frame(chan, &f);
828 /*! \brief Queue a control frame with payload */
829 int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control,
830 const void *data, size_t datalen)
832 struct ast_frame f = { AST_FRAME_CONTROL, };
834 f.subclass = control;
835 f.data = (void *) data;
838 return ast_queue_frame(chan, &f);
841 /*! \brief Set defer DTMF flag on channel */
842 int ast_channel_defer_dtmf(struct ast_channel *chan)
847 pre = ast_test_flag(chan, AST_FLAG_DEFER_DTMF);
848 ast_set_flag(chan, AST_FLAG_DEFER_DTMF);
853 /*! \brief Unset defer DTMF flag on channel */
854 void ast_channel_undefer_dtmf(struct ast_channel *chan)
857 ast_clear_flag(chan, AST_FLAG_DEFER_DTMF);
861 * \brief Helper function to find channels.
863 * It supports these modes:
865 * prev != NULL : get channel next in list after prev
866 * name != NULL : get channel with matching name
867 * name != NULL && namelen != 0 : get channel whose name starts with prefix
868 * exten != NULL : get channel whose exten or macroexten matches
869 * context != NULL && exten != NULL : get channel whose context or macrocontext
871 * It returns with the channel's lock held. If getting the individual lock fails,
872 * unlock and retry quickly up to 10 times, then give up.
874 * \note XXX Note that this code has cost O(N) because of the need to verify
875 * that the object is still on the global list.
877 * \note XXX also note that accessing fields (e.g. c->name in ast_log())
878 * can only be done with the lock held or someone could delete the
879 * object while we work on it. This causes some ugliness in the code.
880 * Note that removing the first ast_log() may be harmful, as it would
881 * shorten the retry period and possibly cause failures.
882 * We should definitely go for a better scheme that is deadlock-free.
884 static struct ast_channel *channel_find_locked(const struct ast_channel *prev,
885 const char *name, const int namelen,
886 const char *context, const char *exten)
888 const char *msg = prev ? "deadlock" : "initial deadlock";
890 struct ast_channel *c;
892 for (retries = 0; retries < 10; retries++) {
894 AST_LIST_LOCK(&channels);
895 AST_LIST_TRAVERSE(&channels, c, chan_list) {
896 if (prev) { /* look for next item */
897 if (c != prev) /* not this one */
899 /* found, prepare to return c->next */
900 c = AST_LIST_NEXT(c, chan_list);
902 if (name) { /* want match by name */
903 if ((!namelen && strcasecmp(c->name, name)) ||
904 (namelen && strncasecmp(c->name, name, namelen)))
905 continue; /* name match failed */
907 if (context && strcasecmp(c->context, context) &&
908 strcasecmp(c->macrocontext, context))
909 continue; /* context match failed */
910 if (strcasecmp(c->exten, exten) &&
911 strcasecmp(c->macroexten, exten))
912 continue; /* exten match failed */
914 /* if we get here, c points to the desired record */
917 /* exit if chan not found or mutex acquired successfully */
918 /* this is slightly unsafe, as we _should_ hold the lock to access c->name */
919 done = c == NULL || ast_channel_trylock(c) == 0;
922 ast_log(LOG_DEBUG, "Avoiding %s for channel '%p'\n", msg, c);
924 AST_LIST_UNLOCK(&channels);
927 usleep(1); /* give other threads a chance before retrying */
930 * c is surely not null, but we don't have the lock so cannot
934 ast_log(LOG_DEBUG, "Failure, could not lock '%p' after %d retries!\n",
940 /*! \brief Browse channels in use */
941 struct ast_channel *ast_channel_walk_locked(const struct ast_channel *prev)
943 return channel_find_locked(prev, NULL, 0, NULL, NULL);
946 /*! \brief Get channel by name and lock it */
947 struct ast_channel *ast_get_channel_by_name_locked(const char *name)
949 return channel_find_locked(NULL, name, 0, NULL, NULL);
952 /*! \brief Get channel by name prefix and lock it */
953 struct ast_channel *ast_get_channel_by_name_prefix_locked(const char *name, const int namelen)
955 return channel_find_locked(NULL, name, namelen, NULL, NULL);
958 /*! \brief Get next channel by name prefix and lock it */
959 struct ast_channel *ast_walk_channel_by_name_prefix_locked(const struct ast_channel *chan, const char *name,
962 return channel_find_locked(chan, name, namelen, NULL, NULL);
965 /*! \brief Get channel by exten (and optionally context) and lock it */
966 struct ast_channel *ast_get_channel_by_exten_locked(const char *exten, const char *context)
968 return channel_find_locked(NULL, NULL, 0, context, exten);
971 /*! \brief Get next channel by exten (and optionally context) and lock it */
972 struct ast_channel *ast_walk_channel_by_exten_locked(const struct ast_channel *chan, const char *exten,
975 return channel_find_locked(chan, NULL, 0, context, exten);
978 /*! \brief Wait, look for hangups and condition arg */
979 int ast_safe_sleep_conditional(struct ast_channel *chan, int ms, int (*cond)(void*), void *data)
984 if (cond && ((*cond)(data) == 0))
986 ms = ast_waitfor(chan, ms);
999 /*! \brief Wait, look for hangups */
1000 int ast_safe_sleep(struct ast_channel *chan, int ms)
1002 return ast_safe_sleep_conditional(chan, ms, NULL, NULL);
1005 static void free_cid(struct ast_callerid *cid)
1008 free(cid->cid_dnid);
1012 free(cid->cid_name);
1016 free(cid->cid_rdnis);
1017 cid->cid_dnid = cid->cid_num = cid->cid_name = cid->cid_ani = cid->cid_rdnis = NULL;
1020 /*! \brief Free a channel structure */
1021 void ast_channel_free(struct ast_channel *chan)
1024 struct ast_var_t *vardata;
1025 struct ast_frame *f;
1026 struct varshead *headp;
1027 struct ast_datastore *datastore = NULL;
1028 char name[AST_CHANNEL_NAME];
1030 headp=&chan->varshead;
1032 AST_LIST_LOCK(&channels);
1033 AST_LIST_REMOVE(&channels, chan, chan_list);
1034 /* Lock and unlock the channel just to be sure nobody
1035 has it locked still */
1036 ast_channel_lock(chan);
1037 ast_channel_unlock(chan);
1038 if (chan->tech_pvt) {
1039 ast_log(LOG_WARNING, "Channel '%s' may not have been hung up properly\n", chan->name);
1040 free(chan->tech_pvt);
1044 sched_context_destroy(chan->sched);
1046 ast_copy_string(name, chan->name, sizeof(name));
1048 /* Stop monitoring */
1050 chan->monitor->stop( chan, 0 );
1052 /* If there is native format music-on-hold state, free it */
1053 if (chan->music_state)
1054 ast_moh_cleanup(chan);
1056 /* if someone is whispering on the channel, stop them */
1058 ast_channel_whisper_stop(chan);
1060 /* Free translators */
1061 if (chan->readtrans)
1062 ast_translator_free_path(chan->readtrans);
1063 if (chan->writetrans)
1064 ast_translator_free_path(chan->writetrans);
1066 ast_log(LOG_WARNING, "PBX may not have been terminated properly on '%s'\n", chan->name);
1067 free_cid(&chan->cid);
1068 ast_mutex_destroy(&chan->lock);
1069 /* Close pipes if appropriate */
1070 if ((fd = chan->alertpipe[0]) > -1)
1072 if ((fd = chan->alertpipe[1]) > -1)
1074 if ((fd = chan->timingfd) > -1)
1076 while ((f = AST_LIST_REMOVE_HEAD(&chan->readq, frame_list)))
1079 /* Get rid of each of the data stores on the channel */
1080 while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry)))
1081 /* Free the data store */
1082 ast_channel_datastore_free(datastore);
1083 AST_LIST_HEAD_INIT_NOLOCK(&chan->datastores);
1085 /* loop over the variables list, freeing all data and deleting list items */
1086 /* no need to lock the list, as the channel is already locked */
1088 while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
1089 ast_var_delete(vardata);
1091 /* Destroy the jitterbuffer */
1092 ast_jb_destroy(chan);
1094 ast_string_field_free_pools(chan);
1096 AST_LIST_UNLOCK(&channels);
1098 ast_device_state_changed_literal(name);
1101 struct ast_datastore *ast_channel_datastore_alloc(const struct ast_datastore_info *info, char *uid)
1103 struct ast_datastore *datastore = NULL;
1105 /* Make sure we at least have type so we can identify this */
1110 /* Allocate memory for datastore and clear it */
1111 datastore = ast_calloc(1, sizeof(*datastore));
1112 if (datastore == NULL) {
1116 datastore->info = info;
1118 datastore->uid = ast_strdup(uid);
1123 int ast_channel_datastore_free(struct ast_datastore *datastore)
1127 /* Using the destroy function (if present) destroy the data */
1128 if (datastore->info->destroy != NULL && datastore->data != NULL) {
1129 datastore->info->destroy(datastore->data);
1130 datastore->data = NULL;
1133 /* Free allocated UID memory */
1134 if (datastore->uid != NULL) {
1135 free(datastore->uid);
1136 datastore->uid = NULL;
1139 /* Finally free memory used by ourselves */
1145 int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
1149 AST_LIST_INSERT_HEAD(&chan->datastores, datastore, entry);
1154 int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
1156 struct ast_datastore *datastore2 = NULL;
1159 /* Find our position and remove ourselves */
1160 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore2, entry) {
1161 if (datastore2 == datastore) {
1162 AST_LIST_REMOVE_CURRENT(&chan->datastores, entry);
1167 AST_LIST_TRAVERSE_SAFE_END
1172 struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, char *uid)
1174 struct ast_datastore *datastore = NULL;
1179 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, entry) {
1180 if (datastore->info == info) {
1181 if (uid != NULL && datastore->uid != NULL) {
1182 if (!strcasecmp(uid, datastore->uid)) {
1183 /* Matched by type AND uid */
1187 /* Matched by type at least */
1192 AST_LIST_TRAVERSE_SAFE_END
1197 int ast_channel_spy_add(struct ast_channel *chan, struct ast_channel_spy *spy)
1199 /* Link the owner channel to the spy */
1202 if (!ast_test_flag(spy, CHANSPY_FORMAT_AUDIO)) {
1203 ast_log(LOG_WARNING, "Could not add channel spy '%s' to channel '%s', only audio format spies are supported.\n",
1204 spy->type, chan->name);
1208 if (ast_test_flag(spy, CHANSPY_READ_VOLADJUST) && (spy->read_queue.format != AST_FORMAT_SLINEAR)) {
1209 ast_log(LOG_WARNING, "Cannot provide volume adjustment on '%s' format spies\n",
1210 ast_getformatname(spy->read_queue.format));
1214 if (ast_test_flag(spy, CHANSPY_WRITE_VOLADJUST) && (spy->write_queue.format != AST_FORMAT_SLINEAR)) {
1215 ast_log(LOG_WARNING, "Cannot provide volume adjustment on '%s' format spies\n",
1216 ast_getformatname(spy->write_queue.format));
1220 if (ast_test_flag(spy, CHANSPY_MIXAUDIO) &&
1221 ((spy->read_queue.format != AST_FORMAT_SLINEAR) ||
1222 (spy->write_queue.format != AST_FORMAT_SLINEAR))) {
1223 ast_log(LOG_WARNING, "Cannot provide audio mixing on '%s'-'%s' format spies\n",
1224 ast_getformatname(spy->read_queue.format), ast_getformatname(spy->write_queue.format));
1229 if (!(chan->spies = ast_calloc(1, sizeof(*chan->spies)))) {
1233 AST_LIST_HEAD_INIT_NOLOCK(&chan->spies->list);
1234 AST_LIST_INSERT_HEAD(&chan->spies->list, spy, list);
1236 AST_LIST_INSERT_TAIL(&chan->spies->list, spy, list);
1239 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE) {
1240 ast_cond_init(&spy->trigger, NULL);
1241 ast_set_flag(spy, CHANSPY_TRIGGER_READ);
1242 ast_clear_flag(spy, CHANSPY_TRIGGER_WRITE);
1246 ast_log(LOG_DEBUG, "Spy %s added to channel %s\n",
1247 spy->type, chan->name);
1252 /* Clean up a channel's spy information */
1253 static void spy_cleanup(struct ast_channel *chan)
1255 if (!AST_LIST_EMPTY(&chan->spies->list))
1257 if (chan->spies->read_translator.path)
1258 ast_translator_free_path(chan->spies->read_translator.path);
1259 if (chan->spies->write_translator.path)
1260 ast_translator_free_path(chan->spies->write_translator.path);
1266 /* Detach a spy from it's channel */
1267 static void spy_detach(struct ast_channel_spy *spy, struct ast_channel *chan)
1269 ast_mutex_lock(&spy->lock);
1271 /* We only need to poke them if they aren't already done */
1272 if (spy->status != CHANSPY_DONE) {
1273 /* Indicate to the spy to stop */
1274 spy->status = CHANSPY_STOP;
1276 /* Poke the spy if needed */
1277 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE)
1278 ast_cond_signal(&spy->trigger);
1281 /* Print it out while we still have a lock so the structure can't go away (if signalled above) */
1283 ast_log(LOG_DEBUG, "Spy %s removed from channel %s\n", spy->type, chan->name);
1285 ast_mutex_unlock(&spy->lock);
1290 void ast_channel_spy_stop_by_type(struct ast_channel *chan, const char *type)
1292 struct ast_channel_spy *spy = NULL;
1297 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->spies->list, spy, list) {
1298 ast_mutex_lock(&spy->lock);
1299 if ((spy->type == type) && (spy->status == CHANSPY_RUNNING)) {
1300 ast_mutex_unlock(&spy->lock);
1301 AST_LIST_REMOVE_CURRENT(&chan->spies->list, list);
1302 spy_detach(spy, chan);
1304 ast_mutex_unlock(&spy->lock);
1306 AST_LIST_TRAVERSE_SAFE_END
1310 void ast_channel_spy_trigger_wait(struct ast_channel_spy *spy)
1315 tv = ast_tvadd(ast_tvnow(), ast_samp2tv(50000, 1000));
1316 ts.tv_sec = tv.tv_sec;
1317 ts.tv_nsec = tv.tv_usec * 1000;
1319 ast_cond_timedwait(&spy->trigger, &spy->lock, &ts);
1322 void ast_channel_spy_remove(struct ast_channel *chan, struct ast_channel_spy *spy)
1327 AST_LIST_REMOVE(&chan->spies->list, spy, list);
1328 spy_detach(spy, chan);
1332 void ast_channel_spy_free(struct ast_channel_spy *spy)
1334 struct ast_frame *f = NULL;
1336 if (spy->status == CHANSPY_DONE)
1339 /* Switch status to done in case we get called twice */
1340 spy->status = CHANSPY_DONE;
1342 /* Drop any frames in the queue */
1343 while ((f = AST_LIST_REMOVE_HEAD(&spy->write_queue.list, frame_list)))
1345 while ((f = AST_LIST_REMOVE_HEAD(&spy->read_queue.list, frame_list)))
1348 /* Destroy the condition if in use */
1349 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE)
1350 ast_cond_destroy(&spy->trigger);
1352 /* Destroy our mutex since it is no longer in use */
1353 ast_mutex_destroy(&spy->lock);
1358 static void detach_spies(struct ast_channel *chan)
1360 struct ast_channel_spy *spy = NULL;
1365 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->spies->list, spy, list) {
1366 AST_LIST_REMOVE_CURRENT(&chan->spies->list, list);
1367 spy_detach(spy, chan);
1369 AST_LIST_TRAVERSE_SAFE_END
1374 /*! \brief Softly hangup a channel, don't lock */
1375 int ast_softhangup_nolock(struct ast_channel *chan, int cause)
1378 ast_log(LOG_DEBUG, "Soft-Hanging up channel '%s'\n", chan->name);
1379 /* Inform channel driver that we need to be hung up, if it cares */
1380 chan->_softhangup |= cause;
1381 ast_queue_frame(chan, &ast_null_frame);
1382 /* Interrupt any poll call or such */
1383 if (ast_test_flag(chan, AST_FLAG_BLOCKING))
1384 pthread_kill(chan->blocker, SIGURG);
1388 /*! \brief Softly hangup a channel, lock */
1389 int ast_softhangup(struct ast_channel *chan, int cause)
1392 ast_channel_lock(chan);
1393 res = ast_softhangup_nolock(chan, cause);
1394 ast_channel_unlock(chan);
1398 enum spy_direction {
1403 #define SPY_QUEUE_SAMPLE_LIMIT 4000 /* half of one second */
1405 static void queue_frame_to_spies(struct ast_channel *chan, struct ast_frame *f, enum spy_direction dir)
1407 struct ast_frame *translated_frame = NULL;
1408 struct ast_channel_spy *spy;
1409 struct channel_spy_trans *trans;
1411 trans = (dir == SPY_READ) ? &chan->spies->read_translator : &chan->spies->write_translator;
1413 AST_LIST_TRAVERSE(&chan->spies->list, spy, list) {
1414 struct ast_channel_spy_queue *queue;
1415 struct ast_frame *duped_fr;
1417 ast_mutex_lock(&spy->lock);
1419 queue = (dir == SPY_READ) ? &spy->read_queue : &spy->write_queue;
1421 if ((queue->format == AST_FORMAT_SLINEAR) && (f->subclass != AST_FORMAT_SLINEAR)) {
1422 if (!translated_frame) {
1423 if (trans->path && (trans->last_format != f->subclass)) {
1424 ast_translator_free_path(trans->path);
1429 ast_log(LOG_DEBUG, "Building translator from %s to SLINEAR for spies on channel %s\n",
1430 ast_getformatname(f->subclass), chan->name);
1431 if ((trans->path = ast_translator_build_path(AST_FORMAT_SLINEAR, f->subclass)) == NULL) {
1432 ast_log(LOG_WARNING, "Cannot build a path from %s to %s\n",
1433 ast_getformatname(f->subclass), ast_getformatname(AST_FORMAT_SLINEAR));
1434 ast_mutex_unlock(&spy->lock);
1437 trans->last_format = f->subclass;
1440 if (!(translated_frame = ast_translate(trans->path, f, 0))) {
1441 ast_log(LOG_ERROR, "Translation to %s failed, dropping frame for spies\n",
1442 ast_getformatname(AST_FORMAT_SLINEAR));
1443 ast_mutex_unlock(&spy->lock);
1447 duped_fr = ast_frdup(translated_frame);
1448 } else if (f->subclass != queue->format) {
1449 ast_log(LOG_WARNING, "Spy '%s' on channel '%s' wants format '%s', but frame is '%s', dropping\n",
1450 spy->type, chan->name,
1451 ast_getformatname(queue->format), ast_getformatname(f->subclass));
1452 ast_mutex_unlock(&spy->lock);
1455 duped_fr = ast_frdup(f);
1457 AST_LIST_INSERT_TAIL(&queue->list, duped_fr, frame_list);
1459 queue->samples += f->samples;
1461 if (queue->samples > SPY_QUEUE_SAMPLE_LIMIT) {
1462 if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE) {
1463 switch (ast_test_flag(spy, CHANSPY_TRIGGER_MODE)) {
1464 case CHANSPY_TRIGGER_READ:
1465 if (dir == SPY_WRITE) {
1466 ast_set_flag(spy, CHANSPY_TRIGGER_WRITE);
1467 ast_clear_flag(spy, CHANSPY_TRIGGER_READ);
1469 ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to write-trigger mode\n",
1470 spy->type, chan->name);
1473 case CHANSPY_TRIGGER_WRITE:
1474 if (dir == SPY_READ) {
1475 ast_set_flag(spy, CHANSPY_TRIGGER_READ);
1476 ast_clear_flag(spy, CHANSPY_TRIGGER_WRITE);
1478 ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to read-trigger mode\n",
1479 spy->type, chan->name);
1484 ast_log(LOG_DEBUG, "Triggering queue flush for spy '%s' on '%s'\n",
1485 spy->type, chan->name);
1486 ast_set_flag(spy, CHANSPY_TRIGGER_FLUSH);
1487 ast_cond_signal(&spy->trigger);
1490 ast_log(LOG_DEBUG, "Spy '%s' on channel '%s' %s queue too long, dropping frames\n",
1491 spy->type, chan->name, (dir == SPY_READ) ? "read" : "write");
1492 while (queue->samples > SPY_QUEUE_SAMPLE_LIMIT) {
1493 struct ast_frame *drop = AST_LIST_REMOVE_HEAD(&queue->list, frame_list);
1494 queue->samples -= drop->samples;
1499 switch (ast_test_flag(spy, CHANSPY_TRIGGER_MODE)) {
1500 case CHANSPY_TRIGGER_READ:
1501 if (dir == SPY_READ)
1502 ast_cond_signal(&spy->trigger);
1504 case CHANSPY_TRIGGER_WRITE:
1505 if (dir == SPY_WRITE)
1506 ast_cond_signal(&spy->trigger);
1511 ast_mutex_unlock(&spy->lock);
1514 if (translated_frame)
1515 ast_frfree(translated_frame);
1518 static void free_translation(struct ast_channel *clone)
1520 if (clone->writetrans)
1521 ast_translator_free_path(clone->writetrans);
1522 if (clone->readtrans)
1523 ast_translator_free_path(clone->readtrans);
1524 clone->writetrans = NULL;
1525 clone->readtrans = NULL;
1526 clone->rawwriteformat = clone->nativeformats;
1527 clone->rawreadformat = clone->nativeformats;
1530 /*! \brief Hangup a channel */
1531 int ast_hangup(struct ast_channel *chan)
1535 /* Don't actually hang up a channel that will masquerade as someone else, or
1536 if someone is going to masquerade as us */
1537 ast_channel_lock(chan);
1539 detach_spies(chan); /* get rid of spies */
1542 if (ast_do_masquerade(chan))
1543 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
1547 ast_log(LOG_WARNING, "%s getting hung up, but someone is trying to masq into us?!?\n", chan->name);
1548 ast_channel_unlock(chan);
1551 /* If this channel is one which will be masqueraded into something,
1552 mark it as a zombie already, so we know to free it later */
1554 ast_set_flag(chan, AST_FLAG_ZOMBIE);
1555 ast_channel_unlock(chan);
1558 free_translation(chan);
1559 /* Close audio stream */
1561 ast_closestream(chan->stream);
1562 chan->stream = NULL;
1564 /* Close video stream */
1565 if (chan->vstream) {
1566 ast_closestream(chan->vstream);
1567 chan->vstream = NULL;
1570 sched_context_destroy(chan->sched);
1574 if (chan->generatordata) /* Clear any tone stuff remaining */
1575 if (chan->generator && chan->generator->release)
1576 chan->generator->release(chan, chan->generatordata);
1577 chan->generatordata = NULL;
1578 chan->generator = NULL;
1579 if (chan->cdr) { /* End the CDR if it hasn't already */
1580 ast_cdr_end(chan->cdr);
1581 ast_cdr_detach(chan->cdr); /* Post and Free the CDR */
1584 if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
1585 ast_log(LOG_WARNING, "Hard hangup called by thread %ld on %s, while fd "
1586 "is blocked by thread %ld in procedure %s! Expect a failure\n",
1587 (long)pthread_self(), chan->name, (long)chan->blocker, chan->blockproc);
1590 if (!ast_test_flag(chan, AST_FLAG_ZOMBIE)) {
1592 ast_log(LOG_DEBUG, "Hanging up channel '%s'\n", chan->name);
1593 if (chan->tech->hangup)
1594 res = chan->tech->hangup(chan);
1597 ast_log(LOG_DEBUG, "Hanging up zombie '%s'\n", chan->name);
1600 ast_channel_unlock(chan);
1601 manager_event(EVENT_FLAG_CALL, "Hangup",
1605 "Cause-txt: %s\r\n",
1609 ast_cause2str(chan->hangupcause)
1611 ast_channel_free(chan);
1615 int ast_answer(struct ast_channel *chan)
1619 ast_channel_lock(chan);
1621 /* You can't answer an outbound call */
1622 if (ast_test_flag(chan, AST_FLAG_OUTGOING)) {
1623 ast_channel_unlock(chan);
1627 /* Stop if we're a zombie or need a soft hangup */
1628 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
1629 ast_channel_unlock(chan);
1633 switch(chan->_state) {
1634 case AST_STATE_RINGING:
1635 case AST_STATE_RING:
1636 if (chan->tech->answer)
1637 res = chan->tech->answer(chan);
1638 ast_setstate(chan, AST_STATE_UP);
1639 ast_cdr_answer(chan->cdr);
1640 ast_safe_sleep(chan, 500);
1643 ast_cdr_answer(chan->cdr);
1649 ast_channel_unlock(chan);
1654 void ast_deactivate_generator(struct ast_channel *chan)
1656 ast_channel_lock(chan);
1657 if (chan->generatordata) {
1658 if (chan->generator && chan->generator->release)
1659 chan->generator->release(chan, chan->generatordata);
1660 chan->generatordata = NULL;
1661 chan->generator = NULL;
1662 chan->fds[AST_GENERATOR_FD] = -1;
1663 ast_clear_flag(chan, AST_FLAG_WRITE_INT);
1664 ast_settimeout(chan, 0, NULL, NULL);
1666 ast_channel_unlock(chan);
1669 static int generator_force(void *data)
1671 /* Called if generator doesn't have data */
1674 int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples);
1675 struct ast_channel *chan = data;
1676 tmp = chan->generatordata;
1677 chan->generatordata = NULL;
1678 generate = chan->generator->generate;
1679 res = generate(chan, tmp, 0, 160);
1680 chan->generatordata = tmp;
1683 ast_log(LOG_DEBUG, "Auto-deactivating generator\n");
1684 ast_deactivate_generator(chan);
1689 int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
1693 ast_channel_lock(chan);
1695 if (chan->generatordata) {
1696 if (chan->generator && chan->generator->release)
1697 chan->generator->release(chan, chan->generatordata);
1698 chan->generatordata = NULL;
1702 if (gen->alloc && !(chan->generatordata = gen->alloc(chan, params))) {
1707 ast_settimeout(chan, 160, generator_force, chan);
1708 chan->generator = gen;
1711 ast_channel_unlock(chan);
1716 /*! \brief Wait for x amount of time on a file descriptor to have input. */
1717 int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception)
1720 ast_waitfor_nandfds(NULL, 0, fds, n, exception, &winner, ms);
1724 /*! \brief Wait for x amount of time on a file descriptor to have input. */
1725 struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
1726 int *exception, int *outfd, int *ms)
1728 struct timeval start = { 0 , 0 };
1729 struct pollfd *pfds;
1735 long whentohangup = 0, diff;
1736 struct ast_channel *winner = NULL;
1742 sz = n * AST_MAX_FDS + nfds;
1743 pfds = alloca(sizeof(*pfds) * sz);
1744 fdmap = alloca(sizeof(*fdmap) * sz);
1751 /* Perform any pending masquerades */
1752 for (x=0; x < n; x++) {
1753 ast_channel_lock(c[x]);
1755 if (ast_do_masquerade(c[x])) {
1756 ast_log(LOG_WARNING, "Masquerade failed\n");
1758 ast_channel_unlock(c[x]);
1762 if (c[x]->whentohangup) {
1765 diff = c[x]->whentohangup - now;
1767 /* Should already be hungup */
1768 c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1769 ast_channel_unlock(c[x]);
1772 if (!whentohangup || (diff < whentohangup))
1773 whentohangup = diff;
1775 ast_channel_unlock(c[x]);
1777 /* Wait full interval */
1780 rms = whentohangup * 1000; /* timeout in milliseconds */
1781 if (*ms >= 0 && *ms < rms) /* original *ms still smaller */
1785 * Build the pollfd array, putting the channels' fds first,
1786 * followed by individual fds. Order is important because
1787 * individual fd's must have priority over channel fds.
1790 for (x=0; x<n; x++) {
1791 for (y=0; y<AST_MAX_FDS; y++) {
1792 fdmap[max].fdno = y; /* fd y is linked to this pfds */
1793 fdmap[max].chan = x; /* channel x is linked to this pfds */
1794 max += ast_add_fd(&pfds[max], c[x]->fds[y]);
1796 CHECK_BLOCKING(c[x]);
1798 /* Add the individual fds */
1799 for (x=0; x<nfds; x++) {
1800 fdmap[max].chan = -1;
1801 max += ast_add_fd(&pfds[max], fds[x]);
1805 start = ast_tvnow();
1807 if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
1812 res = poll(pfds, max, kbrms);
1815 } while (!res && (rms > 0));
1817 res = poll(pfds, max, rms);
1820 ast_clear_flag(c[x], AST_FLAG_BLOCKING);
1821 if (res < 0) { /* Simulate a timeout if we were interrupted */
1826 if (whentohangup) { /* if we have a timeout, check who expired */
1828 for (x=0; x<n; x++) {
1829 if (c[x]->whentohangup && now >= c[x]->whentohangup) {
1830 c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
1836 if (res == 0) { /* no fd ready, reset timeout and done */
1837 *ms = 0; /* XXX use 0 since we may not have an exact timeout. */
1841 * Then check if any channel or fd has a pending event.
1842 * Remember to check channels first and fds last, as they
1843 * must have priority on setting 'winner'
1845 for (x = 0; x < max; x++) {
1846 res = pfds[x].revents;
1849 if (fdmap[x].chan >= 0) { /* this is a channel */
1850 winner = c[fdmap[x].chan]; /* override previous winners */
1852 ast_set_flag(winner, AST_FLAG_EXCEPTION);
1854 ast_clear_flag(winner, AST_FLAG_EXCEPTION);
1855 winner->fdno = fdmap[x].fdno;
1856 } else { /* this is an fd */
1858 *outfd = pfds[x].fd;
1860 *exception = (res & POLLPRI) ? -1 : 0;
1865 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
1872 struct ast_channel *ast_waitfor_n(struct ast_channel **c, int n, int *ms)
1874 return ast_waitfor_nandfds(c, n, NULL, 0, NULL, NULL, ms);
1877 int ast_waitfor(struct ast_channel *c, int ms)
1879 int oldms = ms; /* -1 if no timeout */
1881 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
1882 if ((ms < 0) && (oldms < 0))
1887 /* XXX never to be called with ms = -1 */
1888 int ast_waitfordigit(struct ast_channel *c, int ms)
1890 return ast_waitfordigit_full(c, ms, -1, -1);
1893 int ast_settimeout(struct ast_channel *c, int samples, int (*func)(void *data), void *data)
1897 if (c->timingfd > -1) {
1903 ast_log(LOG_DEBUG, "Scheduling timer at %d sample intervals\n", samples);
1904 res = ioctl(c->timingfd, ZT_TIMERCONFIG, &samples);
1905 c->timingfunc = func;
1906 c->timingdata = data;
1912 int ast_waitfordigit_full(struct ast_channel *c, int ms, int audiofd, int cmdfd)
1915 /* Stop if we're a zombie or need a soft hangup */
1916 if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
1918 /* Wait for a digit, no more than ms milliseconds total. */
1920 struct ast_channel *rchan;
1924 rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
1925 if (!rchan && outfd < 0 && ms) {
1926 if (errno == 0 || errno == EINTR)
1928 ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
1930 } else if (outfd > -1) {
1931 /* The FD we were watching has something waiting */
1935 struct ast_frame *f = ast_read(c);
1939 switch(f->frametype) {
1940 case AST_FRAME_DTMF:
1944 case AST_FRAME_CONTROL:
1945 switch(f->subclass) {
1946 case AST_CONTROL_HANGUP:
1949 case AST_CONTROL_RINGING:
1950 case AST_CONTROL_ANSWER:
1954 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", f->subclass);
1958 case AST_FRAME_VOICE:
1959 /* Write audio if appropriate */
1961 write(audiofd, f->data, f->datalen);
1969 return 0; /* Time is up */
1972 static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
1974 struct ast_frame *f = NULL; /* the return value */
1978 /* this function is very long so make sure there is only one return
1979 * point at the end (there is only one exception to this).
1981 ast_channel_lock(chan);
1983 if (ast_do_masquerade(chan))
1984 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
1986 f = &ast_null_frame;
1990 /* Stop if we're a zombie or need a soft hangup */
1991 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
1992 if (chan->generator)
1993 ast_deactivate_generator(chan);
1996 prestate = chan->_state;
1998 if (!ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_EMULATE_DTMF | AST_FLAG_IN_DTMF) &&
1999 !ast_strlen_zero(chan->dtmfq)) {
2000 /* We have DTMF that has been deferred. Return it now */
2001 chan->dtmff.frametype = AST_FRAME_DTMF_BEGIN;
2002 chan->dtmff.subclass = chan->dtmfq[0];
2003 /* Drop first digit from the buffer */
2004 memmove(chan->dtmfq, chan->dtmfq + 1, sizeof(chan->dtmfq) - 1);
2006 ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
2007 chan->emulate_dtmf_digit = f->subclass;
2008 chan->emulate_dtmf_samples = AST_DEFAULT_EMULATE_DTMF_SAMPLES;
2012 /* Read and ignore anything on the alertpipe, but read only
2013 one sizeof(blah) per frame that we send from it */
2014 if (chan->alertpipe[0] > -1)
2015 read(chan->alertpipe[0], &blah, sizeof(blah));
2018 if (chan->timingfd > -1 && chan->fdno == AST_TIMING_FD && ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
2021 ast_clear_flag(chan, AST_FLAG_EXCEPTION);
2023 /* IF we can't get event, assume it's an expired as-per the old interface */
2024 res = ioctl(chan->timingfd, ZT_GETEVENT, &blah);
2026 blah = ZT_EVENT_TIMER_EXPIRED;
2028 if (blah == ZT_EVENT_TIMER_PING) {
2029 if (AST_LIST_EMPTY(&chan->readq) || !AST_LIST_NEXT(AST_LIST_FIRST(&chan->readq), frame_list)) {
2030 /* Acknowledge PONG unless we need it again */
2031 if (ioctl(chan->timingfd, ZT_TIMERPONG, &blah)) {
2032 ast_log(LOG_WARNING, "Failed to pong timer on '%s': %s\n", chan->name, strerror(errno));
2035 } else if (blah == ZT_EVENT_TIMER_EXPIRED) {
2036 ioctl(chan->timingfd, ZT_TIMERACK, &blah);
2037 if (chan->timingfunc) {
2038 /* save a copy of func/data before unlocking the channel */
2039 int (*func)(void *) = chan->timingfunc;
2040 void *data = chan->timingdata;
2041 ast_channel_unlock(chan);
2045 ioctl(chan->timingfd, ZT_TIMERCONFIG, &blah);
2046 chan->timingdata = NULL;
2047 ast_channel_unlock(chan);
2049 /* cannot 'goto done' because the channel is already unlocked */
2050 return &ast_null_frame;
2052 ast_log(LOG_NOTICE, "No/unknown event '%d' on timer for '%s'?\n", blah, chan->name);
2055 if (chan->fds[AST_GENERATOR_FD] > -1 && chan->fdno == AST_GENERATOR_FD) {
2056 /* if the AST_GENERATOR_FD is set, call the generator with args
2057 * set to -1 so it can do whatever it needs to.
2059 void *tmp = chan->generatordata;
2060 chan->generatordata = NULL; /* reset to let ast_write get through */
2061 chan->generator->generate(chan, tmp, -1, -1);
2062 chan->generatordata = tmp;
2063 f = &ast_null_frame;
2067 /* Check for pending read queue */
2068 if (!AST_LIST_EMPTY(&chan->readq)) {
2069 f = AST_LIST_REMOVE_HEAD(&chan->readq, frame_list);
2070 /* Interpret hangup and return NULL */
2071 /* XXX why not the same for frames from the channel ? */
2072 if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP) {
2077 chan->blocker = pthread_self();
2078 if (ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
2079 if (chan->tech->exception)
2080 f = chan->tech->exception(chan);
2082 ast_log(LOG_WARNING, "Exception flag set on '%s', but no exception handler\n", chan->name);
2083 f = &ast_null_frame;
2085 /* Clear the exception flag */
2086 ast_clear_flag(chan, AST_FLAG_EXCEPTION);
2087 } else if (chan->tech->read)
2088 f = chan->tech->read(chan);
2090 ast_log(LOG_WARNING, "No read routine on channel %s\n", chan->name);
2094 /* if the channel driver returned more than one frame, stuff the excess
2095 into the readq for the next ast_read call (note that we can safely assume
2096 that the readq is empty, because otherwise we would not have called into
2097 the channel driver and f would be only a single frame)
2099 if (AST_LIST_NEXT(f, frame_list)) {
2100 AST_LIST_HEAD_SET_NOLOCK(&chan->readq, AST_LIST_NEXT(f, frame_list));
2101 AST_LIST_NEXT(f, frame_list) = NULL;
2104 switch (f->frametype) {
2105 case AST_FRAME_CONTROL:
2106 if (f->subclass == AST_CONTROL_ANSWER) {
2107 if (!ast_test_flag(chan, AST_FLAG_OUTGOING)) {
2109 ast_log(LOG_DEBUG, "Ignoring answer on an inbound call!\n");
2111 f = &ast_null_frame;
2112 } else if (prestate == AST_STATE_UP) {
2114 ast_log(LOG_DEBUG, "Dropping duplicate answer!\n");
2116 f = &ast_null_frame;
2118 /* Answer the CDR */
2119 ast_setstate(chan, AST_STATE_UP);
2120 ast_cdr_answer(chan->cdr);
2124 case AST_FRAME_DTMF_END:
2125 ast_log(LOG_DTMF, "DTMF end '%c' received on %s\n", f->subclass, chan->name);
2126 if (ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_EMULATE_DTMF)) {
2127 if (strlen(chan->dtmfq) < sizeof(chan->dtmfq) - 2)
2128 chan->dtmfq[strlen(chan->dtmfq)] = f->subclass;
2130 ast_log(LOG_WARNING, "Dropping deferred DTMF digits on %s\n", chan->name);
2132 f = &ast_null_frame;
2133 } else if (!ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
2134 f->frametype = AST_FRAME_DTMF_BEGIN;
2135 ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
2136 chan->emulate_dtmf_digit = f->subclass;
2138 chan->emulate_dtmf_samples = f->samples;
2140 chan->emulate_dtmf_samples = AST_DEFAULT_EMULATE_DTMF_SAMPLES;
2142 ast_clear_flag(chan, AST_FLAG_IN_DTMF);
2144 case AST_FRAME_DTMF_BEGIN:
2145 ast_log(LOG_DTMF, "DTMF begin '%c' received on %s\n", f->subclass, chan->name);
2146 if (ast_test_flag(chan, AST_FLAG_DEFER_DTMF)) {
2148 f = &ast_null_frame;
2150 ast_set_flag(chan, AST_FLAG_IN_DTMF);
2152 case AST_FRAME_VOICE:
2153 /* The EMULATE_DTMF flag must be cleared here as opposed to when the samples
2154 * first get to zero, because we want to make sure we pass at least one
2155 * voice frame through before starting the next digit, to ensure a gap
2156 * between DTMF digits. */
2157 if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !chan->emulate_dtmf_samples) {
2158 ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
2159 chan->emulate_dtmf_digit = 0;
2162 if (dropaudio || ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
2164 f = &ast_null_frame;
2165 } else if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF)) {
2166 if (f->samples >= chan->emulate_dtmf_samples) {
2167 chan->emulate_dtmf_samples = 0;
2168 f->frametype = AST_FRAME_DTMF_END;
2169 f->subclass = chan->emulate_dtmf_digit;
2171 chan->emulate_dtmf_samples -= f->samples;
2173 f = &ast_null_frame;
2175 } else if (!(f->subclass & chan->nativeformats)) {
2176 /* This frame can't be from the current native formats -- drop it on the
2178 ast_log(LOG_NOTICE, "Dropping incompatible voice frame on %s of format %s since our native format has changed to %s\n",
2179 chan->name, ast_getformatname(f->subclass), ast_getformatname(chan->nativeformats));
2181 f = &ast_null_frame;
2184 queue_frame_to_spies(chan, f, SPY_READ);
2186 if (chan->monitor && chan->monitor->read_stream ) {
2187 /* XXX what does this do ? */
2188 #ifndef MONITOR_CONSTANT_DELAY
2189 int jump = chan->outsmpl - chan->insmpl - 4 * f->samples;
2191 if (ast_seekstream(chan->monitor->read_stream, jump + f->samples, SEEK_FORCECUR) == -1)
2192 ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
2193 chan->insmpl += jump + 4 * f->samples;
2195 chan->insmpl+= f->samples;
2197 int jump = chan->outsmpl - chan->insmpl;
2198 if (jump - MONITOR_DELAY >= 0) {
2199 if (ast_seekstream(chan->monitor->read_stream, jump - f->samples, SEEK_FORCECUR) == -1)
2200 ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
2201 chan->insmpl += jump;
2203 chan->insmpl += f->samples;
2205 if (chan->monitor->state == AST_MONITOR_RUNNING) {
2206 if (ast_writestream(chan->monitor->read_stream, f) < 0)
2207 ast_log(LOG_WARNING, "Failed to write data to channel monitor read stream\n");
2211 if (chan->readtrans && (f = ast_translate(chan->readtrans, f, 1)) == NULL)
2212 f = &ast_null_frame;
2214 /* Run generator sitting on the line if timing device not available
2215 * and synchronous generation of outgoing frames is necessary */
2216 if (chan->generatordata && !ast_internal_timing_enabled(chan)) {
2217 void *tmp = chan->generatordata;
2220 if (chan->timingfunc) {
2221 if (option_debug > 1)
2222 ast_log(LOG_DEBUG, "Generator got voice, switching to phase locked mode\n");
2223 ast_settimeout(chan, 0, NULL, NULL);
2226 chan->generatordata = NULL; /* reset, to let writes go through */
2227 res = chan->generator->generate(chan, tmp, f->datalen, f->samples);
2228 chan->generatordata = tmp;
2230 if (option_debug > 1)
2231 ast_log(LOG_DEBUG, "Auto-deactivating generator\n");
2232 ast_deactivate_generator(chan);
2235 } else if (f->frametype == AST_FRAME_CNG) {
2236 if (chan->generator && !chan->timingfunc && (chan->timingfd > -1)) {
2237 if (option_debug > 1)
2238 ast_log(LOG_DEBUG, "Generator got CNG, switching to timed mode\n");
2239 ast_settimeout(chan, 160, generator_force, chan);
2244 /* Just pass it on! */
2248 /* Make sure we always return NULL in the future */
2249 chan->_softhangup |= AST_SOFTHANGUP_DEV;
2250 if (chan->generator)
2251 ast_deactivate_generator(chan);
2252 /* End the CDR if appropriate */
2254 ast_cdr_end(chan->cdr);
2257 /* High bit prints debugging */
2258 if (chan->fin & DEBUGCHAN_FLAG)
2259 ast_frame_dump(chan->name, f, "<<");
2260 chan->fin = FRAMECOUNT_INC(chan->fin);
2263 ast_channel_unlock(chan);
2267 int ast_internal_timing_enabled(struct ast_channel *chan)
2269 int ret = ast_opt_internal_timing && chan->timingfd > -1;
2270 if (option_debug > 4)
2271 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);
2275 struct ast_frame *ast_read(struct ast_channel *chan)
2277 return __ast_read(chan, 0);
2280 struct ast_frame *ast_read_noaudio(struct ast_channel *chan)
2282 return __ast_read(chan, 1);
2285 int ast_indicate(struct ast_channel *chan, int condition)
2287 return ast_indicate_data(chan, condition, NULL, 0);
2290 int ast_indicate_data(struct ast_channel *chan, int condition, const void *data, size_t datalen)
2294 ast_channel_lock(chan);
2295 /* Stop if we're a zombie or need a soft hangup */
2296 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
2297 ast_channel_unlock(chan);
2300 if (chan->tech->indicate)
2301 res = chan->tech->indicate(chan, condition, data, datalen);
2302 ast_channel_unlock(chan);
2303 if (!chan->tech->indicate || res) {
2305 * Device does not support (that) indication, lets fake
2306 * it by doing our own tone generation. (PM2002)
2309 ast_playtones_stop(chan);
2311 const struct ind_tone_zone_sound *ts = NULL;
2312 switch (condition) {
2313 case AST_CONTROL_RINGING:
2314 ts = ast_get_indication_tone(chan->zone, "ring");
2316 case AST_CONTROL_BUSY:
2317 ts = ast_get_indication_tone(chan->zone, "busy");
2319 case AST_CONTROL_CONGESTION:
2320 ts = ast_get_indication_tone(chan->zone, "congestion");
2323 if (ts && ts->data[0]) {
2325 ast_log(LOG_DEBUG, "Driver for channel '%s' does not support indication %d, emulating it\n", chan->name, condition);
2326 ast_playtones_start(chan,0,ts->data, 1);
2328 } else if (condition == AST_CONTROL_PROGRESS) {
2329 /* ast_playtones_stop(chan); */
2330 } else if (condition == AST_CONTROL_PROCEEDING) {
2331 /* Do nothing, really */
2332 } else if (condition == AST_CONTROL_HOLD) {
2333 /* Do nothing.... */
2334 } else if (condition == AST_CONTROL_UNHOLD) {
2335 /* Do nothing.... */
2336 } else if (condition == AST_CONTROL_VIDUPDATE) {
2337 /* Do nothing.... */
2340 ast_log(LOG_WARNING, "Unable to handle indication %d for '%s'\n", condition, chan->name);
2348 int ast_recvchar(struct ast_channel *chan, int timeout)
2351 char *buf = ast_recvtext(chan, timeout);
2353 return -1; /* error or timeout */
2354 c = *(unsigned char *)buf;
2359 char *ast_recvtext(struct ast_channel *chan, int timeout)
2365 struct ast_frame *f;
2366 if (ast_check_hangup(chan))
2368 res = ast_waitfor(chan, timeout);
2369 if (res <= 0) /* timeout or error */
2371 timeout = res; /* update timeout */
2374 break; /* no frame */
2375 if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP)
2376 done = 1; /* force a break */
2377 else if (f->frametype == AST_FRAME_TEXT) { /* what we want */
2378 buf = ast_strndup((char *) f->data, f->datalen); /* dup and break */
2386 int ast_sendtext(struct ast_channel *chan, const char *text)
2389 /* Stop if we're a zombie or need a soft hangup */
2390 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
2392 CHECK_BLOCKING(chan);
2393 if (chan->tech->send_text)
2394 res = chan->tech->send_text(chan, text);
2395 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2399 int ast_senddigit_begin(struct ast_channel *chan, char digit)
2403 if (chan->tech->send_digit_begin)
2404 res = chan->tech->send_digit_begin(chan, digit);
2408 * Device does not support DTMF tones, lets fake
2409 * it by doing our own generation. (PM2002)
2411 static const char* dtmf_tones[] = {
2412 "!941+1336/100,!0/100", /* 0 */
2413 "!697+1209/100,!0/100", /* 1 */
2414 "!697+1336/100,!0/100", /* 2 */
2415 "!697+1477/100,!0/100", /* 3 */
2416 "!770+1209/100,!0/100", /* 4 */
2417 "!770+1336/100,!0/100", /* 5 */
2418 "!770+1477/100,!0/100", /* 6 */
2419 "!852+1209/100,!0/100", /* 7 */
2420 "!852+1336/100,!0/100", /* 8 */
2421 "!852+1477/100,!0/100", /* 9 */
2422 "!697+1633/100,!0/100", /* A */
2423 "!770+1633/100,!0/100", /* B */
2424 "!852+1633/100,!0/100", /* C */
2425 "!941+1633/100,!0/100", /* D */
2426 "!941+1209/100,!0/100", /* * */
2427 "!941+1477/100,!0/100" }; /* # */
2428 if (digit >= '0' && digit <='9')
2429 ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
2430 else if (digit >= 'A' && digit <= 'D')
2431 ast_playtones_start(chan, 0, dtmf_tones[digit-'A'+10], 0);
2432 else if (digit == '*')
2433 ast_playtones_start(chan, 0, dtmf_tones[14], 0);
2434 else if (digit == '#')
2435 ast_playtones_start(chan, 0, dtmf_tones[15], 0);
2439 ast_log(LOG_DEBUG, "Unable to generate DTMF tone '%c' for '%s'\n", digit, chan->name);
2446 int ast_senddigit_end(struct ast_channel *chan, char digit)
2450 if (chan->tech->send_digit_end)
2451 res = chan->tech->send_digit_end(chan, digit);
2453 if (res && chan->generator)
2454 ast_playtones_stop(chan);
2459 int ast_senddigit(struct ast_channel *chan, char digit)
2461 ast_senddigit_begin(chan, digit);
2463 ast_safe_sleep(chan, 100); /* XXX 100ms ... probably should be configurable */
2465 return ast_senddigit_end(chan, digit);
2468 int ast_prod(struct ast_channel *chan)
2470 struct ast_frame a = { AST_FRAME_VOICE };
2473 /* Send an empty audio frame to get things moving */
2474 if (chan->_state != AST_STATE_UP) {
2476 ast_log(LOG_DEBUG, "Prodding channel '%s'\n", chan->name);
2477 a.subclass = chan->rawwriteformat;
2478 a.data = nothing + AST_FRIENDLY_OFFSET;
2480 if (ast_write(chan, &a))
2481 ast_log(LOG_WARNING, "Prodding channel '%s' failed\n", chan->name);
2486 int ast_write_video(struct ast_channel *chan, struct ast_frame *fr)
2489 if (!chan->tech->write_video)
2491 res = ast_write(chan, fr);
2497 int ast_write(struct ast_channel *chan, struct ast_frame *fr)
2500 struct ast_frame *f = NULL;
2502 /* Stop if we're a zombie or need a soft hangup */
2503 ast_channel_lock(chan);
2504 if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
2507 /* Handle any pending masquerades */
2508 if (chan->masq && ast_do_masquerade(chan)) {
2509 ast_log(LOG_WARNING, "Failed to perform masquerade\n");
2513 res = 0; /* XXX explain, why 0 ? */
2516 if (chan->generatordata) {
2517 if (ast_test_flag(chan, AST_FLAG_WRITE_INT))
2518 ast_deactivate_generator(chan);
2520 res = 0; /* XXX explain, why 0 ? */
2524 /* High bit prints debugging */
2525 if (chan->fout & DEBUGCHAN_FLAG)
2526 ast_frame_dump(chan->name, fr, ">>");
2527 CHECK_BLOCKING(chan);
2528 switch(fr->frametype) {
2529 case AST_FRAME_CONTROL:
2530 res = (chan->tech->indicate == NULL) ? 0 :
2531 chan->tech->indicate(chan, fr->subclass, fr->data, fr->datalen);
2533 case AST_FRAME_DTMF_BEGIN:
2534 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2535 ast_channel_unlock(chan);
2536 res = ast_senddigit_begin(chan, fr->subclass);
2537 ast_channel_lock(chan);
2538 CHECK_BLOCKING(chan);
2540 case AST_FRAME_DTMF_END:
2541 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2542 ast_channel_unlock(chan);
2543 res = ast_senddigit_end(chan, fr->subclass);
2544 ast_channel_lock(chan);
2545 CHECK_BLOCKING(chan);
2547 case AST_FRAME_TEXT:
2548 res = (chan->tech->send_text == NULL) ? 0 :
2549 chan->tech->send_text(chan, (char *) fr->data);
2551 case AST_FRAME_HTML:
2552 res = (chan->tech->send_html == NULL) ? 0 :
2553 chan->tech->send_html(chan, fr->subclass, (char *) fr->data, fr->datalen);
2555 case AST_FRAME_VIDEO:
2556 /* XXX Handle translation of video codecs one day XXX */
2557 res = (chan->tech->write_video == NULL) ? 0 :
2558 chan->tech->write_video(chan, fr);
2560 case AST_FRAME_MODEM:
2561 res = (chan->tech->write == NULL) ? 0 :
2562 chan->tech->write(chan, fr);
2564 case AST_FRAME_VOICE:
2565 if (chan->tech->write == NULL)
2566 break; /*! \todo XXX should return 0 maybe ? */
2568 /* If someone is whispering on this channel then we must ensure that we are always getting signed linear frames */
2569 if (ast_test_flag(chan, AST_FLAG_WHISPER)) {
2570 if (fr->subclass == AST_FORMAT_SLINEAR)
2573 ast_mutex_lock(&chan->whisper->lock);
2574 if (chan->writeformat != AST_FORMAT_SLINEAR) {
2575 /* Rebuild the translation path and set our write format back to signed linear */
2576 chan->whisper->original_format = chan->writeformat;
2577 ast_set_write_format(chan, AST_FORMAT_SLINEAR);
2578 if (chan->whisper->path)
2579 ast_translator_free_path(chan->whisper->path);
2580 chan->whisper->path = ast_translator_build_path(AST_FORMAT_SLINEAR, chan->whisper->original_format);
2582 /* Translate frame using the above translation path */
2583 f = (chan->whisper->path) ? ast_translate(chan->whisper->path, fr, 0) : fr;
2584 ast_mutex_unlock(&chan->whisper->lock);
2587 /* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */
2588 if (fr->subclass == chan->rawwriteformat)
2591 f = (chan->writetrans) ? ast_translate(chan->writetrans, fr, 0) : fr;
2594 /* If we have no frame of audio, then we have to bail out */
2600 /* If spies are on the channel then queue the frame out to them */
2602 queue_frame_to_spies(chan, f, SPY_WRITE);
2604 /* If Monitor is running on this channel, then we have to write frames out there too */
2605 if (chan->monitor && chan->monitor->write_stream) {
2606 /* XXX must explain this code */
2607 #ifndef MONITOR_CONSTANT_DELAY
2608 int jump = chan->insmpl - chan->outsmpl - 4 * f->samples;
2610 if (ast_seekstream(chan->monitor->write_stream, jump + f->samples, SEEK_FORCECUR) == -1)
2611 ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
2612 chan->outsmpl += jump + 4 * f->samples;
2614 chan->outsmpl += f->samples;
2616 int jump = chan->insmpl - chan->outsmpl;
2617 if (jump - MONITOR_DELAY >= 0) {
2618 if (ast_seekstream(chan->monitor->write_stream, jump - f->samples, SEEK_FORCECUR) == -1)
2619 ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
2620 chan->outsmpl += jump;
2622 chan->outsmpl += f->samples;
2624 if (chan->monitor->state == AST_MONITOR_RUNNING) {
2625 if (ast_writestream(chan->monitor->write_stream, f) < 0)
2626 ast_log(LOG_WARNING, "Failed to write data to channel monitor write stream\n");
2630 /* Finally the good part! Write this out to the channel */
2631 if (ast_test_flag(chan, AST_FLAG_WHISPER)) {
2632 /* frame is assumed to be in SLINEAR, since that is
2633 required for whisper mode */
2634 ast_frame_adjust_volume(f, -2);
2635 if (ast_slinfactory_available(&chan->whisper->sf) >= f->samples) {
2636 short buf[f->samples];
2637 struct ast_frame whisper = {
2638 .frametype = AST_FRAME_VOICE,
2639 .subclass = AST_FORMAT_SLINEAR,
2641 .datalen = sizeof(buf),
2642 .samples = f->samples,
2645 ast_mutex_lock(&chan->whisper->lock);
2646 if (ast_slinfactory_read(&chan->whisper->sf, buf, f->samples))
2647 ast_frame_slinear_sum(f, &whisper);
2648 ast_mutex_unlock(&chan->whisper->lock);
2650 /* and now put it through the regular translator */
2651 f = (chan->writetrans) ? ast_translate(chan->writetrans, f, 0) : f;
2654 res = chan->tech->write(chan, f);
2656 case AST_FRAME_NULL:
2662 /* At this point, fr is the incoming frame and f is NULL. Channels do
2663 * not expect to get NULL as a frame pointer and will segfault. Hence,
2664 * we output the original frame passed in. */
2665 res = chan->tech->write(chan, fr);
2671 ast_clear_flag(chan, AST_FLAG_BLOCKING);
2672 /* Consider a write failure to force a soft hangup */
2674 chan->_softhangup |= AST_SOFTHANGUP_DEV;
2676 chan->fout = FRAMECOUNT_INC(chan->fout);
2679 ast_channel_unlock(chan);
2683 static int set_format(struct ast_channel *chan, int fmt, int *rawformat, int *format,
2684 struct ast_trans_pvt **trans, const int direction)
2689 /* Make sure we only consider audio */
2690 fmt &= AST_FORMAT_AUDIO_MASK;
2692 native = chan->nativeformats;
2693 /* Find a translation path from the native format to one of the desired formats */
2696 res = ast_translator_best_choice(&fmt, &native);
2699 res = ast_translator_best_choice(&native, &fmt);
2702 ast_log(LOG_WARNING, "Unable to find a codec translation path from %s to %s\n",
2703 ast_getformatname(native), ast_getformatname(fmt));
2707 /* Now we have a good choice for both. */
2708 ast_channel_lock(chan);
2710 if ((*rawformat == native) && (*format == fmt) && ((*rawformat == *format) || (*trans))) {
2711 /* the channel is already in these formats, so nothing to do */
2712 ast_channel_unlock(chan);
2716 *rawformat = native;
2717 /* User perspective is fmt */
2719 /* Free any read translation we have right now */
2721 ast_translator_free_path(*trans);
2722 /* Build a translation path from the raw format to the desired format */
2725 *trans = ast_translator_build_path(*format, *rawformat);
2728 *trans = ast_translator_build_path(*rawformat, *format);
2729 ast_channel_unlock(chan);
2731 ast_log(LOG_DEBUG, "Set channel %s to %s format %s\n", chan->name,
2732 direction ? "write" : "read", ast_getformatname(fmt));
2736 int ast_set_read_format(struct ast_channel *chan, int fmt)
2738 return set_format(chan, fmt, &chan->rawreadformat, &chan->readformat,
2739 &chan->readtrans, 0);
2742 int ast_set_write_format(struct ast_channel *chan, int fmt)
2744 return set_format(chan, fmt, &chan->rawwriteformat, &chan->writeformat,
2745 &chan->writetrans, 1);
2748 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)
2752 struct ast_channel *chan;
2758 outstate = &dummy_outstate; /* make outstate always a valid pointer */
2760 chan = ast_request(type, format, data, &cause);
2762 ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, (char *)data);
2763 /* compute error and return */
2764 if (cause == AST_CAUSE_BUSY)
2765 *outstate = AST_CONTROL_BUSY;
2766 else if (cause == AST_CAUSE_CONGESTION)
2767 *outstate = AST_CONTROL_CONGESTION;
2773 ast_set_variables(chan, oh->vars);
2774 /* XXX why is this necessary, for the parent_channel perhaps ? */
2775 if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name))
2776 ast_set_callerid(chan, oh->cid_num, oh->cid_name, oh->cid_num);
2777 if (oh->parent_channel)
2778 ast_channel_inherit_variables(oh->parent_channel, chan);
2780 ast_cdr_setaccount(chan, oh->account);
2782 ast_set_callerid(chan, cid_num, cid_name, cid_num);
2784 if (ast_call(chan, data, 0)) { /* ast_call failed... */
2785 ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, (char *)data);
2787 res = 1; /* mark success in case chan->_state is already AST_STATE_UP */
2788 while (timeout && chan->_state != AST_STATE_UP) {
2789 struct ast_frame *f;
2790 res = ast_waitfor(chan, timeout);
2791 if (res <= 0) /* error, timeout, or done */
2797 *outstate = AST_CONTROL_HANGUP;
2801 if (f->frametype == AST_FRAME_CONTROL) {
2802 switch (f->subclass) {
2803 case AST_CONTROL_RINGING: /* record but keep going */
2804 *outstate = f->subclass;
2807 case AST_CONTROL_BUSY:
2808 case AST_CONTROL_CONGESTION:
2809 case AST_CONTROL_ANSWER:
2810 *outstate = f->subclass;
2811 timeout = 0; /* trick to force exit from the while() */
2815 case AST_CONTROL_PROGRESS:
2816 case AST_CONTROL_PROCEEDING:
2817 case AST_CONTROL_HOLD:
2818 case AST_CONTROL_UNHOLD:
2819 case AST_CONTROL_VIDUPDATE:
2820 case -1: /* Ignore -- just stopping indications */
2824 ast_log(LOG_NOTICE, "Don't know what to do with control frame %d\n", f->subclass);
2833 if (!ast_strlen_zero(oh->context))
2834 ast_copy_string(chan->context, oh->context, sizeof(chan->context));
2835 if (!ast_strlen_zero(oh->exten))
2836 ast_copy_string(chan->exten, oh->exten, sizeof(chan->exten));
2838 chan->priority = oh->priority;
2840 if (chan->_state == AST_STATE_UP)
2841 *outstate = AST_CONTROL_ANSWER;
2844 if (!chan->cdr && (chan->cdr = ast_cdr_alloc()))
2845 ast_cdr_init(chan->cdr, chan);
2848 snprintf(tmp, sizeof(tmp), "%s/%s", type, (char *)data);
2849 ast_cdr_setapp(chan->cdr,"Dial",tmp);
2850 ast_cdr_update(chan);
2851 ast_cdr_start(chan->cdr);
2852 ast_cdr_end(chan->cdr);
2853 /* If the cause wasn't handled properly */
2854 if (ast_cdr_disposition(chan->cdr,chan->hangupcause))
2855 ast_cdr_failed(chan->cdr);
2863 struct ast_channel *ast_request_and_dial(const char *type, int format, void *data, int timeout, int *outstate, const char *cidnum, const char *cidname)
2865 return __ast_request_and_dial(type, format, data, timeout, outstate, cidnum, cidname, NULL);
2868 struct ast_channel *ast_request(const char *type, int format, void *data, int *cause)
2870 struct chanlist *chan;
2871 struct ast_channel *c;
2876 int videoformat = format & AST_FORMAT_VIDEO_MASK;
2880 *cause = AST_CAUSE_NOTDEFINED;
2882 if (AST_LIST_LOCK(&channels)) {
2883 ast_log(LOG_WARNING, "Unable to lock channel list\n");
2887 AST_LIST_TRAVERSE(&backends, chan, list) {
2888 if (strcasecmp(type, chan->tech->type))
2891 capabilities = chan->tech->capabilities;
2892 fmt = format & AST_FORMAT_AUDIO_MASK;
2893 res = ast_translator_best_choice(&fmt, &capabilities);
2895 ast_log(LOG_WARNING, "No translator path exists for channel type %s (native %d) to %d\n", type, chan->tech->capabilities, format);
2896 AST_LIST_UNLOCK(&channels);
2899 AST_LIST_UNLOCK(&channels);
2900 if (!chan->tech->requester)
2903 if (!(c = chan->tech->requester(type, capabilities | videoformat, data, cause)))
2906 /* no need to generate a Newchannel event here; it is done in the channel_alloc call */
2910 ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
2911 *cause = AST_CAUSE_NOSUCHDRIVER;
2912 AST_LIST_UNLOCK(&channels);
2917 int ast_call(struct ast_channel *chan, char *addr, int timeout)
2919 /* Place an outgoing call, but don't wait any longer than timeout ms before returning.
2920 If the remote end does not answer within the timeout, then do NOT hang up, but
2923 /* Stop if we're a zombie or need a soft hangup */
2924 ast_channel_lock(chan);
2925 if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan)) {
2926 if (chan->tech->call)
2927 res = chan->tech->call(chan, addr, timeout);
2928 ast_set_flag(chan, AST_FLAG_OUTGOING);
2930 ast_channel_unlock(chan);
2935 \brief Transfer a call to dest, if the channel supports transfer
2939 \arg the manager interface
2941 int ast_transfer(struct ast_channel *chan, char *dest)
2945 /* Stop if we're a zombie or need a soft hangup */
2946 ast_channel_lock(chan);
2947 if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan)) {
2948 if (chan->tech->transfer) {
2949 res = chan->tech->transfer(chan, dest);
2955 ast_channel_unlock(chan);
2959 int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders)
2961 return ast_readstring_full(c, s, len, timeout, ftimeout, enders, -1, -1);
2964 int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders, int audiofd, int ctrlfd)
2966 int pos = 0; /* index in the buffer where we accumulate digits */
2969 /* Stop if we're a zombie or need a soft hangup */
2970 if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
2977 d = ast_waitstream_full(c, AST_DIGIT_ANY, audiofd, ctrlfd);
2981 d = ast_waitfordigit_full(c, to, audiofd, ctrlfd);
2983 d = ast_waitfordigit_full(c, to, audiofd, ctrlfd);
2995 if (!strchr(enders, d))
2997 if (strchr(enders, d) || (pos >= len)) {
3007 int ast_channel_supports_html(struct ast_channel *chan)
3009 return (chan->tech->send_html) ? 1 : 0;
3012 int ast_channel_sendhtml(struct ast_channel *chan, int subclass, const char *data, int datalen)
3014 if (chan->tech->send_html)
3015 return chan->tech->send_html(chan, subclass, data, datalen);
3019 int ast_channel_sendurl(struct ast_channel *chan, const char *url)
3021 return ast_channel_sendhtml(chan, AST_HTML_URL, url, strlen(url) + 1);
3024 /*! \brief Set up translation from one channel to another */
3025 static int ast_channel_make_compatible_helper(struct ast_channel *from, struct ast_channel *to)
3030 /* Set up translation from the 'from' channel to the 'to' channel */
3031 src = from->nativeformats;
3032 dst = to->nativeformats;
3033 if (ast_translator_best_choice(&dst, &src) < 0) {
3034 ast_log(LOG_WARNING, "No path to translate from %s(%d) to %s(%d)\n", from->name, src, to->name, dst);
3038 /* if the best path is not 'pass through', then
3039 transcoding is needed; if desired, force transcode path
3040 to use SLINEAR between channels, but only if there is
3041 no direct conversion available */
3042 if ((src != dst) && ast_opt_transcode_via_slin &&
3043 (ast_translate_path_steps(dst, src) != 1))
3044 dst = AST_FORMAT_SLINEAR;
3045 if (ast_set_read_format(from, dst) < 0) {
3046 ast_log(LOG_WARNING, "Unable to set read format on channel %s to %d\n", from->name, dst);
3049 if (ast_set_write_format(to, dst) < 0) {
3050 ast_log(LOG_WARNING, "Unable to set write format on channel %s to %d\n", to->name, dst);
3056 int ast_channel_make_compatible(struct ast_channel *chan, struct ast_channel *peer)
3058 /* Some callers do not check return code, and we must try to set all call legs correctly */
3061 /* Set up translation from the chan to the peer */
3062 rc = ast_channel_make_compatible_helper(chan, peer);
3067 /* Set up translation from the peer to the chan */
3068 rc = ast_channel_make_compatible_helper(peer, chan);
3073 int ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clone)
3076 struct ast_channel *final_orig = original, *final_clone = clone;
3078 ast_channel_lock(original);
3079 while (ast_channel_trylock(clone)) {
3080 ast_channel_unlock(original);
3082 ast_channel_lock(original);
3085 /* each of these channels may be sitting behind a channel proxy (i.e. chan_agent)
3086 and if so, we don't really want to masquerade it, but its proxy */
3087 if (original->_bridge && (original->_bridge != ast_bridged_channel(original)))
3088 final_orig = original->_bridge;
3090 if (clone->_bridge && (clone->_bridge != ast_bridged_channel(clone)))
3091 final_clone = clone->_bridge;
3093 if ((final_orig != original) || (final_clone != clone)) {
3094 ast_channel_lock(final_orig);