From b81f233e68e71d4601b932eb8b51b32b4312f231 Mon Sep 17 00:00:00 2001 From: Matthew Fredrickson <creslin@digium.com> Date: Fri, 1 Apr 2005 17:00:50 +0000 Subject: [PATCH] Merging in xylome's beaerer capabilty patch (bug 3547) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5342 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/Makefile | 2 +- apps/app_dial.c | 8 +++--- channel.c | 20 +++++++++++++++ channels/chan_zap.c | 49 +++++++++---------------------------- include/asterisk/channel.h | 15 +++++++++++- include/asterisk/transcap.h | 33 +++++++++++++++++++++++++ 6 files changed, 84 insertions(+), 43 deletions(-) create mode 100755 include/asterisk/transcap.h diff --git a/apps/Makefile b/apps/Makefile index 0feec316d5..2f6a875dcb 100755 --- a/apps/Makefile +++ b/apps/Makefile @@ -31,7 +31,7 @@ APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_mp3.so\ app_talkdetect.so app_alarmreceiver.so app_userevent.so app_verbose.so \ app_test.so app_forkcdr.so app_math.so app_realtime.so \ app_dumpchan.so app_waitforsilence.so app_while.so app_setrdnis.so \ - app_md5.so app_readfile.so app_chanspy.so + app_md5.so app_readfile.so app_chanspy.so app_settransfercapability.so ifneq (${OSARCH},Darwin) ifneq (${OSARCH},SunOS) diff --git a/apps/app_dial.c b/apps/app_dial.c index 9ee512ca55..9f7dedbdda 100755 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -77,8 +77,8 @@ static char *descrip = " 'r' -- indicate ringing to the calling party, pass no audio until answered.\n" " 'm[(class)]' -- provide hold music to the calling party until answered (optionally\n" " with the specified class.\n" -" 'M(x[^arg]) -- Executes the macro (x with ^ delim arg list) upon connect of the call.\n" -" Also, the macro can set the MACRO_RESULT variable to do the following:\n" +" 'M(x[^arg])' -- Executes the macro (x with ^ delim arg list) upon connect of the call.\n" +" Also, the macro can set the MACRO_RESULT variable to do the following:\n" " -- ABORT - Hangup both legs of the call.\n" " -- CONGESTION - Behave as if line congestion was encountered.\n" " -- BUSY - Behave as if a busy signal was encountered. (n+101)\n" @@ -1039,8 +1039,8 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags tmp->chan->cid.cid_tns = chan->cid.cid_tns; /* Presense of ADSI CPE on outgoing channel follows ours */ tmp->chan->adsicpe = chan->adsicpe; - /* pass the digital flag */ - ast_copy_flags(tmp->chan, chan, AST_FLAG_DIGITAL); + /* Pass the transfer capability */ + tmp->chan->transfercapability = chan->transfercapability; /* If we have an outbound group, set this peer channel to it */ if (outbound_group) diff --git a/channel.c b/channel.c index e621aec5e1..460d1b7814 100755 --- a/channel.c +++ b/channel.c @@ -39,6 +39,7 @@ #include <asterisk/utils.h> #include <asterisk/lock.h> #include <asterisk/app.h> +#include <asterisk/transcap.h> #ifdef ZAPTEL_OPTIMIZATIONS #include <sys/ioctl.h> #ifdef __linux__ @@ -243,6 +244,25 @@ char *ast_state2str(int state) } } +char *ast_transfercapability2str(int transfercapability) +{ + switch(transfercapability) { + case AST_TRANS_CAP_SPEECH: + return "SPEECH"; + case AST_TRANS_CAP_DIGITAL: + return "DIGITAL"; + case AST_TRANS_CAP_RESTRICTED_DIGITAL: + return "RESTRICTED_DIGITAL"; + case AST_TRANS_CAP_3_1K_AUDIO: + return "3K1AUDIO"; + case AST_TRANS_CAP_DIGITAL_W_TONES: + return "DIGITAL_W_TONES"; + case AST_TRANS_CAP_VIDEO: + return "VIDEO"; + default: + return "UNKNOWN"; + } +} int ast_best_codec(int fmts) { diff --git a/channels/chan_zap.c b/channels/chan_zap.c index c68f0ff488..8eb891141b 100755 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -38,6 +38,7 @@ #include <asterisk/causes.h> #include <asterisk/term.h> #include <asterisk/utils.h> +#include <asterisk/transcap.h> #include <sys/signal.h> #include <errno.h> #include <stdlib.h> @@ -1866,13 +1867,15 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout) ast_log(LOG_DEBUG, "I'm being setup with no bearer right now...\n"); pri_set_crv(p->pri->pri, p->call, p->channel, 0); } - p->digital = ast_test_flag(ast,AST_FLAG_DIGITAL); + p->digital = IS_DIGITAL(ast->transfercapability); pri_sr_set_channel(sr, p->bearer ? PVT_TO_CHANNEL(p->bearer) : PVT_TO_CHANNEL(p), p->pri->nodetype == PRI_NETWORK ? 0 : 1, 1); - pri_sr_set_bearer(sr, p->digital ? PRI_TRANS_CAP_DIGITAL : PRI_TRANS_CAP_SPEECH, + pri_sr_set_bearer(sr, p->digital ? PRI_TRANS_CAP_DIGITAL : ast->transfercapability, (p->digital ? -1 : ((p->law == ZT_LAW_ALAW) ? PRI_LAYER_1_ALAW : PRI_LAYER_1_ULAW))); - dp_strip = 0; + if (option_verbose > 2) + ast_verbose(VERBOSE_PREFIX_3 "Requested transfer capability: 0x%.2x - %s\n", ast->transfercapability, ast_transfercapability2str(ast->transfercapability)); + dp_strip = 0; pridialplan = p->pri->dialplan - 1; if (pridialplan == -2) { /* compute dynamically */ if (strncmp(c + p->stripmsd, p->pri->internationalprefix, strlen(p->pri->internationalprefix)) == 0) { @@ -4604,35 +4607,7 @@ static int zt_indicate(struct ast_channel *chan, int condition) return res; } -#ifdef ZAPATA_PRI -static void set_calltype(struct ast_channel *chan, int ctype) -{ - char *s = "UNKNOWN"; - switch(ctype) { - case PRI_TRANS_CAP_SPEECH: - s = "SPEECH"; - break; - case PRI_TRANS_CAP_DIGITAL: - s = "DIGITAL"; - break; - case PRI_TRANS_CAP_RESTRICTED_DIGITAL: - s = "RESTRICTED_DIGITAL"; - break; - case PRI_TRANS_CAP_3_1K_AUDIO: - s = "31KAUDIO"; - break; - case PRI_TRANS_CAP_7K_AUDIO: - s = "7KAUDIO"; - break; - case PRI_TRANS_CAP_VIDEO: - s = "VIDEO"; - break; - } - pbx_builtin_setvar_helper(chan, "CALLTYPE", s); -} -#endif - -static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int index, int law, int ctype) +static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int index, int law, int transfercapability) { struct ast_channel *tmp; int deflaw; @@ -4764,14 +4739,14 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int tmp->cid.cid_pres = i->callingpres; tmp->cid.cid_ton = i->cid_ton; #ifdef ZAPATA_PRI - set_calltype(tmp, ctype); + tmp->transfercapability = transfercapability; + pbx_builtin_setvar_helper(tmp, "TRANSFERCAPABILITY", ast_transfercapability2str(transfercapability)); + if (transfercapability & PRI_TRANS_CAP_DIGITAL) { + i->digital = 1; + } /* Assume calls are not idle calls unless we're told differently */ i->isidlecall = 0; i->alreadyhungup = 0; - if (ctype & PRI_TRANS_CAP_DIGITAL) { - i->digital = 1; - ast_set_flag(tmp, AST_FLAG_DIGITAL); - } #endif /* clear the fake event in case we posted one before we had ast_chanenl */ i->fake_event = 0; diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index 92c5000313..4d121bb69e 100755 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -315,6 +315,9 @@ struct ast_channel { /*! channel flags of AST_FLAG_ type */ unsigned int flags; + /* ISDN Transfer Capbility - AST_FLAG_DIGITAL is not enough */ + unsigned short transfercapability; + struct ast_frame *readq; int alertpipe[2]; /*! Write translation path */ @@ -338,7 +341,8 @@ struct ast_channel { /* Channels have this property if they can accept input with jitter; i.e. most VoIP channels */ #define AST_CHAN_TP_WANTSJITTER (1 << 0) -#define AST_FLAG_DIGITAL (1 << 0) /* if the call is a digital ISDN call */ +/* This flag has been deprecated by the transfercapbilty data member in struct ast_channel */ +/* #define AST_FLAG_DIGITAL (1 << 0) */ /* if the call is a digital ISDN call */ #define AST_FLAG_DEFER_DTMF (1 << 1) /* if dtmf should be deferred */ #define AST_FLAG_WRITE_INT (1 << 2) /* if write should be interrupt generator */ #define AST_FLAG_BLOCKING (1 << 3) /* if we are blocking */ @@ -811,6 +815,15 @@ int ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clo */ char *ast_state2str(int state); +/*! Gives the string form of a given transfer capability */ +/*! + * \param transercapability transfercapabilty to get the name of + * Give a name to a transfercapbility + * See above + * Returns the text form of the binary transfer capbility + */ +char *ast_transfercapability2str(int transfercapability); + /* Options: Some low-level drivers may implement "options" allowing fine tuning of the low level channel. See frame.h for options. Note that many channel drivers may support none or a subset of those features, and you should not count on this if you want your diff --git a/include/asterisk/transcap.h b/include/asterisk/transcap.h new file mode 100755 index 0000000000..1a77dd1ec8 --- /dev/null +++ b/include/asterisk/transcap.h @@ -0,0 +1,33 @@ +/* + * Asterisk -- A telephony toolkit for Linux. + * + * General Asterisk channel definitions. + * + * Copyright (C) 1999 - 2005, Digium, Inc. + * + * Matthew Fredrickson <creslin@digium.com> + * + * This program is free software, distributed under the terms of + * the GNU General Public License + */ + +#ifndef _ASTERISK_TRANSCAP_H +#define _ASTERISK_TRANSCAP_H + +/* These definitions are taken directly out of libpri.h and used here. + * DO NOT change them as it will cause unexpected behavior in channels + * that utilize these fields. + */ + +#define AST_TRANS_CAP_SPEECH 0x0 +#define AST_TRANS_CAP_DIGITAL 0x08 +#define AST_TRANS_CAP_RESTRICTED_DIGITAL 0x09 +#define AST_TRANS_CAP_3_1K_AUDIO 0x10 +#define AST_TRANS_CAP_7K_AUDIO 0x11 /* Depriciated ITU Q.931 (05/1998)*/ +#define AST_TRANS_CAP_DIGITAL_W_TONES 0x11 +#define AST_TRANS_CAP_VIDEO 0x18 + +#define IS_DIGITAL(cap)\ + (cap) & AST_TRANS_CAP_DIGITAL ? 1 : 0 + +#endif /* _ASTERISK_TRANSCAP_H */ -- GitLab