[asterisk-commits] file: branch group/media_formats r408290 - /team/group/media_formats/channels/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Feb 17 13:49:31 CST 2014
Author: file
Date: Mon Feb 17 13:49:28 2014
New Revision: 408290
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=408290
Log:
Move chan_unistim over.
Modified:
team/group/media_formats/channels/chan_unistim.c
Modified: team/group/media_formats/channels/chan_unistim.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/channels/chan_unistim.c?view=diff&rev=408290&r1=408289&r2=408290
==============================================================================
--- team/group/media_formats/channels/chan_unistim.c (original)
+++ team/group/media_formats/channels/chan_unistim.c Mon Feb 17 13:49:28 2014
@@ -78,6 +78,7 @@
#include "asterisk/features_config.h"
#include "asterisk/bridge.h"
#include "asterisk/stasis_channels.h"
+#include "asterisk/format_cache.h"
#define DEFAULTCONTEXT "default"
#define DEFAULTCALLERID "Unknown"
@@ -1816,7 +1817,7 @@
struct ast_format_cap *tmp = src->cap;
memcpy(dst, src, sizeof(*dst)); /* this over writes the cap ptr, so we have to reset it */
src->cap = tmp;
- ast_format_cap_copy(src->cap, dst->cap);
+ ast_format_cap_append_by_type(src->cap, dst->cap, AST_MEDIA_TYPE_UNKNOWN);
}
static struct unistim_line *unistim_line_destroy(struct unistim_line *l)
@@ -1824,7 +1825,7 @@
if (!l) {
return NULL;
}
- l->cap = ast_format_cap_destroy(l->cap);
+ ao2_ref(l->cap, -1);
ast_free(l);
return NULL;
}
@@ -1836,7 +1837,7 @@
return NULL;
}
- if (!(l->cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_NOLOCK))) {
+ if (!(l->cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
ast_free(l);
return NULL;
}
@@ -2582,15 +2583,15 @@
if (unistimdebug) {
ast_verb(0, "RTP started : Our IP/port is : %s:%hd with codec %s\n",
ast_inet_ntoa(us.sin_addr),
- htons(us.sin_port), ast_getformatname(ast_channel_readformat(sub->owner)));
+ htons(us.sin_port), ast_channel_readformat(sub->owner)->codec->name);
ast_verb(0, "Starting phone RTP stack. Our public IP is %s\n",
ast_inet_ntoa(public.sin_addr));
}
pte = sub->parent->parent->session;
codec = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(sub->rtp), 1, ast_channel_readformat(sub->owner), 0);
- if ((ast_channel_readformat(sub->owner)->id == AST_FORMAT_ULAW) ||
- (ast_channel_readformat(sub->owner)->id == AST_FORMAT_ALAW)) {
+ if ((ast_format_cmp(ast_channel_readformat(sub->owner), ast_format_ulaw) == AST_FORMAT_CMP_EQUAL) ||
+ (ast_format_cmp(ast_channel_readformat(sub->owner), ast_format_alaw) == AST_FORMAT_CMP_EQUAL)) {
if (unistimdebug) {
ast_verb(0, "Sending packet_send_rtp_packet_size for codec %d\n", codec);
}
@@ -2687,17 +2688,17 @@
/* Codec */
buffsend[40] = codec;
buffsend[41] = codec;
- if (ast_channel_readformat(sub->owner)->id == AST_FORMAT_ULAW) {
+ if (ast_format_cmp(ast_channel_readformat(sub->owner), ast_format_ulaw) == AST_FORMAT_CMP_EQUAL) {
buffsend[42] = 1; /* 1 = 20ms (160 bytes), 2 = 40ms (320 bytes) */
- } else if (ast_channel_readformat(sub->owner)->id == AST_FORMAT_ALAW) {
+ } else if (ast_format_cmp(ast_channel_readformat(sub->owner), ast_format_alaw) == AST_FORMAT_CMP_EQUAL) {
buffsend[42] = 1; /* 1 = 20ms (160 bytes), 2 = 40ms (320 bytes) */
- } else if (ast_channel_readformat(sub->owner)->id == AST_FORMAT_G723_1) {
+ } else if (ast_format_cmp(ast_channel_readformat(sub->owner), ast_format_g723) == AST_FORMAT_CMP_EQUAL) {
buffsend[42] = 2; /* 1 = 30ms (24 bytes), 2 = 60 ms (48 bytes) */
- } else if (ast_channel_readformat(sub->owner)->id == AST_FORMAT_G729A) {
+ } else if (ast_format_cmp(ast_channel_readformat(sub->owner), ast_format_g729) == AST_FORMAT_CMP_EQUAL) {
buffsend[42] = 2; /* 1 = 10ms (10 bytes), 2 = 20ms (20 bytes) */
} else {
ast_log(LOG_WARNING, "Unsupported codec %s!\n",
- ast_getformatname(ast_channel_readformat(sub->owner)));
+ ast_channel_readformat(sub->owner)->codec->name);
}
/* Source port for transmit RTP and Destination port for receiving RTP */
buffsend[45] = (htons(sin.sin_port) & 0xff00) >> 8;
@@ -2766,18 +2767,19 @@
sin.sin_port = htons(find_rtp_port(sub));
ast_sockaddr_from_sin(&sin_tmp, &sin);
ast_rtp_instance_set_remote_address(sub->rtp, &sin_tmp);
- if (!ast_format_cap_iscompatible(ast_channel_nativeformats(sub->owner), ast_channel_readformat(sub->owner))) {
- struct ast_format tmpfmt;
+ if (!ast_format_cap_iscompatible_format(ast_channel_nativeformats(sub->owner), ast_channel_readformat(sub->owner))) {
+ struct ast_format *tmpfmt;
char tmp[256];
ast_best_codec(ast_channel_nativeformats(sub->owner), &tmpfmt);
ast_log(LOG_WARNING,
"Our read/writeformat has been changed to something incompatible: %s, using %s best codec from %s\n",
- ast_getformatname(ast_channel_readformat(sub->owner)),
- ast_getformatname(&tmpfmt),
+ ast_channel_readformat(sub->owner)->codec->name,
+ tmpfmt->codec->name,
ast_getformatname_multiple(tmp, sizeof(tmp), ast_channel_nativeformats(sub->owner)));
- ast_format_copy(ast_channel_readformat(sub->owner), &tmpfmt);
- ast_format_copy(ast_channel_writeformat(sub->owner), &tmpfmt);
+ ast_channel_set_readformat(sub->owner, tmpfmt);
+ ast_channel_set_writeformat(sub->owner, tmpfmt);
+ ao2_ref(tmpfmt, -1);
}
send_start_rtp(sub);
ast_mutex_unlock(&sub->lock);
@@ -5005,14 +5007,21 @@
if (sub->owner) {
/* We already hold the channel lock */
if (f->frametype == AST_FRAME_VOICE) {
- if (!(ast_format_cap_iscompatible(ast_channel_nativeformats(sub->owner), &f->subclass.format))) {
+ if (!(ast_format_cap_iscompatible_format(ast_channel_nativeformats(sub->owner), f->subclass.format))) {
char tmp[256];
+ struct ast_format_cap *caps;
+
ast_debug(1,
"Oooh, format changed from %s to %s\n",
ast_getformatname_multiple(tmp, sizeof(tmp), ast_channel_nativeformats(sub->owner)),
- ast_getformatname(&f->subclass.format));
-
- ast_format_cap_set(ast_channel_nativeformats(sub->owner), &f->subclass.format);
+ f->subclass.format->codec->name);
+
+ caps = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
+ if (caps) {
+ ast_format_cap_add(caps, f->subclass.format, 0);
+ ast_channel_nativeformats_set(sub->owner, caps);
+ ao2_ref(caps, -1);
+ }
ast_set_read_format(sub->owner, ast_channel_readformat(sub->owner));
ast_set_write_format(sub->owner, ast_channel_writeformat(sub->owner));
}
@@ -5048,14 +5057,14 @@
return 0;
}
} else {
- if (!(ast_format_cap_iscompatible(ast_channel_nativeformats(ast), &frame->subclass.format))) {
+ if (!(ast_format_cap_iscompatible_format(ast_channel_nativeformats(ast), frame->subclass.format))) {
char tmp[256];
ast_log(LOG_WARNING,
"Asked to transmit frame type %s, while native formats is %s (read/write = (%s/%s)\n",
- ast_getformatname(&frame->subclass.format),
+ frame->subclass.format->codec->name,
ast_getformatname_multiple(tmp, sizeof(tmp), ast_channel_nativeformats(ast)),
- ast_getformatname(ast_channel_readformat(ast)),
- ast_getformatname(ast_channel_writeformat(ast)));
+ ast_channel_readformat(ast)->codec->name,
+ ast_channel_writeformat(ast)->codec->name);
return -1;
}
}
@@ -5532,9 +5541,10 @@
/* called from unistim_request (calls from the pbx ) */
static struct ast_channel *unistim_new(struct unistim_subchannel *sub, int state, const char *linkedid)
{
+ struct ast_format_cap *caps;
struct ast_channel *tmp;
struct unistim_line *l;
- struct ast_format tmpfmt;
+ struct ast_format *tmpfmt;
if (!sub) {
ast_log(LOG_WARNING, "subchannel null in unistim_new\n");
@@ -5544,6 +5554,12 @@
ast_log(LOG_WARNING, "no line for subchannel %p\n", sub);
return NULL;
}
+
+ caps = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
+ if (!caps) {
+ return NULL;
+ }
+
l = sub->parent;
tmp = ast_channel_alloc(1, state, l->cid_num, NULL, l->accountcode, l->exten,
l->parent->context, linkedid, l->amaflags, "USTM/%s@%s-%p", l->name, l->parent->name, sub);
@@ -5552,21 +5568,26 @@
}
if (!tmp) {
ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
+ ao2_ref(caps, -1);
return NULL;
}
ast_channel_stage_snapshot(tmp);
- ast_format_cap_copy(ast_channel_nativeformats(tmp), l->cap);
- if (ast_format_cap_is_empty(ast_channel_nativeformats(tmp))) {
- ast_format_cap_copy(ast_channel_nativeformats(tmp), global_cap);
- }
+ if (ast_format_cap_count(l->cap)) {
+ ast_format_cap_append_by_type(caps, l->cap, AST_MEDIA_TYPE_UNKNOWN);
+ } else {
+ ast_format_cap_append_by_type(caps, global_cap, AST_MEDIA_TYPE_UNKNOWN);
+ }
+ ast_channel_nativeformats_set(tmp, caps);
+ ao2_ref(caps, -1);
+
ast_best_codec(ast_channel_nativeformats(tmp), &tmpfmt);
if (unistimdebug) {
char tmp1[256], tmp2[256], tmp3[256];
ast_verb(0, "Best codec = %s from nativeformats %s (line cap=%s global=%s)\n",
- ast_getformatname(&tmpfmt),
+ tmpfmt->codec->name,
ast_getformatname_multiple(tmp1, sizeof(tmp1), ast_channel_nativeformats(tmp)),
ast_getformatname_multiple(tmp2, sizeof(tmp2), l->cap),
ast_getformatname_multiple(tmp3, sizeof(tmp3), global_cap));
@@ -5587,10 +5608,13 @@
ast_channel_rings_set(tmp, 1);
}
ast_channel_adsicpe_set(tmp, AST_ADSI_UNAVAILABLE);
- ast_format_copy(ast_channel_writeformat(tmp), &tmpfmt);
- ast_format_copy(ast_channel_rawwriteformat(tmp), &tmpfmt);
- ast_format_copy(ast_channel_readformat(tmp), &tmpfmt);
- ast_format_copy(ast_channel_rawreadformat(tmp), &tmpfmt);
+
+ ast_channel_set_writeformat(tmp, tmpfmt);
+ ast_channel_set_rawwriteformat(tmp, tmpfmt);
+ ast_channel_set_readformat(tmp, tmpfmt);
+ ast_channel_set_rawreadformat(tmp, tmpfmt);
+ ao2_ref(tmpfmt, -1);
+
ast_channel_tech_pvt_set(tmp, sub);
ast_channel_tech_set(tmp, &unistim_tech);
@@ -5773,7 +5797,7 @@
char tmp[256];
char tmp2[256];
- if (!(ast_format_cap_has_joint(cap, global_cap))) {
+ if (!(ast_format_cap_iscompatible(cap, global_cap))) {
ast_log(LOG_NOTICE,
"Asked to get a channel of unsupported format %s while capability is %s\n",
ast_getformatname_multiple(tmp2, sizeof(tmp2), cap), ast_getformatname_multiple(tmp, sizeof(tmp), global_cap));
@@ -5827,7 +5851,8 @@
}
sub->subtype = SUB_RING;
sub->softkey = -1;
- ast_format_cap_copy(sub->parent->cap, cap);
+
+ ast_format_cap_append_by_type(sub->parent->cap, cap, AST_MEDIA_TYPE_UNKNOWN);
tmpc = unistim_new(sub, AST_STATE_DOWN, requestor ? ast_channel_linkedid(requestor) : NULL);
if (!tmpc) {
ast_log(LOG_WARNING, "Unable to make channel for '%s'\n", tmp);
@@ -6465,7 +6490,7 @@
ast_verb(3, "Setting mailbox '%s' on %s@%s\n", l->mailbox, d->name, l->name);
}
}
- ast_format_cap_copy(l->cap, global_cap);
+ ast_format_cap_append_by_type(l->cap, global_cap, AST_MEDIA_TYPE_UNKNOWN);
l->parent = d;
linecnt++;
AST_LIST_LOCK(&d->lines);
@@ -6845,17 +6870,18 @@
int load_module(void)
{
int res;
- struct ast_format tmpfmt;
- if (!(global_cap = ast_format_cap_alloc(0))) {
+
+ if (!(global_cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
goto buff_failed;
}
- if (!(unistim_tech.capabilities = ast_format_cap_alloc(0))) {
+ if (!(unistim_tech.capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
goto buff_failed;
}
- ast_format_cap_add(global_cap, ast_format_set(&tmpfmt, AST_FORMAT_ULAW, 0));
- ast_format_cap_add(global_cap, ast_format_set(&tmpfmt, AST_FORMAT_ALAW, 0));
- ast_format_cap_copy(unistim_tech.capabilities, global_cap);
+ ast_format_cap_add(global_cap, ast_format_ulaw, 0);
+ ast_format_cap_add(global_cap, ast_format_alaw, 0);
+ ast_format_cap_append_by_type(unistim_tech.capabilities, global_cap, AST_MEDIA_TYPE_AUDIO);
+
if (!(buff = ast_malloc(SIZE_PAGE))) {
goto buff_failed;
}
@@ -6900,8 +6926,10 @@
io_failed:
ast_free(buff);
buff = NULL;
- global_cap = ast_format_cap_destroy(global_cap);
- unistim_tech.capabilities = ast_format_cap_destroy(unistim_tech.capabilities);
+ ao2_cleanup(global_cap);
+ global_cap = NULL;
+ ao2_cleanup(unistim_tech.capabilities);
+ unistim_tech.capabilities = NULL;
buff_failed:
return AST_MODULE_LOAD_FAILURE;
}
@@ -6933,8 +6961,8 @@
if (unistimsock > -1) {
close(unistimsock);
}
- global_cap = ast_format_cap_destroy(global_cap);
- unistim_tech.capabilities = ast_format_cap_destroy(unistim_tech.capabilities);
+ ao2_ref(global_cap, -1);
+ ao2_ref(unistim_tech.capabilities, -1);
return 0;
}
More information about the asterisk-commits
mailing list