From a054dff7ae8c6e588fb2915fe2aebf3954dee31d Mon Sep 17 00:00:00 2001 From: MelwareDE Date: Sun, 15 Jan 2017 17:12:14 +0000 Subject: [PATCH] Added patch to support Asterisk 13 from Michael Kuron. --- CHANGES | 1 + chan_capi.c | 153 +++++++++++++++++++++++++++++++---- chan_capi.h | 12 ++- chan_capi_fmt.h | 165 +++++++++++++++++++++++++------------- chan_capi_qsig_core.c | 5 ++ chan_capi_supplementary.c | 7 ++ chan_capi_utils.c | 4 + create_config.sh | 17 ++++ 8 files changed, 292 insertions(+), 72 deletions(-) diff --git a/CHANGES b/CHANGES index 03ceca7..5afff2f 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,7 @@ HEAD - check for bchannel information element on incoming call - added 't' option to select in-band tones available indication as Q.931 (thanks to Maciej S. Szmigiero ) +- support for Asterisk 13 (thanks to Michael Kuron ) chan_capi-1.1.6 diff --git a/chan_capi.c b/chan_capi.c index 85feab9..46948ce 100644 --- a/chan_capi.c +++ b/chan_capi.c @@ -42,6 +42,11 @@ #ifdef CC_AST_HAS_VERSION_1_8 #include #endif +#ifdef CC_AST_HAS_VERSION_13_0 +#include "asterisk/smoother.h" +#include "asterisk/pickup.h" +#include "asterisk/features_config.h" +#endif struct _diva_streaming_vector* vind; #ifdef DIVA_STREAMING #include "platform.h" @@ -1120,7 +1125,13 @@ static int pbx_capi_alert(struct ast_channel *c) } i->state = CAPI_STATE_ALERTING; +#ifdef CC_AST_HAS_VERSION_13_0 + ast_channel_lock(c); +#endif ast_setstate(c, AST_STATE_RING); +#ifdef CC_AST_HAS_VERSION_13_0 + ast_channel_unlock(c); +#endif return 0; } @@ -1459,7 +1470,13 @@ static int pbx_capi_hangup(struct ast_channel *c) cc_mutex_unlock(&i->lock); +#ifdef CC_AST_HAS_VERSION_13_0 + ast_channel_lock(c); +#endif ast_setstate(c, AST_STATE_DOWN); +#ifdef CC_AST_HAS_VERSION_13_0 + ast_channel_unlock(c); +#endif #ifdef CC_AST_HAS_VERSION_1_4 ast_atomic_fetchadd_int(&usecnt, -1); @@ -2180,6 +2197,7 @@ static int line_interconnect(struct capi_pvt *i0, struct capi_pvt *i1, int start /* * try call transfer instead of bridge */ +#ifndef CC_AST_HAS_VERSION_13_0 static int pbx_capi_bridge_transfer( struct ast_channel *c0, struct ast_channel *c1, @@ -2314,6 +2332,7 @@ static int pbx_capi_bridge_transfer( return ret; } +#endif /* * activate / deactivate b-channel bridge @@ -2360,6 +2379,7 @@ static int capi_bridge(int start, struct capi_pvt *i0, struct capi_pvt *i1, int /* * native bridging / line interconnect */ +#ifndef CC_AST_HAS_VERSION_13_0 static CC_BRIDGE_RETURN pbx_capi_bridge( struct ast_channel *c0, struct ast_channel *c1, @@ -2451,11 +2471,16 @@ static CC_BRIDGE_RETURN pbx_capi_bridge( return ret; } +#endif /* * a new channel is needed */ +#ifdef CC_AST_HAS_VERSION_13_0 +static struct ast_channel *capi_new(struct capi_pvt *i, int state, const struct ast_channel *requestor) +#else static struct ast_channel *capi_new(struct capi_pvt *i, int state, const char *linkedid) +#endif { struct ast_channel *tmp; int fmt; @@ -2464,6 +2489,9 @@ static struct ast_channel *capi_new(struct capi_pvt *i, int state, const char *l tmp = ast_channel_alloc(0, state, i->cid, emptyid, #ifdef CC_AST_HAS_EXT2_CHAN_ALLOC i->accountcode, i->dnid, i->context, +#ifdef CC_AST_HAS_VERSION_13_0 + NULL, requestor, +#endif #ifdef CC_AST_HAS_LINKEDID_CHAN_ALLOC linkedid, #endif @@ -2605,10 +2633,17 @@ static struct ast_channel *capi_new(struct capi_pvt *i, int state, const char *l struct ast_format_cap *cur_nativefmts = tmp->nativeformats; #endif /* defined(CC_AST_HAS_VERSION_11_0) */ +#ifdef CC_AST_HAS_VERSION_13_0 + struct ast_str *format_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN); +#endif + cc_verbose(3, 1, VERBOSE_PREFIX_2 "%s: setting format %s - %s%s\n", i->vname, cc_getformatname(fmt), - ast_getformatname_multiple(alloca(80), 80, - cur_nativefmts), +#ifdef CC_AST_HAS_VERSION_13_0 + ast_format_cap_get_names(cur_nativefmts, &format_buf), +#else + ast_getformatname_multiple(alloca(80), 80, cur_nativefmts), +#endif (i->bproto == CC_BPROTO_VOCODER) ? "VOCODER" : ((i->rtp) ? " (RTP)" : "")); if (!ast_strlen_zero(i->cid)) { @@ -2690,6 +2725,10 @@ static struct ast_channel *capi_new(struct capi_pvt *i, int state, const char *l ast_setstate(tmp, state); #endif +#ifdef CC_AST_HAS_VERSION_13_0 + ast_channel_unlock(tmp); +#endif + return tmp; } @@ -2707,9 +2746,12 @@ pbx_capi_request(const char *type, int format, const struct ast_channel *request #elif !defined(CC_AST_HAS_VERSION_11_0) /* } { */ static struct ast_channel * pbx_capi_request(const char *type, struct ast_format_cap *format, const struct ast_channel *requestor, void *data, int *cause) -#else /* } { */ +#elif !defined(CC_AST_HAS_VERSION_13_0) /* } { */ static struct ast_channel * pbx_capi_request(const char *type, struct ast_format_cap *format, const struct ast_channel *requestor, const char *data, int *cause) +#else /* } { */ +static struct ast_channel * +pbx_capi_request(const char *type, struct ast_format_cap *format, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause) #endif /* } */ #else /* } { */ @@ -2724,10 +2766,18 @@ pbx_capi_request(const char *type, int format, void *data, int *cause) ast_group_t capigroup = 0; unsigned int controller = 0; unsigned int ccbsnrhandle = 0; +#ifdef CC_AST_HAS_VERSION_13_0 + struct ast_str *format_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN); +#endif cc_verbose(1, 1, VERBOSE_PREFIX_4 "data = %s format=%s\n", (char *)data, - ast_getformatname_multiple(alloca(80), 80, format)); +#ifdef CC_AST_HAS_VERSION_13_0 + ast_format_cap_get_names(format, &format_buf) +#else + ast_getformatname_multiple(alloca(80), 80, format) +#endif + ); cc_copy_string(buffer, (char *)data, sizeof(buffer)); capi_parse_dialstring(buffer, &interface, &dest, ¶m, &ocid); @@ -2814,11 +2864,13 @@ found_best_channel: cc_mutex_unlock(&iflock); tmp = capi_new(i, AST_STATE_RESERVED, #ifdef CC_AST_HAS_REQUEST_REQUESTOR -#ifdef CC_AST_HAS_VERSION_11_0 +#ifdef CC_AST_HAS_VERSION_13_0 + requestor +#elif defined(CC_AST_HAS_VERSION_11_0) requestor ? ast_channel_linkedid(requestor) : NULL -#else /* !defined(CC_AST_HAS_VERSION_11_0) */ +#else /* !defined(CC_AST_HAS_VERSION_13_0) */ requestor ? requestor->linkedid : NULL -#endif /* defined(CC_AST_HAS_VERSION_11_0) */ +#endif /* defined(CC_AST_HAS_REQUEST_REQUESTOR) */ #else NULL #endif @@ -3867,7 +3919,6 @@ static int search_did(struct ast_channel *c) #ifdef CC_AST_HAS_VERSION_11_0 const char *cur_context = ast_channel_context(c); - char *cur_exten = (char*)ast_channel_exten(c); const char *cur_name = ast_channel_name(c); #else /* !defined(CC_AST_HAS_VERSION_11_0) */ const char *cur_context = c->context; @@ -3981,7 +4032,6 @@ static void start_pbx_on_match(struct capi_pvt *i, unsigned int PLCI, _cword Mes #ifdef CC_AST_HAS_VERSION_11_0 const char *cur_name = ast_channel_name(c); - char *cur_exten = (char *)ast_channel_exten(c); #else /* !defined(CC_AST_HAS_VERSION_11_0) */ const char *cur_name = c->name; char *cur_exten = (char *)c->exten; @@ -3998,7 +4048,15 @@ static void start_pbx_on_match(struct capi_pvt *i, unsigned int PLCI, _cword Mes } /* check for internal pickup extension first */ +#ifdef CC_AST_HAS_VERSION_13_0 + RAII_VAR(struct ast_features_pickup_config *, pickup_cfg, NULL, ao2_cleanup); + const char *pickupexten; + pickup_cfg = ast_get_chan_features_pickup_config(c); + pickupexten = ast_strdupa(pickup_cfg->pickupexten); + if (!strcmp(i->dnid, pickupexten)) { +#else if (!strcmp(i->dnid, ast_pickup_ext())) { +#endif i->isdnstate |= CAPI_ISDN_STATE_PBX; cc_verbose(3, 1, VERBOSE_PREFIX_2 "%s: Pickup extension '%s' found.\n", i->vname, i->dnid); @@ -4015,7 +4073,13 @@ static void start_pbx_on_match(struct capi_pvt *i, unsigned int PLCI, _cword Mes switch(search_did(c)) { case 0: /* match */ i->isdnstate |= CAPI_ISDN_STATE_PBX; +#ifdef CC_AST_HAS_VERSION_13_0 + ast_channel_lock(c); +#endif ast_setstate(c, AST_STATE_RING); +#ifdef CC_AST_HAS_VERSION_13_0 + ast_channel_unlock(c); +#endif if (ast_pbx_start(c)) { cc_log(LOG_ERROR, "%s: Unable to start pbx on channel!\n", i->vname); @@ -4413,7 +4477,11 @@ static void capidev_handle_info_indication(_cmsg *CMSG, unsigned int PLCI, unsig redirecting.from.number.presentation = 0; redirecting.from.tag = 0; +#ifdef CC_AST_HAS_VERSION_13_0 + redirecting.reason.code = AST_REDIRECTING_REASON_UNKNOWN; +#else redirecting.reason = AST_REDIRECTING_REASON_UNKNOWN; +#endif redirecting.count = 1; ast_channel_set_redirecting(i->owner, &redirecting, &update_redirecting); @@ -4468,7 +4536,15 @@ static void capidev_handle_info_indication(_cmsg *CMSG, unsigned int PLCI, unsig FRAME_SUBCLASS_INTEGER(fr.subclass) = AST_CONTROL_RINGING; local_queue_frame(i, &fr); if (i->owner) + { +#ifdef CC_AST_HAS_VERSION_13_0 + ast_channel_lock(i->owner); +#endif ast_setstate(i->owner, AST_STATE_RINGING); +#ifdef CC_AST_HAS_VERSION_13_0 + ast_channel_unlock(i->owner); +#endif + } break; case 0x8002: /* CALL PROCEEDING */ @@ -5263,7 +5339,14 @@ static void capidev_handle_connect_active_indication(_cmsg *CMSG, unsigned int P } if ((i->owner) && (i->FaxState & CAPI_FAX_STATE_ACTIVE)) { +#ifdef CC_AST_HAS_VERSION_13_0 + ast_channel_lock(i->owner); +#endif ast_setstate(i->owner, AST_STATE_UP); +#ifdef CC_AST_HAS_VERSION_13_0 + ast_channel_unlock(i->owner); +#endif +#ifndef CC_AST_HAS_VERSION_13_0 #ifdef CC_AST_HAS_VERSION_11_0 struct ast_cdr *owner_cdr = ast_channel_cdr(i->owner); #else /* !defined(CC_AST_HAS_VERSION_11_0) */ @@ -5271,6 +5354,7 @@ static void capidev_handle_connect_active_indication(_cmsg *CMSG, unsigned int P #endif /* defined(CC_AST_HAS_VERSION_11_0) */ if (owner_cdr) ast_cdr_answer(owner_cdr); +#endif return; } @@ -8609,7 +8693,9 @@ struct ast_channel_tech capi_tech = { .answer = pbx_capi_answer, .read = pbx_capi_read, .write = pbx_capi_write, +#ifndef CC_AST_HAS_VERSION_13_0 .bridge = pbx_capi_bridge, +#endif .exception = NULL, .indicate = pbx_capi_indicate, .fixup = pbx_capi_fixup, @@ -8867,7 +8953,11 @@ static int conf_interface(struct cc_capi_conf *conf, struct ast_variable *v) char faxdest[AST_MAX_EXTENSION+1]; char *p, *q; #ifdef CC_AST_HAS_VERSION_10_0 +#ifdef CC_AST_HAS_VERSION_13_0 + struct ast_format_cap *cap = ast_format_cap_alloc (AST_FORMAT_CAP_FLAG_DEFAULT); +#else struct ast_format_cap *cap = ast_format_cap_alloc (); +#endif #endif memset(faxdest, 0, sizeof(faxdest)); @@ -8972,7 +9062,11 @@ static int conf_interface(struct cc_capi_conf *conf, struct ast_variable *v) continue; } else if (!strcasecmp(v->name, "amaflags")) { +#ifdef CC_AST_HAS_VERSION_13_0 + y = ast_channel_string2amaflag(v->value); +#else y = ast_cdr_amaflags2int(v->value); +#endif if (y < 0) { ast_log(LOG_WARNING, "Invalid AMA flags: %s at line %d\n", v->value, v->lineno); @@ -9066,10 +9160,18 @@ static int conf_interface(struct cc_capi_conf *conf, struct ast_variable *v) v->value); } else if (!strcasecmp(v->name, "allow")) { +#ifdef CC_AST_HAS_VERSION_13_0 + cc_parse_allow_disallow(conf->capability, v->value, 1, cap); +#else cc_parse_allow_disallow(&conf->prefs, &conf->capability, v->value, 1, cap); +#endif } else if (!strcasecmp(v->name, "disallow")) { +#ifdef CC_AST_HAS_VERSION_13_0 + cc_parse_allow_disallow(conf->capability, v->value, 0, cap); +#else cc_parse_allow_disallow(&conf->prefs, &conf->capability, v->value, 0, cap); +#endif } cc_pbx_qsig_conf_interface_value(conf, v); } @@ -9096,7 +9198,9 @@ static int conf_interface(struct cc_capi_conf *conf, struct ast_variable *v) if (faxpriority < 1) faxpriority = 1; conf->faxpriority = faxpriority; -#ifdef CC_AST_HAS_VERSION_10_0 +#ifdef CC_AST_HAS_VERSION_13_0 + ao2_ref(cap, -1); +#elif defined(CC_AST_HAS_VERSION_10_0) ast_format_cap_destroy(cap); #endif @@ -9281,7 +9385,9 @@ int unload_module(void) diva_verbose_unload(); -#ifdef CC_AST_HAS_VERSION_10_0 +#ifdef CC_AST_HAS_VERSION_13_0 + ao2_ref(capi_tech.capabilities, -1); +#elif defined(CC_AST_HAS_VERSION_10_0) capi_tech.capabilities = ast_format_cap_destroy(capi_tech.capabilities); #endif @@ -9307,14 +9413,23 @@ int load_module(void) #endif #ifdef CC_AST_HAS_VERSION_10_0 +#ifdef CC_AST_HAS_VERSION_13_0 + if (!(capi_tech.capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) { +#else if (!(capi_tech.capabilities = ast_format_cap_alloc())) { +#endif return AST_MODULE_LOAD_DECLINE; } else { +#ifdef CC_AST_HAS_VERSION_13_0 + struct ast_format * fmt = ast_format_alaw; + ast_format_cap_append(capi_tech.capabilities, fmt, 0); +#else struct ast_format fmt; ast_format_clear(&fmt); ast_format_set(&fmt, AST_FORMAT_ALAW, 0); ast_format_cap_add(capi_tech.capabilities, &fmt); +#endif } #endif @@ -9334,7 +9449,9 @@ int load_module(void) if (!cfg) { cc_log(LOG_ERROR, "Unable to load config %s, chan_capi disabled\n", config); diva_verbose_unload(); -#ifdef CC_AST_HAS_VERSION_10_0 +#ifdef CC_AST_HAS_VERSION_13_0 + ao2_ref(capi_tech.capabilities, -1); +#elif defined(CC_AST_HAS_VERSION_10_0) capi_tech.capabilities = ast_format_cap_destroy(capi_tech.capabilities); #endif return 0; @@ -9343,7 +9460,9 @@ int load_module(void) if (cc_mutex_lock(&iflock)) { cc_log(LOG_ERROR, "Unable to lock interface list???\n"); diva_verbose_unload(); -#ifdef CC_AST_HAS_VERSION_10_0 +#ifdef CC_AST_HAS_VERSION_13_0 + ao2_ref(capi_tech.capabilities, -1); +#elif defined(CC_AST_HAS_VERSION_10_0) capi_tech.capabilities = ast_format_cap_destroy(capi_tech.capabilities); #endif return -1; @@ -9352,7 +9471,9 @@ int load_module(void) if ((res = cc_init_capi()) != 0) { cc_mutex_unlock(&iflock); diva_verbose_unload(); -#ifdef CC_AST_HAS_VERSION_10_0 +#ifdef CC_AST_HAS_VERSION_13_0 + ao2_ref(capi_tech.capabilities, -1); +#elif defined(CC_AST_HAS_VERSION_10_0) capi_tech.capabilities = ast_format_cap_destroy(capi_tech.capabilities); #endif return 0; @@ -9364,7 +9485,9 @@ int load_module(void) if (res != 0) { cc_mutex_unlock(&iflock); diva_verbose_unload(); -#ifdef CC_AST_HAS_VERSION_10_0 +#ifdef CC_AST_HAS_VERSION_13_0 + ao2_ref(capi_tech.capabilities, -1); +#elif defined(CC_AST_HAS_VERSION_10_0) capi_tech.capabilities = ast_format_cap_destroy(capi_tech.capabilities); #endif return(res); diff --git a/chan_capi.h b/chan_capi.h index e1f3ccd..114f682 100644 --- a/chan_capi.h +++ b/chan_capi.h @@ -43,6 +43,9 @@ #ifdef CC_AST_HAS_VERSION_1_4 #include "asterisk/abstract_jb.h" #endif +#ifdef CC_AST_HAS_VERSION_13_0 +#include +#endif #include "asterisk/musiconhold.h" #include "dlist.h" #include "chan_capi_fmt.h" @@ -149,15 +152,18 @@ static inline unsigned int read_capi_dword(const void *m) #define FRAME_DATA_PTR data #endif -#ifdef CC_AST_HAS_UNION_SUBCLASS_IN_FRAME +#if defined(CC_AST_HAS_UNION_SUBCLASS_IN_FRAME) || defined(CC_AST_HAS_VERSION_13_0) #define FRAME_SUBCLASS_INTEGER(x) x.integer #ifndef CC_AST_HAS_VERSION_10_0 #define SET_FRAME_SUBCLASS_CODEC(__a__,__b__) do {(__a__).codec = (__b__); }while(0) #define GET_FRAME_SUBCLASS_CODEC(__a__) (__a__).codec -#else +#elif !defined(CC_AST_HAS_VERSION_13_0) #define SET_FRAME_SUBCLASS_CODEC(__a__,__b__) do{ ast_format_from_old_bitfield(&(__a__).format, __b__); } while(0) #define GET_FRAME_SUBCLASS_CODEC(__a__) ast_format_to_old_bitfield(&(__a__).format) +#else +#define SET_FRAME_SUBCLASS_CODEC(__a__,__b__) do{ (__a__).format = ast_format_compatibility_bitfield2format(__b__); } while(0) +#define GET_FRAME_SUBCLASS_CODEC(__a__) ast_format_compatibility_format2bitfield((__a__).format) #endif #else @@ -648,7 +654,9 @@ struct cc_capi_conf { ast_group_t transfergroup; float rxgain; float txgain; +#ifndef CC_AST_HAS_VERSION_13_0 struct ast_codec_pref prefs; +#endif #ifdef CC_AST_HAS_FORMAT_T format_t capability; #else diff --git a/chan_capi_fmt.h b/chan_capi_fmt.h index 6765b7a..8f3a314 100644 --- a/chan_capi_fmt.h +++ b/chan_capi_fmt.h @@ -33,62 +33,29 @@ #define CC_FORMAT_SLINEAR16 (1ULL << 15) #define CC_FORMAT_ULAW (1ULL << 2) +#ifdef CC_AST_HAS_VERSION_13_0 +#include +#include +#endif + +#ifdef CC_AST_HAS_VERSION_13_0 +static inline struct ast_format * ccCodec2AstCodec(int ccCodec) +{ + return (ast_format_compatibility_bitfield2format(ccCodec)); +} +#else static inline enum ast_format_id ccCodec2AstCodec(int ccCodec) { -#if 0 - unsigned int ret; - - switch (ccCodec) { - case CC_FORMAT_ALAW: - ret = AST_FORMAT_ALAW; - break; - case CC_FORMAT_G722: - ret = AST_FORMAT_G722; - break; - case CC_FORMAT_G723_1: - ret = AST_FORMAT_G723_1; - break; - case CC_FORMAT_G726: - ret = AST_FORMAT_G726; - break; - case CC_FORMAT_G729A: - ret = AST_FORMAT_G729A; - break; - case CC_FORMAT_GSM: - ret = AST_FORMAT_GSM; - break; - case CC_FORMAT_ILBC: - ret = AST_FORMAT_ILBC; - break; - case CC_FORMAT_SIREN14: - ret = AST_FORMAT_SIREN14; - break; - case CC_FORMAT_SIREN7: - ret = AST_FORMAT_SIREN7; - break; - case CC_FORMAT_SLINEAR: - ret = AST_FORMAT_SLINEAR; - break; - case CC_FORMAT_SLINEAR16: - ret = AST_FORMAT_SLINEAR16; - break; - case CC_FORMAT_ULAW: - ret = AST_FORMAT_ULAW; - break; - - default: - ret = 0; - break; - } - - return ret; -#else return (ast_format_id_from_old_bitfield(ccCodec)); -#endif } +#endif static inline const char* cc_getformatname(int ccCodec) { +#ifdef CC_AST_HAS_VERSION_13_0 + struct ast_format * id = ccCodec2AstCodec (ccCodec); + return ast_format_get_name(id); +#else enum ast_format_id id = ccCodec2AstCodec (ccCodec); struct ast_format fmt; @@ -96,6 +63,7 @@ static inline const char* cc_getformatname(int ccCodec) ast_format_set(&fmt, id, 0); return ast_getformatname(&fmt); +#endif } static inline void cc_add_formats(struct ast_format_cap *fmts, unsigned int divaFormats) @@ -106,18 +74,36 @@ static inline void cc_add_formats(struct ast_format_cap *fmts, unsigned int diva unsigned int ccCodec = (1U << i); if ((divaFormats & ccCodec) != 0) { +#ifdef CC_AST_HAS_VERSION_13_0 + struct ast_format * id = ccCodec2AstCodec (ccCodec); + ast_format_cap_append(fmts, id, 0); +#else enum ast_format_id id = ccCodec2AstCodec (ccCodec); struct ast_format fmt; ast_format_clear(&fmt); ast_format_set(&fmt, id, 0); ast_format_cap_add(fmts, &fmt); +#endif } } } static inline int cc_set_best_codec(struct ast_channel *a) { +#ifdef CC_AST_HAS_VERSION_13_0 + struct ast_format * bestCodec; + + bestCodec = ast_format_cap_get_format(ast_channel_nativeformats(a), 0); + if (bestCodec == ast_format_none) { + bestCodec = ast_format_alaw; + } + + ast_set_read_format(a, bestCodec); + ast_set_write_format(a, bestCodec); + + return (int)ast_format_compatibility_format2bitfield(bestCodec); +#else struct ast_format bestCodec; ast_format_clear(&bestCodec); @@ -135,36 +121,98 @@ static inline int cc_set_best_codec(struct ast_channel *a) ast_format_copy(ast_channel_writeformat(a), &bestCodec); return (int)ast_format_to_old_bitfield(&bestCodec); +#endif } static inline void cc_set_read_format(struct ast_channel* a, int ccCodec) { +#ifdef CC_AST_HAS_VERSION_13_0 + struct ast_format * ccFmt; + + ccFmt = ccCodec2AstCodec(ccCodec); + + ast_set_read_format(a, ccFmt); +#else struct ast_format ccFmt; ast_format_clear(&ccFmt); ast_format_set(&ccFmt, ccCodec, 0); ast_set_read_format(a, &ccFmt); +#endif } static inline void cc_set_write_format(struct ast_channel* a, int ccCodec) { +#ifdef CC_AST_HAS_VERSION_13_0 + struct ast_format * ccFmt; + + ccFmt = ccCodec2AstCodec(ccCodec); + + ast_set_write_format(a, ccFmt); +#else struct ast_format ccFmt; ast_format_clear(&ccFmt); ast_format_set(&ccFmt, ccCodec, 0); ast_set_write_format(a, &ccFmt); +#endif } +#ifdef CC_AST_HAS_VERSION_13_0 +#define cc_parse_allow_disallow(__capability__, __value__, __allowing__, __cap__) do{\ + __capability__ = ast_format_cap_update_by_allow_disallow(__cap__, __value__, __allowing__);}while(0) + +static inline uint64_t cc_get_formats_as_bits(const struct ast_format_cap *cap) +{ + uint64_t bitfield = 0; + int x; + + for (x = 0; x < ast_format_cap_count(cap); x++) { + struct ast_format *format = ast_format_cap_get_format(cap, x); + bitfield |= ast_format_compatibility_format2bitfield(format); + ao2_ref(format, -1); + } + + return bitfield; +} + +#else #define cc_parse_allow_disallow(__prefs__, __capability__, __value__, __allowing__, __cap__) do{\ ast_parse_allow_disallow(__prefs__, __cap__, __value__, __allowing__); \ *(__capability__) = (int)ast_format_cap_to_old_bitfield(__cap__); }while(0) #define cc_get_formats_as_bits(__a__) (int)ast_format_cap_to_old_bitfield(__a__) +#endif static inline int cc_get_best_codec_as_bits(int src) { - struct ast_format_cap *dst = ast_format_cap_alloc_nolock(); int ret = 0; +#ifdef CC_AST_HAS_VERSION_13_0 + struct ast_format_cap *dst; + struct ast_format *bestCodec; + int bit; + + dst = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT); + + for (bit = 0; bit < 64; ++bit) { + uint64_t mask = (1ULL << bit); + + if (mask & src) { + struct ast_format *format; + + format = ast_format_compatibility_bitfield2format(mask); + if (format && ast_format_cap_append(dst, format, 0)) { + return 0; + } + } + } + + bestCodec = ast_format_cap_get_format(dst, 0); + ao2_ref(dst, -1); + + ret = (int)ast_format_compatibility_format2bitfield(bestCodec); +#else + struct ast_format_cap *dst = ast_format_cap_alloc_nolock(); if (dst != 0) { struct ast_format bestCodec; @@ -177,26 +225,33 @@ static inline int cc_get_best_codec_as_bits(int src) ast_format_cap_destroy(dst); } +#endif return (ret); } -#define cc_set_read_format(__a__, __b__) ast_set_read_format_by_id(__a__, ccCodec2AstCodec (__b__)) - -#define cc_set_write_format(__a__, __b__) ast_set_write_format_by_id(__a__, ccCodec2AstCodec (__b__)) - static inline int cc_getformatbyname(const char* value) { +#ifdef CC_AST_HAS_VERSION_13_0 + struct ast_format * fmt; + int ret = 0; + + fmt = ast_format_cache_get(value); + if (fmt) { + ret = (int)ast_format_compatibility_format2bitfield(fmt); + } +#else struct ast_format fmt; int ret = 0; if (ast_getformatbyname(value, &fmt) != NULL) { ret = (int)ast_format_to_old_bitfield(&fmt); } +#endif return (ret); } -#else /* } { */ +#else /* CC_AST_HAS_VERSION_10_0 */ #define CC_FORMAT_ALAW AST_FORMAT_ALAW #ifdef AST_FORMAT_G722 diff --git a/chan_capi_qsig_core.c b/chan_capi_qsig_core.c index e0e41b6..776316c 100644 --- a/chan_capi_qsig_core.c +++ b/chan_capi_qsig_core.c @@ -1550,8 +1550,13 @@ void pbx_capi_qsig_handle_info_indication(_cmsg *CMSG, unsigned int PLCI, unsign if (ii) { cc_qsig_verbose( 1, VERBOSE_PREFIX_4 " * QSIG_PATHREPLACEMENT_PROPOSE: trying to complete bridge...\n"); +#ifdef CC_AST_HAS_VERSION_13_0 + chanx = ast_channel_bridge_peer(i->owner); + ast_channel_move(ii->owner, chanx); +#else chanx = ast_bridged_channel(i->owner); ast_channel_masquerade(ii->owner, chanx); +#endif } ast_free(i->qsig_data.pr_propose_cid); diff --git a/chan_capi_supplementary.c b/chan_capi_supplementary.c index 4e42bdc..363a369 100644 --- a/chan_capi_supplementary.c +++ b/chan_capi_supplementary.c @@ -373,6 +373,9 @@ static void ccbsnr_remote_user_free(_cmsg *CMSG, char type, unsigned int PLCI, _ c = ast_channel_alloc(0, state, handlename, NULL, #ifdef CC_AST_HAS_EXT2_CHAN_ALLOC 0, ccbsnr->exten, ccbsnr->context, +#ifdef CC_AST_HAS_VERSION_13_0 + NULL, NULL, +#endif #ifdef CC_AST_HAS_LINKEDID_CHAN_ALLOC NULL, #endif @@ -448,6 +451,10 @@ static void ccbsnr_remote_user_free(_cmsg *CMSG, char type, unsigned int PLCI, _ cc_verbose(2, 1, VERBOSE_PREFIX_2 "contr%d: started PBX for CCBS/CCNR callback (%s/%s/%d)\n", PLCI & 0xff, ccbsnr->context, ccbsnr->exten, ccbsnr->priority); } + +#ifdef CC_AST_HAS_VERSION_13_0 + ast_channel_unlock(c); +#endif } /* diff --git a/chan_capi_utils.c b/chan_capi_utils.c index 4038427..8e0c490 100644 --- a/chan_capi_utils.c +++ b/chan_capi_utils.c @@ -43,6 +43,10 @@ #define CC_HW_STATE_OK(__x__) (1) #endif +#ifdef CC_AST_HAS_VERSION_13_0 +#include "asterisk/smoother.h" +#endif + int capidebug = 0; char *emptyid = "\0"; diff --git a/create_config.sh b/create_config.sh index d0c449f..71aceda 100755 --- a/create_config.sh +++ b/create_config.sh @@ -42,6 +42,10 @@ if [ "$AVERSION" = "" ]; then if [ $? -eq 0 ]; then AVERSION="$(echo "$AVERSION" | sed -e 's/Asterisk //g')" AVERSIONNUM="$(echo "$AVERSION" |sed -e 's/\.//g')" + echo $AVERSIONNUM | grep -q GIT + if [ $? -eq 0 ]; then + AVERSIONNUM=$(echo $AVERSIONNUM | awk -F '-' '{print $2}') + fi # Set VER later automatically based on $AVERSIONNUM. else AVERSION="trunk" @@ -64,6 +68,15 @@ echo "#define CHAN_CAPI_CONFIG_H" >>$CONFIGFILE echo >>$CONFIGFILE case "$AVERSIONNUM" in + 13*) + echo "#define CC_AST_HAS_VERSION_1_6" >>$CONFIGFILE + echo "#define CC_AST_HAS_VERSION_1_8" >>$CONFIGFILE + echo "#define CC_AST_HAS_VERSION_10_0" >>$CONFIGFILE + echo "#define CC_AST_HAS_VERSION_11_0" >>$CONFIGFILE + echo "#define CC_AST_HAS_VERSION_13_0" >>$CONFIGFILE + echo " * found Asterisk version 13" + VER=13_0 + ;; 11*) echo "#define CC_AST_HAS_VERSION_1_6" >>$CONFIGFILE echo "#define CC_AST_HAS_VERSION_1_8" >>$CONFIGFILE @@ -317,6 +330,10 @@ case $VER in echo "Using Asterisk 11.0 API" check_version_onesix ;; + 13_0) + echo "Using Asterisk 13.0 API" + check_version_onesix + ;; *) echo >&2 "Asterisk version invalid." exit 1