--- chan_dongle_o.c 2011-11-23 14:04:57.270633822 +0200 +++ chan_dongle.c 2011-11-23 14:07:05.740251209 +0200 @@ -43,6 +43,7 @@ #include ASTERISK_FILE_VERSION(__FILE__, "$Rev: " PACKAGE_REVISION " $") +#include #include /* AST_DECLARE_STRING_FIELDS for asterisk/manager.h */ #include #include @@ -71,6 +72,8 @@ EXPORT_DEF const char * const dev_state_strs[4] = { "stop", "restart", "remove", "start" }; EXPORT_DEF public_state_t * gpublic; +EXPORT_DEF struct ast_format chan_dongle_format; +EXPORT_DEF struct ast_format_cap * chan_dongle_format_cap; static int public_state_init(struct public_state * state); @@ -1640,6 +1643,16 @@ rv = AST_MODULE_LOAD_FAILURE; if(discovery_restart(state) == 0) { +#if ASTERISK_VERSION_NUM >= 100000 /* 10+ */ + /* set preferred capabilities */ + ast_format_set(&chan_dongle_format, AST_FORMAT_SLINEAR, 0); + if (!(channel_tech.capabilities = ast_format_cap_alloc())) { + return AST_MODULE_LOAD_FAILURE; + } + ast_format_cap_add(channel_tech.capabilities, &chan_dongle_format); + chan_dongle_format_cap = channel_tech.capabilities; +#endif + /* register our channel type */ if(ast_channel_register(&channel_tech) == 0) { @@ -1652,6 +1665,9 @@ } else { +#if ASTERISK_VERSION_NUM >= 100000 /* 10+ */ + channel_tech.capabilities = ast_format_cap_destroy(channel_tech.capabilities); +#endif ast_log (LOG_ERROR, "Unable to register channel class %s\n", channel_tech.type); } discovery_stop(state); @@ -1679,6 +1695,9 @@ { /* First, take us out of the channel loop */ ast_channel_unregister (&channel_tech); +#if ASTERISK_VERSION_NUM >= 100000 /* 10+ */ + channel_tech.capabilities = ast_format_cap_destroy(channel_tech.capabilities); +#endif /* Unregister the CLI & APP & MANAGER */ --- chan_dongle_o.h 2011-11-23 14:05:35.031639222 +0200 +++ chan_dongle.h 2011-11-23 14:06:24.608334634 +0200 @@ -33,6 +33,9 @@ return enum2str(state, states, ITEMS_OF(states)); } +/* Only linear is allowed */ +EXPORT_DECL struct ast_format chan_dongle_format; +EXPORT_DECL struct ast_format_cap * chan_dongle_format_cap; typedef enum { RESTATE_TIME_NOW = 0, --- channel_o.c 2011-11-23 14:05:08.279344414 +0200 +++ channel.c 2011-11-23 14:06:24.610334645 +0200 @@ -95,20 +95,24 @@ return 0; } -#if ASTERISK_VERSION_NUM >= 10800 +#if ASTERISK_VERSION_NUM >= 100000 /* 10+ */ + +static struct ast_channel * channel_request (attribute_unused const char * type, struct ast_format_cap * cap, const struct ast_channel *requestor, void * data, int * cause) + +#elif ASTERISK_VERSION_NUM >= 10800 /* 1.8+ */ // TODO: simplify by move common code to functions static struct ast_channel * channel_request (attribute_unused const char * type, format_t format, const struct ast_channel * requestor, void * data, int * cause) -#else /* #if ASTERISK_VERSION_NUM >= 10800 */ +#else /* 1.8- */ /* TODO: add check when request 'holdother' what requestor is not on same device for 1.6 */ static struct ast_channel * channel_request (attribute_unused const char * type, int format, void * data, int * cause) -#endif /* #if ASTERISK_VERSION_NUM >= 10800 */ +#endif { -#if ASTERISK_VERSION_NUM >= 10800 +#if ASTERISK_VERSION_NUM >= 10800 && ASTERISK_VERSION_NUM < 100000 /* 1.8+ .. 10- */ format_t oldformat; -#else +#elif ASTERISK_VERSION_NUM < 10800 /* 1.8- */ int oldformat; const struct ast_channel * requestor = NULL; #endif @@ -126,11 +130,18 @@ return NULL; } +#if ASTERISK_VERSION_NUM >= 100000 /* 10+ */ + if (!ast_format_cap_iscompatible(cap, &chan_dongle_format)) +#else oldformat = format; format &= AST_FORMAT_SLINEAR; if (!format) +#endif { -#if ASTERISK_VERSION_NUM >= 10800 +#if ASTERISK_VERSION_NUM >= 100000 /* 10+ */ + char buf[255]; + ast_log (LOG_WARNING, "Asked to get a channel of unsupported format '%s'\n", ast_getformatname_multiple (buf, 255, cap)); +#elif ASTERISK_VERSION_NUM >= 10800 /* 1.8+ */ ast_log (LOG_WARNING, "Asked to get a channel of unsupported format '%s'\n", ast_getformatname (oldformat)); #else ast_log (LOG_WARNING, "Asked to get a channel of unsupported format '%d'\n", oldformat); @@ -571,10 +582,12 @@ } -#if ASTERISK_VERSION_NUM >= 10800 +#if ASTERISK_VERSION_NUM >= 100000 /* 10+ */ +#define subclass_integer subclass.integer +#elif ASTERISK_VERSION_NUM >= 10800 /* 1.8+ */ #define subclass_codec subclass.codec #define subclass_integer subclass.integer -#else +#else /* 1.8- */ #define subclass_codec subclass #define subclass_integer subclass #endif @@ -618,7 +631,11 @@ memset (&cpvt->a_read_frame, 0, sizeof (cpvt->a_read_frame)); cpvt->a_read_frame.frametype = AST_FRAME_VOICE; - cpvt->a_read_frame.subclass_codec= AST_FORMAT_SLINEAR; +#if ASTERISK_VERSION_NUM >= 100000 /* 10+ */ + ast_format_copy(&cpvt->a_read_frame.subclass.format, &chan_dongle_format); +#else + cpvt->a_read_frame.subclass_codec = AST_FORMAT_SLINEAR; +#endif cpvt->a_read_frame.data.ptr = cpvt->a_read_buf + AST_FRIENDLY_OFFSET; cpvt->a_read_frame.offset = AST_FRIENDLY_OFFSET; cpvt->a_read_frame.src = AST_MODULE; @@ -732,7 +749,11 @@ size_t count; int gains[2]; +#if ASTERISK_VERSION_NUM >= 100000 /* 10+ */ + if (f->frametype != AST_FRAME_VOICE || f->subclass.format.id != AST_FORMAT_SLINEAR) +#else /* 10- */ if (f->frametype != AST_FRAME_VOICE || f->subclass_codec != AST_FORMAT_SLINEAR) +#endif { return 0; } @@ -1148,9 +1169,15 @@ channel->tech_pvt = cpvt; channel->tech = &channel_tech; +#if ASTERISK_VERSION_NUM >= 100000 /* 10+ */ + ast_format_cap_add(channel->nativeformats, &chan_dongle_format); + ast_format_copy(&channel->writeformat, &chan_dongle_format); + ast_format_copy(&channel->readformat, &chan_dongle_format); +#else /* 10- */ channel->nativeformats = AST_FORMAT_SLINEAR; channel->writeformat = AST_FORMAT_SLINEAR; channel->readformat = AST_FORMAT_SLINEAR; +#endif if (ast_state == AST_STATE_RING) { @@ -1238,9 +1265,11 @@ snprintf (channel_name, sizeof (channel_name), "%s@%s", exten, CONF_SHARED(pvt, context)); -#if ASTERISK_VERSION_NUM >= 10800 +#if ASTERISK_VERSION_NUM >= 100000 /* 10+ */ + channel = ast_request ("Local", chan_dongle_format_cap, NULL, channel_name, &cause); +#elif ASTERISK_VERSION_NUM >= 10800 /* 1.8+ */ channel = ast_request ("Local", AST_FORMAT_AUDIO_MASK, NULL, channel_name, &cause); -#else +#else /* 1.8- */ channel = ast_request ("Local", AST_FORMAT_AUDIO_MASK, channel_name, &cause); #endif if (channel) @@ -1314,7 +1343,6 @@ static int channel_func_write(struct ast_channel* channel, const char* function, char* data, const char* value) { struct cpvt* cpvt = channel->tech_pvt; - struct pvt* pvt; call_state_t newstate, oldstate; int ret = 0; @@ -1323,7 +1351,6 @@ ast_log (LOG_WARNING, "call on unreferenced %s\n", channel->name); return -1; } - pvt = cpvt->pvt; if (!strcasecmp(data, "callstate")) { @@ -1366,11 +1393,13 @@ return ret; } -EXPORT_DEF const struct ast_channel_tech channel_tech = +EXPORT_DEF struct ast_channel_tech channel_tech = { .type = "Dongle", .description = MODULE_DESCRIPTION, +#if ASTERISK_VERSION_NUM < 100000 /* 10- */ .capabilities = AST_FORMAT_SLINEAR, +#endif .requester = channel_request, .call = channel_call, .hangup = channel_hangup, --- channel_o.h 2011-11-23 14:05:43.206424916 +0200 +++ channel.h 2011-11-23 14:06:24.611334658 +0200 @@ -19,7 +19,7 @@ struct pvt; struct cpvt; -EXPORT_DECL const struct ast_channel_tech channel_tech; +EXPORT_DECL struct ast_channel_tech channel_tech; EXPORT_DECL struct ast_channel* new_channel (struct pvt * pvt, int ast_state, const char * cid_num, int call_idx, unsigned dir, unsigned state, const char * exten, const struct ast_channel * requestor); EXPORT_DECL int queue_control_channel (struct cpvt * cpvt, enum ast_control_frame_type control);