[svn-commits] dvossel: branch dvossel/fixtheworld_phase1_step3 r300715 - in /team/dvossel/f...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Jan 5 21:06:39 UTC 2011


Author: dvossel
Date: Wed Jan  5 15:06:35 2011
New Revision: 300715

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=300715
Log:
All the remaining changes required to update channel.c for the ast_format conversion

Modified:
    team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h
    team/dvossel/fixtheworld_phase1_step3/main/channel.c
    team/dvossel/fixtheworld_phase1_step3/main/format_cap.c

Modified: team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h?view=diff&rev=300715&r1=300714&r2=300715
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h (original)
+++ team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h Wed Jan  5 15:06:35 2011
@@ -107,6 +107,14 @@
 int ast_cap_iscompatible(struct ast_cap *cap, struct ast_format *format);
 
 /*!
+ * \brief is cap1 identical to cap2
+ *
+ * retval 1 true, identical
+ * retval 0 false, not identical
+ */
+int ast_cap_identical(struct ast_cap *cap1, struct ast_cap *cap2);
+
+/*!
  * \brief Get joint capability structure.
  *
  * \retval !NULL success
@@ -118,10 +126,10 @@
  * \brief Find out if capability structures have any joint capabilities without
  * returning those capabilities.
  *
- * \retval 1 success
- * \retval 0 failure
+ * \retval 1 true, has joint capabilities
+ * \retval 0 false, failure
  */
-struct ast_cap *ast_cap_has_joint(struct ast_cap *cap1, struct ast_cap *cap2);
+int ast_cap_has_joint(struct ast_cap *cap1, struct ast_cap *cap2);
 
 /*!
  * \brief Get all capabilities for a specific media type

Modified: team/dvossel/fixtheworld_phase1_step3/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step3/main/channel.c?view=diff&rev=300715&r1=300714&r2=300715
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/main/channel.c (original)
+++ team/dvossel/fixtheworld_phase1_step3/main/channel.c Wed Jan  5 15:06:35 2011
@@ -6292,8 +6292,7 @@
  */
 int ast_do_masquerade(struct ast_channel *original)
 {
-	format_t x;
-	int i;
+	int x, i;
 	int res=0;
 	int origstate;
 	int visible_indication;
@@ -6311,12 +6310,16 @@
 	struct ast_cdr *cdr;
 	struct ast_datastore *xfer_ds;
 	struct xfer_masquerade_ds *xfer_colp;
-	format_t rformat = original->readformat;
-	format_t wformat = original->writeformat;
+	struct ast_format rformat;
+	struct ast_format wformat;
+	struct ast_format tmp_format;
 	char newn[AST_CHANNEL_NAME];
 	char orig[AST_CHANNEL_NAME];
 	char masqn[AST_CHANNEL_NAME];
 	char zombn[AST_CHANNEL_NAME];
+
+	ast_format_copy(&original->readformat, &rformat);
+	ast_format_copy(&original->writeformat, &wformat);
 
 	/* XXX This operation is a bit odd.  We're essentially putting the guts of
 	 * the clone channel into the original channel.  Start by killing off the
@@ -6476,12 +6479,13 @@
 	}
 
 	/* Swap the raw formats */
-	x = original->rawreadformat;
-	original->rawreadformat = clonechan->rawreadformat;
-	clonechan->rawreadformat = x;
-	x = original->rawwriteformat;
-	original->rawwriteformat = clonechan->rawwriteformat;
-	clonechan->rawwriteformat = x;
+	ast_format_copy(&original->rawreadformat, &tmp_format);
+	ast_format_copy(&clonechan->rawreadformat, &original->rawreadformat);
+	ast_format_copy(&tmp_format, &clonechan->rawreadformat);
+
+	ast_format_copy(&original->rawwriteformat, &tmp_format);
+	ast_format_copy(&clonechan->rawwriteformat, &original->rawwriteformat);
+	ast_format_copy(&tmp_format, &clonechan->rawwriteformat);
 
 	clonechan->_softhangup = AST_SOFTHANGUP_DEV;
 
@@ -6585,10 +6589,10 @@
 	/* pvt switches.  pbx stays the same, as does next */
 
 	/* Set the write format */
-	ast_set_write_format(original, wformat);
+	ast_set_write_format(original, &wformat);
 
 	/* Set the read format */
-	ast_set_read_format(original, rformat);
+	ast_set_read_format(original, &rformat);
 
 	/* Copy the music class */
 	ast_string_field_set(original, musicclass, clonechan->musicclass);
@@ -6602,7 +6606,7 @@
 	}
 
 	ast_debug(1, "Putting channel %s in %s/%s formats\n", original->name,
-		ast_getformatname(wformat), ast_getformatname(rformat));
+		ast_getformatname(&wformat), ast_getformatname(&rformat));
 
 	/* Okay.  Last thing is to let the channel driver know about all this mess, so he
 	   can fix up everything as best as possible */
@@ -6846,8 +6850,8 @@
 	struct ast_channel *cs[3];
 	struct ast_frame *f;
 	enum ast_bridge_result res = AST_BRIDGE_COMPLETE;
-	format_t o0nativeformats;
-	format_t o1nativeformats;
+	struct ast_cap *o0nativeformats;
+	struct ast_cap *o1nativeformats;
 	int watch_c0_dtmf;
 	int watch_c1_dtmf;
 	void *pvt0, *pvt1;
@@ -6855,13 +6859,20 @@
 	int frame_put_in_jb = 0;
 	int jb_in_use;
 	int to;
-	
+
+	o0nativeformats = ast_cap_copy(c0->nativeformats);
+	o1nativeformats = ast_cap_copy(c1->nativeformats);
+
+	if (!o0nativeformats || !o1nativeformats) {
+		ast_cap_destroy(o0nativeformats); /* NULL safe */
+		ast_cap_destroy(o1nativeformats); /* NULL safe */
+		return AST_BRIDGE_FAILED;
+	}
+
 	cs[0] = c0;
 	cs[1] = c1;
 	pvt0 = c0->tech_pvt;
 	pvt1 = c1->tech_pvt;
-	o0nativeformats = c0->nativeformats;
-	o1nativeformats = c1->nativeformats;
 	watch_c0_dtmf = config->flags & AST_BRIDGE_DTMF_CHANNEL_0;
 	watch_c1_dtmf = config->flags & AST_BRIDGE_DTMF_CHANNEL_1;
 
@@ -6883,8 +6894,8 @@
 		struct ast_channel *who, *other;
 
 		if ((c0->tech_pvt != pvt0) || (c1->tech_pvt != pvt1) ||
-		    (o0nativeformats != c0->nativeformats) ||
-		    (o1nativeformats != c1->nativeformats)) {
+		    (!ast_cap_identical(o0nativeformats, c0->nativeformats)) ||
+		    (!ast_cap_identical(o1nativeformats, c1->nativeformats))) {
 			/* Check for Masquerade, codec changes, etc */
 			res = AST_BRIDGE_RETRY;
 			break;
@@ -7034,6 +7045,9 @@
 
 	ast_poll_channel_del(c0, c1);
 
+	ast_cap_destroy(o0nativeformats);
+	ast_cap_destroy(o1nativeformats);
+
 	return res;
 }
 
@@ -7143,8 +7157,8 @@
 {
 	struct ast_channel *chans[2] = { c0, c1 };
 	enum ast_bridge_result res = AST_BRIDGE_COMPLETE;
-	format_t o0nativeformats;
-	format_t o1nativeformats;
+	struct ast_cap *o0nativeformats;
+	struct ast_cap *o1nativeformats;
 	long time_left_ms=0;
 	char caller_warning = 0;
 	char callee_warning = 0;
@@ -7165,6 +7179,16 @@
 	    ast_test_flag(c1, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c1))
 		return -1;
 
+	o0nativeformats = ast_cap_copy(c0->nativeformats);
+	o1nativeformats = ast_cap_copy(c1->nativeformats);
+	if (!o0nativeformats || !o0nativeformats) {
+		ast_cap_destroy(o0nativeformats);
+		ast_cap_destroy(o0nativeformats);
+		ast_log(LOG_WARNING, "failed to copy native formats\n");
+		return -1;
+	}
+
+
 	*fo = NULL;
 
 	if (ast_tvzero(config->start_time)) {
@@ -7184,9 +7208,6 @@
 	c1->_bridge = c0;
 
 	ast_set_owners_and_peers(c0, c1);
-
-	o0nativeformats = c0->nativeformats;
-	o1nativeformats = c1->nativeformats;
 
 	if (config->feature_timer && !ast_tvzero(config->nexteventts)) {
 		config->nexteventts = ast_tvadd(config->feature_start_time, ast_samp2tv(config->feature_timer, 1000));
@@ -7338,6 +7359,8 @@
 
 				c0->_bridge = NULL;
 				c1->_bridge = NULL;
+				ast_cap_destroy(o0nativeformats);
+				ast_cap_destroy(o0nativeformats);
 				return res;
 			} else {
 				ast_clear_flag(c0, AST_FLAG_NBRIDGE);
@@ -7357,16 +7380,23 @@
 			}
 		}
 
-		if (((c0->writeformat != c1->readformat) || (c0->readformat != c1->writeformat) ||
-		    (c0->nativeformats != o0nativeformats) || (c1->nativeformats != o1nativeformats)) &&
+		if (((ast_format_cmp(&c0->writeformat, &c1->readformat) == AST_FORMAT_CMP_NOT_EQUAL) ||
+			(ast_format_cmp(&c0->readformat, &c1->writeformat) == AST_FORMAT_CMP_NOT_EQUAL) ||
+		    !ast_cap_identical(c0->nativeformats, o0nativeformats) ||
+			!ast_cap_identical(c1->nativeformats, o1nativeformats)) &&
 		    !(c0->generator || c1->generator)) {
 			if (ast_channel_make_compatible(c0, c1)) {
 				ast_log(LOG_WARNING, "Can't make %s and %s compatible\n", c0->name, c1->name);
 				manager_bridge_event(0, 1, c0, c1);
+				ast_cap_destroy(o0nativeformats);
+				ast_cap_destroy(o0nativeformats);
 				return AST_BRIDGE_FAILED;
 			}
-			o0nativeformats = c0->nativeformats;
-			o1nativeformats = c1->nativeformats;
+
+			ast_cap_remove_all(o0nativeformats);
+			ast_cap_remove_all(o0nativeformats);
+			ast_cap_append(c0->nativeformats, o0nativeformats);
+			ast_cap_append(c1->nativeformats, o1nativeformats);
 		}
 
 		update_bridge_vars(c0, c1);
@@ -7403,6 +7433,8 @@
 		S_COR(c1->caller.id.number.valid, c1->caller.id.number.str, "<unknown>"));
 	ast_debug(1, "Bridge stops bridging channels %s and %s\n", c0->name, c1->name);
 
+	ast_cap_destroy(o0nativeformats);
+	ast_cap_destroy(o0nativeformats);
 	return res;
 }
 
@@ -7449,7 +7481,7 @@
 	int v1_2;
 	int v2_2;
 	int v3_2;
-	format_t origwfmt;
+	struct ast_format origwfmt;
 	int pos;
 	int duration;
 	int modulate;
@@ -7463,7 +7495,7 @@
 	struct tonepair_state *ts = params;
 
 	if (chan)
-		ast_set_write_format(chan, ts->origwfmt);
+		ast_set_write_format(chan, &ts->origwfmt);
 	ast_free(ts);
 }
 
@@ -7474,8 +7506,8 @@
 
 	if (!(ts = ast_calloc(1, sizeof(*ts))))
 		return NULL;
-	ts->origwfmt = chan->writeformat;
-	if (ast_set_write_format(chan, AST_FORMAT_SLINEAR)) {
+	ast_format_copy(&chan->writeformat, &ts->origwfmt);
+	if (ast_set_write_format_by_id(chan, AST_FORMAT_SLINEAR)) {
 		ast_log(LOG_WARNING, "Unable to set '%s' to signed linear format (write)\n", chan->name);
 		tonepair_release(NULL, ts);
 		ts = NULL;
@@ -7529,7 +7561,7 @@
  			ts->data[x] = ts->v3_1 + ts->v3_2; 
  	}
 	ts->f.frametype = AST_FRAME_VOICE;
-	ts->f.subclass.codec = AST_FORMAT_SLINEAR;
+	ast_format_set(&ts->f.subclass.format, AST_FORMAT_SLINEAR, 0);
 	ts->f.datalen = len;
 	ts->f.samples = samples;
 	ts->f.offset = AST_FRIENDLY_OFFSET;
@@ -7871,11 +7903,11 @@
 	short buf[samples];
 	struct ast_frame frame = {
 		.frametype = AST_FRAME_VOICE,
-		.subclass.codec = AST_FORMAT_SLINEAR,
 		.data.ptr = buf,
 		.samples = samples,
 		.datalen = sizeof(buf),
 	};
+	ast_format_set(&frame.subclass.format, AST_FORMAT_SLINEAR, 0);
 
 	memset(buf, 0, sizeof(buf));
 
@@ -7892,7 +7924,7 @@
 };
 
 struct ast_silence_generator {
-	int old_write_format;
+	struct ast_format old_write_format;
 };
 
 struct ast_silence_generator *ast_channel_start_silence_generator(struct ast_channel *chan)
@@ -7903,9 +7935,9 @@
 		return NULL;
 	}
 
-	state->old_write_format = chan->writeformat;
-
-	if (ast_set_write_format(chan, AST_FORMAT_SLINEAR) < 0) {
+	ast_format_copy(&chan->writeformat, &state->old_write_format);
+
+	if (ast_set_write_format_by_id(chan, AST_FORMAT_SLINEAR) < 0) {
 		ast_log(LOG_ERROR, "Could not set write format to SLINEAR\n");
 		ast_free(state);
 		return NULL;
@@ -7927,7 +7959,7 @@
 
 	ast_debug(1, "Stopped silence generator on '%s'\n", chan->name);
 
-	if (ast_set_write_format(chan, state->old_write_format) < 0)
+	if (ast_set_write_format(chan, &state->old_write_format) < 0)
 		ast_log(LOG_ERROR, "Could not return write format to its original state\n");
 
 	ast_free(state);

Modified: team/dvossel/fixtheworld_phase1_step3/main/format_cap.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step3/main/format_cap.c?view=diff&rev=300715&r1=300714&r2=300715
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/main/format_cap.c (original)
+++ team/dvossel/fixtheworld_phase1_step3/main/format_cap.c Wed Jan  5 15:06:35 2011
@@ -261,7 +261,7 @@
 	return 0;
 }
 
-struct ast_cap *ast_cap_has_joint(struct ast_cap *cap1, struct ast_cap *cap2)
+int ast_cap_has_joint(struct ast_cap *cap1, struct ast_cap *cap2)
 {
 	struct ao2_iterator it;
 	struct ast_format *tmp;
@@ -283,6 +283,29 @@
 	return data->joint_found ? 1 : 0;
 }
 
+int ast_cap_identical(struct ast_cap *cap1, struct ast_cap *cap2)
+{
+	struct ao2_iterator it;
+	struct ast_format *tmp;
+
+	if (ao2_count(ca1->formats) != ao2_count(cap2->formats)) {
+		return 0; /* if they are not the same size, they are not identical */
+	}
+
+	it = ao2_iterator_init(cap1->formats, 0);
+	while ((tmp = ao2_iterator_next(&it))) {
+		if (!ast_cap_iscompatible(cap, &tmp)) {
+			ao2_ref(tmp, -1);
+			ao2_iterator_destroy(&it);
+			return 0;
+		}
+		ao2_ref(tmp, -1);
+	}
+	ao2_iterator_destroy(&it);
+
+	return 1;
+}
+
 struct ast_cap *ast_cap_joint(struct ast_cap *cap1, struct ast_cap *cap2)
 {
 	struct ao2_iterator it;




More information about the svn-commits mailing list