dect
/
asterisk
Archived
13
0
Fork 0

minor formatting cleanup and removal of trailing whitespace.

git-svn-id: http://svn.digium.com/svn/asterisk/trunk@17863 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
rizzo 2006-04-06 15:40:12 +00:00
parent 2200466f93
commit 5d1a483bbb
1 changed files with 129 additions and 165 deletions

294
channel.c
View File

@ -194,8 +194,8 @@ static int show_channeltypes(int fd, int argc, char *argv[])
return -1;
}
AST_LIST_TRAVERSE(&backends, cl, list) {
ast_cli(fd, FORMAT, cl->tech->type, cl->tech->description,
(cl->tech->devicestate) ? "yes" : "no",
ast_cli(fd, FORMAT, cl->tech->type, cl->tech->description,
(cl->tech->devicestate) ? "yes" : "no",
(cl->tech->indicate) ? "yes" : "no",
(cl->tech->transfer) ? "yes" : "no");
count_chan++;
@ -231,7 +231,7 @@ static int show_channeltype(int fd, int argc, char *argv[])
ast_cli(fd, "\n%s is not a registered channel driver.\n", argv[2]);
AST_LIST_UNLOCK(&channels);
return RESULT_FAILURE;
}
}
ast_cli(fd,
"-- Info about channel driver: %s --\n"
@ -281,15 +281,15 @@ static char *complete_channeltypes(const char *line, const char *word, int pos,
return ret;
}
static char show_channeltypes_usage[] =
static char show_channeltypes_usage[] =
"Usage: show channeltypes\n"
" Shows available channel types registered in your Asterisk server.\n";
static char show_channeltype_usage[] =
static char show_channeltype_usage[] =
"Usage: show channeltype <name>\n"
" Show details about the specified channel type, <name>.\n";
static struct ast_cli_entry cli_show_channeltypes =
static struct ast_cli_entry cli_show_channeltypes =
{ { "show", "channeltypes", NULL }, show_channeltypes, "Show available channel types", show_channeltypes_usage };
static struct ast_cli_entry cli_show_channeltype =
@ -298,22 +298,15 @@ static struct ast_cli_entry cli_show_channeltype =
/*! \brief Checks to see if a channel is needing hang up */
int ast_check_hangup(struct ast_channel *chan)
{
time_t myt;
/* if soft hangup flag, return true */
if (chan->_softhangup)
if (chan->_softhangup) /* yes if soft hangup flag set */
return 1;
/* if no technology private data, return true */
if (!chan->tech_pvt)
if (!chan->tech_pvt) /* yes if no technology private data */
return 1;
/* if no hangup scheduled, just return here */
if (!chan->whentohangup)
if (!chan->whentohangup) /* no if no hangup scheduled */
return 0;
time(&myt); /* get current time */
/* return, if not yet */
if (chan->whentohangup > myt)
if (chan->whentohangup > time(NULL)) /* no if hangup time has not come yet. */
return 0;
chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT; /* record event */
return 1;
}
@ -366,15 +359,8 @@ int ast_shutting_down(void)
/*! \brief Set when to hangup channel */
void ast_channel_setwhentohangup(struct ast_channel *chan, time_t offset)
{
time_t myt;
struct ast_frame fr = { AST_FRAME_NULL, };
time(&myt);
if (offset)
chan->whentohangup = myt + offset;
else
chan->whentohangup = 0;
ast_queue_frame(chan, &fr);
chan->whentohangup = offset ? time(NULL) + offset : 0;
ast_queue_frame(chan, &ast_null_frame);
return;
}
@ -384,12 +370,9 @@ int ast_channel_cmpwhentohangup(struct ast_channel *chan, time_t offset)
time_t whentohangup;
if (chan->whentohangup == 0) {
if (offset == 0)
return (0);
else
return (-1);
} else {
if (offset == 0)
return (offset == 0) ? 0 : -1;
} else {
if (offset == 0) /* XXX why is this special ? */
return (1);
else {
whentohangup = offset + time (NULL);
@ -486,9 +469,10 @@ const char *ast_cause2str(int cause)
{
int x;
for (x=0; x < sizeof(causes) / sizeof(causes[0]); x++)
for (x=0; x < sizeof(causes) / sizeof(causes[0]); x++) {
if (causes[x].cause == cause)
return causes[x].desc;
}
return "Unknown";
}
@ -548,7 +532,7 @@ int ast_best_codec(int fmts)
/* This just our opinion, expressed in code. We are asked to choose
the best codec to use, given no information */
int x;
static int prefs[] =
static int prefs[] =
{
/*! Okay, ulaw is used by all telephony equipment, so start with it */
AST_FORMAT_ULAW,
@ -596,8 +580,7 @@ struct ast_channel *ast_channel_alloc(int needqueue)
struct ast_channel *tmp;
int x;
int flags;
struct varshead *headp;
struct varshead *headp;
/* If shutting down, don't allocate any new channels */
if (shutting_down) {
@ -605,9 +588,8 @@ struct ast_channel *ast_channel_alloc(int needqueue)
return NULL;
}
if (!(tmp = ast_calloc(1, sizeof(*tmp)))) {
if (!(tmp = ast_calloc(1, sizeof(*tmp))))
return NULL;
}
if (!(tmp->sched = sched_context_create())) {
ast_log(LOG_WARNING, "Channel allocation failed: Unable to create schedule context\n");
@ -647,8 +629,7 @@ struct ast_channel *ast_channel_alloc(int needqueue)
flags = fcntl(tmp->alertpipe[1], F_GETFL);
fcntl(tmp->alertpipe[1], F_SETFL, flags | O_NONBLOCK);
}
} else
/* Make sure we've got it done right if they don't */
} else /* Make sure we've got it done right if they don't */
tmp->alertpipe[0] = tmp->alertpipe[1] = -1;
/* Always watch the alertpipe */
@ -783,8 +764,8 @@ void ast_channel_undefer_dtmf(struct ast_channel *chan)
}
/*!
* \brief Helper function to find channels.
*
* \brief Helper function to find channels.
*
* It supports these modes:
*
* prev != NULL : get channel next in list after prev
@ -792,10 +773,10 @@ void ast_channel_undefer_dtmf(struct ast_channel *chan)
* name != NULL && namelen != 0 : get channel whose name starts with prefix
* exten != NULL : get channel whose exten or macroexten matches
* context != NULL && exten != NULL : get channel whose context or macrocontext
*
*
* It returns with the channel's lock held. If getting the individual lock fails,
* unlock and retry quickly up to 10 times, then give up.
*
*
* \note XXX Note that this code has cost O(N) because of the need to verify
* that the object is still on the global list.
*
@ -981,7 +962,7 @@ void ast_channel_free(struct ast_channel *chan)
ast_translator_free_path(chan->readtrans);
if (chan->writetrans)
ast_translator_free_path(chan->writetrans);
if (chan->pbx)
if (chan->pbx)
ast_log(LOG_WARNING, "PBX may not have been terminated properly on '%s'\n", chan->name);
free_cid(&chan->cid);
ast_mutex_destroy(&chan->lock);
@ -1125,7 +1106,7 @@ void ast_channel_spy_remove(struct ast_channel *chan, struct ast_channel_spy *sp
}
}
static void detach_spies(struct ast_channel *chan)
static void detach_spies(struct ast_channel *chan)
{
struct ast_channel_spy *spy;
@ -1150,17 +1131,15 @@ static void detach_spies(struct ast_channel *chan)
/*! \brief Softly hangup a channel, don't lock */
int ast_softhangup_nolock(struct ast_channel *chan, int cause)
{
int res = 0;
struct ast_frame f = { AST_FRAME_NULL };
if (option_debug)
ast_log(LOG_DEBUG, "Soft-Hanging up channel '%s'\n", chan->name);
/* Inform channel driver that we need to be hung up, if it cares */
chan->_softhangup |= cause;
ast_queue_frame(chan, &f);
ast_queue_frame(chan, &ast_null_frame);
/* Interrupt any poll call or such */
if (ast_test_flag(chan, AST_FLAG_BLOCKING))
pthread_kill(chan->blocker, SIGURG);
return res;
return 0;
}
/*! \brief Softly hangup a channel, lock */
@ -1334,7 +1313,7 @@ int ast_hangup(struct ast_channel *chan)
detach_spies(chan); /* get rid of spies */
if (chan->masq) {
if (ast_do_masquerade(chan))
if (ast_do_masquerade(chan))
ast_log(LOG_WARNING, "Failed to perform masquerade\n");
}
@ -1343,7 +1322,7 @@ int ast_hangup(struct ast_channel *chan)
ast_mutex_unlock(&chan->lock);
return 0;
}
/* If this channel is one which will be masqueraded into something,
/* If this channel is one which will be masqueraded into something,
mark it as a zombie already, so we know to free it later */
if (chan->masqr) {
ast_set_flag(chan, AST_FLAG_ZOMBIE);
@ -1360,13 +1339,13 @@ int ast_hangup(struct ast_channel *chan)
chan->sched = NULL;
}
if (chan->generatordata) /* Clear any tone stuff remaining */
if (chan->generatordata) /* Clear any tone stuff remaining */
chan->generator->release(chan, chan->generatordata);
chan->generatordata = NULL;
chan->generator = NULL;
if (chan->cdr) { /* End the CDR if it hasn't already */
if (chan->cdr) { /* End the CDR if it hasn't already */
ast_cdr_end(chan->cdr);
ast_cdr_detach(chan->cdr); /* Post and Free the CDR */
ast_cdr_detach(chan->cdr); /* Post and Free the CDR */
chan->cdr = NULL;
}
if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
@ -1386,13 +1365,13 @@ int ast_hangup(struct ast_channel *chan)
}
ast_mutex_unlock(&chan->lock);
manager_event(EVENT_FLAG_CALL, "Hangup",
manager_event(EVENT_FLAG_CALL, "Hangup",
"Channel: %s\r\n"
"Uniqueid: %s\r\n"
"Cause: %d\r\n"
"Cause-txt: %s\r\n",
chan->name,
chan->uniqueid,
chan->name,
chan->uniqueid,
chan->hangupcause,
ast_cause2str(chan->hangupcause)
);
@ -1433,7 +1412,7 @@ void ast_deactivate_generator(struct ast_channel *chan)
{
ast_mutex_lock(&chan->lock);
if (chan->generatordata) {
if (chan->generator && chan->generator->release)
if (chan->generator && chan->generator->release)
chan->generator->release(chan, chan->generatordata);
chan->generatordata = NULL;
chan->generator = NULL;
@ -1499,7 +1478,7 @@ int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception)
}
/*! \brief Wait for x amount of time on a file descriptor to have input. */
struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
int *exception, int *outfd, int *ms)
{
struct timeval start = { 0 , 0 };
@ -1581,7 +1560,7 @@ struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds,
max += ast_add_fd(&pfds[max], fds[x]);
}
if (*ms > 0)
if (*ms > 0)
start = ast_tvnow();
if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
@ -1671,19 +1650,19 @@ int ast_waitfordigit(struct ast_channel *c, int ms)
int result = 0;
/* Stop if we're a zombie or need a soft hangup */
if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
return -1;
/* Wait for a digit, no more than ms milliseconds total. */
while(ms && !result) {
ms = ast_waitfor(c, ms);
if (ms < 0) /* Error */
result = -1;
result = -1;
else if (ms > 0) {
/* Read something */
f = ast_read(c);
if (f) {
if (f->frametype == AST_FRAME_DTMF)
if (f->frametype == AST_FRAME_DTMF)
result = f->subclass;
ast_frfree(f);
} else
@ -1719,13 +1698,13 @@ int ast_waitfordigit_full(struct ast_channel *c, int ms, int audiofd, int cmdfd)
int res;
/* Stop if we're a zombie or need a soft hangup */
if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
return -1;
/* Wait for a digit, no more than ms milliseconds total. */
while(ms) {
errno = 0;
rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
if ((!rchan) && (outfd < 0) && (ms)) {
if ((!rchan) && (outfd < 0) && (ms)) {
if (errno == 0 || errno == EINTR)
continue;
ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
@ -1819,7 +1798,7 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
blah = -1;
/* IF we can't get event, assume it's an expired as-per the old interface */
res = ioctl(chan->timingfd, ZT_GETEVENT, &blah);
if (res)
if (res)
blah = ZT_EVENT_TIMER_EXPIRED;
if (blah == ZT_EVENT_TIMER_PING) {
@ -1880,7 +1859,7 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
} else {
chan->blocker = pthread_self();
if (ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
if (chan->tech->exception)
if (chan->tech->exception)
f = chan->tech->exception(chan);
else {
ast_log(LOG_WARNING, "Exception flag set on '%s', but no exception handler\n", chan->name);
@ -2035,7 +2014,7 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
int ast_internal_timing_enabled(struct ast_channel *chan)
{
int ret = ast_opt_internal_timing && chan->timingfd > -1;
if (option_debug > 3)
if (option_debug > 3)
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);
return ret;
}
@ -2148,7 +2127,7 @@ int ast_sendtext(struct ast_channel *chan, const char *text)
{
int res = 0;
/* Stop if we're a zombie or need a soft hangup */
if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
return -1;
CHECK_BLOCKING(chan);
if (chan->tech->send_text)
@ -2513,7 +2492,7 @@ struct ast_channel *__ast_request_and_dial(const char *type, int format, void *d
if (oh->priority)
chan->priority = oh->priority;
}
if (chan->_state == AST_STATE_UP)
if (chan->_state == AST_STATE_UP)
state = AST_CONTROL_ANSWER;
}
if (outstate)
@ -2603,29 +2582,29 @@ struct ast_channel *ast_request(const char *type, int format, void *data, int *c
return NULL;
}
int ast_call(struct ast_channel *chan, char *addr, int timeout)
int ast_call(struct ast_channel *chan, char *addr, int timeout)
{
/* Place an outgoing call, but don't wait any longer than timeout ms before returning.
If the remote end does not answer within the timeout, then do NOT hang up, but
/* Place an outgoing call, but don't wait any longer than timeout ms before returning.
If the remote end does not answer within the timeout, then do NOT hang up, but
return anyway. */
int res = -1;
/* Stop if we're a zombie or need a soft hangup */
ast_mutex_lock(&chan->lock);
if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan))
if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan))
if (chan->tech->call)
res = chan->tech->call(chan, addr, timeout);
ast_mutex_unlock(&chan->lock);
return res;
}
/*!
/*!
\brief Transfer a call to dest, if the channel supports transfer
Called by:
Called by:
\arg app_transfer
\arg the manager interface
*/
int ast_transfer(struct ast_channel *chan, char *dest)
int ast_transfer(struct ast_channel *chan, char *dest)
{
int res = -1;
@ -2651,7 +2630,7 @@ int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int fti
/* XXX Merge with full version? XXX */
/* Stop if we're a zombie or need a soft hangup */
if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
return -1;
if (!len)
return -1;
@ -2690,7 +2669,7 @@ int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, in
int d;
/* Stop if we're a zombie or need a soft hangup */
if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
return -1;
if (!len)
return -1;
@ -2815,10 +2794,10 @@ int ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clo
ast_log(LOG_DEBUG, "Planning to masquerade channel %s into the structure of %s\n",
clone->name, original->name);
if (original->masq) {
ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
original->masq->name, original->name);
} else if (clone->masqr) {
ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
clone->name, clone->masqr->name);
} else {
original->masq = clone;
@ -2884,11 +2863,11 @@ void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_
/*!
\brief Clone channel variables from 'clone' channel into 'original' channel
All variables except those related to app_groupcount are cloned.
Variables are actually _removed_ from 'clone' channel, presumably
because it will subsequently be destroyed.
\note Assumes locks will be in place on both channels when called.
*/
static void clone_variables(struct ast_channel *original, struct ast_channel *clone)
@ -2918,7 +2897,7 @@ static void clone_variables(struct ast_channel *original, struct ast_channel *cl
/*!
\brief Masquerade a channel
\note Assumes channel will be locked when called
\note Assumes channel will be locked when called
*/
int ast_do_masquerade(struct ast_channel *original)
{
@ -2943,7 +2922,7 @@ int ast_do_masquerade(struct ast_channel *original)
/* XXX This is a seriously wacked out operation. We're essentially putting the guts of
the clone channel into the original channel. Start by killing off the original
channel's backend. I'm not sure we're going to keep this function, because
channel's backend. I'm not sure we're going to keep this function, because
while the features are nice, the cost is very high in terms of pure nastiness. XXX */
/* We need the clone's lock, too */
@ -3015,7 +2994,7 @@ int ast_do_masquerade(struct ast_channel *original)
x++;
prev = cur;
}
/* If we had any, prepend them to the ones already in the queue, and
/* If we had any, prepend them to the ones already in the queue, and
* load up the alertpipe */
if (prev) {
prev->next = original->readq;
@ -3039,7 +3018,7 @@ int ast_do_masquerade(struct ast_channel *original)
if (clone->tech->fixup){
res = clone->tech->fixup(original, clone);
if (res)
if (res)
ast_log(LOG_WARNING, "Fixup failed on channel %s, strange things may happen.\n", clone->name);
}
@ -3130,13 +3109,13 @@ int ast_do_masquerade(struct ast_channel *original)
if (ast_test_flag(clone, AST_FLAG_ZOMBIE)) {
ast_log(LOG_DEBUG, "Destroying channel clone '%s'\n", clone->name);
ast_mutex_unlock(&clone->lock);
manager_event(EVENT_FLAG_CALL, "Hangup",
manager_event(EVENT_FLAG_CALL, "Hangup",
"Channel: %s\r\n"
"Uniqueid: %s\r\n"
"Cause: %d\r\n"
"Cause-txt: %s\r\n",
clone->name,
clone->uniqueid,
clone->name,
clone->uniqueid,
clone->hangupcause,
ast_cause2str(clone->hangupcause)
);
@ -3183,15 +3162,15 @@ void ast_set_callerid(struct ast_channel *chan, const char *callerid, const char
}
if (chan->cdr)
ast_cdr_setcid(chan->cdr, chan);
manager_event(EVENT_FLAG_CALL, "Newcallerid",
manager_event(EVENT_FLAG_CALL, "Newcallerid",
"Channel: %s\r\n"
"CallerID: %s\r\n"
"CallerIDName: %s\r\n"
"Uniqueid: %s\r\n"
"CID-CallingPres: %d (%s)\r\n",
chan->name, chan->cid.cid_num ?
chan->cid.cid_num : "<Unknown>",
chan->cid.cid_name ?
chan->name, chan->cid.cid_num ?
chan->cid.cid_num : "<Unknown>",
chan->cid.cid_name ?
chan->cid.cid_name : "<Unknown>",
chan->uniqueid,
chan->cid.cid_pres,
@ -3215,9 +3194,9 @@ int ast_setstate(struct ast_channel *chan, int state)
"CallerID: %s\r\n"
"CallerIDName: %s\r\n"
"Uniqueid: %s\r\n",
chan->name, ast_state2str(chan->_state),
chan->cid.cid_num ? chan->cid.cid_num : "<unknown>",
chan->cid.cid_name ? chan->cid.cid_name : "<unknown>",
chan->name, ast_state2str(chan->_state),
chan->cid.cid_num ? chan->cid.cid_num : "<unknown>",
chan->cid.cid_name ? chan->cid.cid_name : "<unknown>",
chan->uniqueid);
return 0;
@ -3228,17 +3207,17 @@ struct ast_channel *ast_bridged_channel(struct ast_channel *chan)
{
struct ast_channel *bridged;
bridged = chan->_bridge;
if (bridged && bridged->tech->bridged_channel)
if (bridged && bridged->tech->bridged_channel)
bridged = bridged->tech->bridged_channel(chan, bridged);
return bridged;
}
static void bridge_playfile(struct ast_channel *chan, struct ast_channel *peer, const char *sound, int remain)
static void bridge_playfile(struct ast_channel *chan, struct ast_channel *peer, const char *sound, int remain)
{
int min = 0, sec = 0, check;
check = ast_autoservice_start(peer);
if (check)
if (check)
return;
if (remain > 0) {
@ -3314,7 +3293,7 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct
to = -1;
who = ast_waitfor_n(cs, 2, &to);
if (!who) {
ast_log(LOG_DEBUG, "Nobody there, continuing...\n");
ast_log(LOG_DEBUG, "Nobody there, continuing...\n");
if (c0->_softhangup == AST_SOFTHANGUP_UNBRIDGE || c1->_softhangup == AST_SOFTHANGUP_UNBRIDGE) {
if (c0->_softhangup == AST_SOFTHANGUP_UNBRIDGE)
c0->_softhangup = 0;
@ -3348,7 +3327,7 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct
}
if ((f->frametype == AST_FRAME_VOICE) ||
(f->frametype == AST_FRAME_DTMF) ||
(f->frametype == AST_FRAME_VIDEO) ||
(f->frametype == AST_FRAME_VIDEO) ||
(f->frametype == AST_FRAME_IMAGE) ||
(f->frametype == AST_FRAME_HTML) ||
#if defined(T38_SUPPORT)
@ -3369,7 +3348,7 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct
} else {
#if 0
ast_log(LOG_DEBUG, "Read from %s\n", who->name);
if (who == last)
if (who == last)
ast_log(LOG_DEBUG, "Servicing channel %s twice in a row?\n", last->name);
last = who;
#endif
@ -3389,7 +3368,7 @@ tackygoto:
/*! \brief Bridge two channels together */
enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_channel *c1,
struct ast_bridge_config *config, struct ast_frame **fo, struct ast_channel **rc)
struct ast_bridge_config *config, struct ast_frame **fo, struct ast_channel **rc)
{
struct ast_channel *who = NULL;
enum ast_bridge_result res = AST_BRIDGE_COMPLETE;
@ -3404,19 +3383,19 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
int to;
if (c0->_bridge) {
ast_log(LOG_WARNING, "%s is already in a bridge with %s\n",
ast_log(LOG_WARNING, "%s is already in a bridge with %s\n",
c0->name, c0->_bridge->name);
return -1;
}
if (c1->_bridge) {
ast_log(LOG_WARNING, "%s is already in a bridge with %s\n",
ast_log(LOG_WARNING, "%s is already in a bridge with %s\n",
c1->name, c1->_bridge->name);
return -1;
}
/* Stop if we're a zombie or need a soft hangup */
if (ast_test_flag(c0, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c0) ||
ast_test_flag(c1, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c1))
ast_test_flag(c1, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c1))
return -1;
*fo = NULL;
@ -3441,7 +3420,7 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
c0->_bridge = c1;
c1->_bridge = c0;
manager_event(EVENT_FLAG_CALL, "Link",
manager_event(EVENT_FLAG_CALL, "Link",
"Channel1: %s\r\n"
"Channel2: %s\r\n"
"Uniqueid1: %s\r\n"
@ -3449,7 +3428,7 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
"CallerID1: %s\r\n"
"CallerID2: %s\r\n",
c0->name, c1->name, c0->uniqueid, c1->uniqueid, c0->cid.cid_num, c1->cid.cid_num);
o0nativeformats = c0->nativeformats;
o1nativeformats = c1->nativeformats;
@ -3477,7 +3456,7 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
if (callee_warning && config->end_sound)
bridge_playfile(c1, c0, config->end_sound, 0);
*fo = NULL;
if (who)
if (who)
*rc = who;
res = 0;
break;
@ -3536,7 +3515,7 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
ast_set_flag(c0, AST_FLAG_NBRIDGE);
ast_set_flag(c1, AST_FLAG_NBRIDGE);
if ((res = c0->tech->bridge(c0, c1, config->flags, fo, rc, to)) == AST_BRIDGE_COMPLETE) {
manager_event(EVENT_FLAG_CALL, "Unlink",
manager_event(EVENT_FLAG_CALL, "Unlink",
"Channel1: %s\r\n"
"Channel2: %s\r\n"
"Uniqueid1: %s\r\n"
@ -3692,7 +3671,7 @@ static int tonepair_generator(struct ast_channel *chan, void *data, int len, int
struct tonepair_state *ts = data;
int x;
/* we need to prepare a frame with 16 * timelen samples as we're
/* we need to prepare a frame with 16 * timelen samples as we're
* generating SLIN audio
*/
len = samples * 2;
@ -3736,10 +3715,7 @@ int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int durat
d.freq1 = freq1;
d.freq2 = freq2;
d.duration = duration;
if (vol < 1)
d.vol = 8192;
else
d.vol = vol;
d.vol = (vol < 1) ? 8192 : vol; /* force invalid to 8192 */
if (ast_activate_generator(chan, &tonepair, &d))
return -1;
return 0;
@ -3752,15 +3728,14 @@ void ast_tonepair_stop(struct ast_channel *chan)
int ast_tonepair(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
{
struct ast_frame *f;
int res;
if ((res = ast_tonepair_start(chan, freq1, freq2, duration, vol)))
return res;
/* Give us some wiggle room */
while (chan->generatordata && (ast_waitfor(chan, 100) >= 0)) {
f = ast_read(chan);
while (chan->generatordata && ast_waitfor(chan, 100) >= 0) {
struct ast_frame *f = ast_read(chan);
if (f)
ast_frfree(f);
else
@ -3814,7 +3789,7 @@ void ast_install_music_functions(int (*start_ptr)(struct ast_channel *, const ch
ast_moh_cleanup_ptr = cleanup_ptr;
}
void ast_uninstall_music_functions(void)
void ast_uninstall_music_functions(void)
{
ast_moh_start_ptr = NULL;
ast_moh_stop_ptr = NULL;
@ -3822,7 +3797,7 @@ void ast_uninstall_music_functions(void)
}
/*! \brief Turn on music on hold on a given channel */
int ast_moh_start(struct ast_channel *chan, const char *mclass)
int ast_moh_start(struct ast_channel *chan, const char *mclass)
{
if (ast_moh_start_ptr)
return ast_moh_start_ptr(chan, mclass);
@ -3834,13 +3809,13 @@ int ast_moh_start(struct ast_channel *chan, const char *mclass)
}
/*! \brief Turn off music on hold on a given channel */
void ast_moh_stop(struct ast_channel *chan)
void ast_moh_stop(struct ast_channel *chan)
{
if (ast_moh_stop_ptr)
ast_moh_stop_ptr(chan);
}
void ast_moh_cleanup(struct ast_channel *chan)
void ast_moh_cleanup(struct ast_channel *chan)
{
if (ast_moh_cleanup_ptr)
ast_moh_cleanup_ptr(chan);
@ -3853,7 +3828,7 @@ void ast_channels_init(void)
}
/*! \brief Print call group and pickup group ---*/
char *ast_print_group(char *buf, int buflen, ast_group_t group)
char *ast_print_group(char *buf, int buflen, ast_group_t group)
{
unsigned int i;
int first=1;
@ -4030,37 +4005,23 @@ static void silence_generator_release(struct ast_channel *chan, void *data)
/* nothing to do */
}
static int silence_generator_generate(struct ast_channel *chan, void *data, int len, int samples)
static int silence_generator_generate(struct ast_channel *chan, void *data, int len, int samples)
{
if (samples == 160) {
short buf[160] = { 0, };
struct ast_frame frame = {
.frametype = AST_FRAME_VOICE,
.subclass = AST_FORMAT_SLINEAR,
.data = buf,
.samples = 160,
.datalen = sizeof(buf),
};
short buf[samples];
int x;
struct ast_frame frame = {
.frametype = AST_FRAME_VOICE,
.subclass = AST_FORMAT_SLINEAR,
.data = buf,
.samples = samples,
.datalen = sizeof(buf),
};
if (ast_write(chan, &frame))
return -1;
} else {
short buf[samples];
int x;
struct ast_frame frame = {
.frametype = AST_FRAME_VOICE,
.subclass = AST_FORMAT_SLINEAR,
.data = buf,
.samples = samples,
.datalen = sizeof(buf),
};
for (x = 0; x < samples; x++)
buf[x] = 0;
for (x = 0; x < samples; x++)
buf[x] = 0;
if (ast_write(chan, &frame))
return -1;
}
if (ast_write(chan, &frame))
return -1;
return 0;
}
@ -4068,7 +4029,7 @@ static int silence_generator_generate(struct ast_channel *chan, void *data, int
static struct ast_generator silence_generator = {
.alloc = silence_generator_alloc,
.release = silence_generator_release,
.generate = silence_generator_generate,
.generate = silence_generator_generate,
};
struct ast_silence_generator {
@ -4117,16 +4078,19 @@ void ast_channel_stop_silence_generator(struct ast_channel *chan, struct ast_sil
/*! \ brief Convert channel reloadreason (ENUM) to text string for manager event */
const char *channelreloadreason2txt(enum channelreloadreason reason) {
const char *channelreloadreason2txt(enum channelreloadreason reason)
{
switch (reason) {
case CHANNEL_MODULE_LOAD: return "LOAD (Channel module load)";
break;
case CHANNEL_MODULE_RELOAD: return "RELOAD (Channel module reload)";
break;
case CHANNEL_CLI_RELOAD: return "CLIRELOAD (Channel module reload by CLI command)";
break;
default: return "MANAGERRELOAD (Channel module reload by manager)";
break;
case CHANNEL_MODULE_LOAD:
return "LOAD (Channel module load)";
case CHANNEL_MODULE_RELOAD:
return "RELOAD (Channel module reload)";
case CHANNEL_CLI_RELOAD:
return "CLIRELOAD (Channel module reload by CLI command)";
default:
return "MANAGERRELOAD (Channel module reload by manager)";
}
};