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

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Jan 12 12:32:17 CST 2011


Author: dvossel
Date: Wed Jan 12 12:32:13 2011
New Revision: 301578

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=301578
Log:
updates chan_local for ast_format conversion 

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

Modified: team/dvossel/fixtheworld_phase1_step3/channels/chan_local.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step3/channels/chan_local.c?view=diff&rev=301578&r1=301577&r2=301578
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/channels/chan_local.c (original)
+++ team/dvossel/fixtheworld_phase1_step3/channels/chan_local.c Wed Jan 12 12:32:13 2011
@@ -88,7 +88,7 @@
 	.target_extra = -1,
 };
 
-static struct ast_channel *local_request(const char *type, format_t format, const struct ast_channel *requestor, void *data, int *cause);
+static struct ast_channel *local_request(const char *type, struct ast_cap *cap, const struct ast_channel *requestor, void *data, int *cause);
 static int local_digit_begin(struct ast_channel *ast, char digit);
 static int local_digit_end(struct ast_channel *ast, char digit, unsigned int duration);
 static int local_call(struct ast_channel *ast, char *dest, int timeout);
@@ -109,7 +109,6 @@
 static const struct ast_channel_tech local_tech = {
 	.type = "Local",
 	.description = tdesc,
-	.capabilities = -1,
 	.requester = local_request,
 	.send_digit_begin = local_digit_begin,
 	.send_digit_end = local_digit_end,
@@ -138,15 +137,15 @@
 
 */
 struct local_pvt {
-	unsigned int flags;                     /*!< Private flags */
-	char context[AST_MAX_CONTEXT];		/*!< Context to call */
-	char exten[AST_MAX_EXTENSION];		/*!< Extension to call */
-	int reqformat;				/*!< Requested format */
-	struct ast_jb_conf jb_conf;		/*!< jitterbuffer configuration for this local channel */
-	struct ast_channel *owner;		/*!< Master Channel - Bridging happens here */
-	struct ast_channel *chan;		/*!< Outbound channel - PBX is run here */
-	struct ast_module_user *u_owner;	/*!< reference to keep the module loaded while in use */
-	struct ast_module_user *u_chan;		/*!< reference to keep the module loaded while in use */
+	unsigned int flags;             /*!< Private flags */
+	char context[AST_MAX_CONTEXT];  /*!< Context to call */
+	char exten[AST_MAX_EXTENSION];  /*!< Extension to call */
+	struct ast_cap *reqcap;         /*!< Requested format capabilities */
+	struct ast_jb_conf jb_conf;     /*!< jitterbuffer configuration for this local channel */
+	struct ast_channel *owner;      /*!< Master Channel - Bridging happens here */
+	struct ast_channel *chan;       /*!< Outbound channel - PBX is run here */
+	struct ast_module_user *u_owner;/*!< reference to keep the module loaded while in use */
+	struct ast_module_user *u_chan; /*!< reference to keep the module loaded while in use */
 };
 
 #define LOCAL_ALREADY_MASQED  (1 << 0) /*!< Already masqueraded */
@@ -955,12 +954,16 @@
 }
 
 /*! \brief Create a call structure */
-static struct local_pvt *local_alloc(const char *data, int format)
+static struct local_pvt *local_alloc(const char *data, struct ast_cap *cap)
 {
 	struct local_pvt *tmp = NULL;
 	char *c = NULL, *opts = NULL;
 
 	if (!(tmp = ao2_alloc(sizeof(*tmp), NULL))) {
+		return NULL;
+	}
+	if (!(tmp->reqcap = ast_cap_copy(cap))) {
+		ao2_ref(tmp, -1);
 		return NULL;
 	}
 
@@ -995,9 +998,6 @@
 		*c++ = '\0';
 
 	ast_copy_string(tmp->context, c ? c : "default", sizeof(tmp->context));
-
-	tmp->reqformat = format;
-
 #if 0
 	/* We can't do this check here, because we don't know the CallerID yet, and
 	 * the CallerID could potentially affect what step is actually taken (or
@@ -1019,7 +1019,8 @@
 static struct ast_channel *local_new(struct local_pvt *p, int state, const char *linkedid)
 {
 	struct ast_channel *tmp = NULL, *tmp2 = NULL;
-	int randnum = ast_random() & 0xffff, fmt = 0;
+	int randnum = ast_random() & 0xffff;
+	struct ast_format fmt;
 	const char *t;
 	int ama;
 
@@ -1045,19 +1046,19 @@
 
 	tmp2->tech = tmp->tech = &local_tech;
 
-	tmp->nativeformats = p->reqformat;
-	tmp2->nativeformats = p->reqformat;
+	ast_cap_append(p->reqcap, tmp->nativeformats);
+	ast_cap_append(p->reqcap, tmp2->nativeformats);
 
 	/* Determine our read/write format and set it on each channel */
-	fmt = ast_best_codec(p->reqformat);
-	tmp->writeformat = fmt;
-	tmp2->writeformat = fmt;
-	tmp->rawwriteformat = fmt;
-	tmp2->rawwriteformat = fmt;
-	tmp->readformat = fmt;
-	tmp2->readformat = fmt;
-	tmp->rawreadformat = fmt;
-	tmp2->rawreadformat = fmt;
+	ast_best_codec(p->reqcap, &fmt);
+	ast_format_copy(&fmt, &tmp->writeformat);
+	ast_format_copy(&fmt, &tmp2->writeformat);
+	ast_format_copy(&fmt, &tmp->rawwriteformat);
+	ast_format_copy(&fmt, &tmp2->rawwriteformat);
+	ast_format_copy(&fmt, &tmp->readformat);
+	ast_format_copy(&fmt, &tmp2->readformat);
+	ast_format_copy(&fmt, &tmp->rawreadformat);
+	ast_format_copy(&fmt, &tmp2->rawreadformat);
 
 	tmp->tech_pvt = p;
 	tmp2->tech_pvt = p;
@@ -1079,13 +1080,13 @@
 }
 
 /*! \brief Part of PBX interface */
-static struct ast_channel *local_request(const char *type, format_t format, const struct ast_channel *requestor, void *data, int *cause)
+static struct ast_channel *local_request(const char *type, struct ast_cap *cap, const struct ast_channel *requestor, void *data, int *cause)
 {
 	struct local_pvt *p = NULL;
 	struct ast_channel *chan = NULL;
 
 	/* Allocate a new private structure and then Asterisk channel */
-	if ((p = local_alloc(data, format))) {
+	if ((p = local_alloc(data, cap))) {
 		if (!(chan = local_new(p, AST_STATE_DOWN, requestor ? requestor->linkedid : NULL))) {
 			ao2_unlink(locals, p);
 		}
@@ -1197,7 +1198,14 @@
 /*! \brief Load module into PBX, register channel */
 static int load_module(void)
 {
+	struct ast_channel_tech *tmp = (struct ast_channel_tech *) &local_tech;
+	if (!(tmp->capabilities = ast_cap_alloc())) {
+		return AST_MODULE_LOAD_FAILURE;
+	}
+	ast_cap_add_all(tmp->capabilities);
+
 	if (!(locals = ao2_container_alloc(BUCKET_SIZE, NULL, locals_cmp_cb))) {
+		ast_cap_destroy(tmp->capabilities);
 		return AST_MODULE_LOAD_FAILURE;
 	}
 
@@ -1205,6 +1213,7 @@
 	if (ast_channel_register(&local_tech)) {
 		ast_log(LOG_ERROR, "Unable to register channel class 'Local'\n");
 		ao2_ref(locals, -1);
+		ast_cap_destroy(tmp->capabilities);
 		return AST_MODULE_LOAD_FAILURE;
 	}
 	ast_cli_register_multiple(cli_local, sizeof(cli_local) / sizeof(struct ast_cli_entry));
@@ -1234,6 +1243,7 @@
 	ao2_iterator_destroy(&it);
 	ao2_ref(locals, -1);
 
+	ast_cap_destroy(local_tech.capabilities);
 	return 0;
 }
 

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=301578&r1=301577&r2=301578
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h (original)
+++ team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h Wed Jan 12 12:32:13 2011
@@ -67,6 +67,10 @@
 void ast_cap_add_all_by_type(struct ast_cap *cap, enum ast_format_type type);
 
 /*!
+ * \brief Add all known formats to the capabilities structure using default format attribute. */
+void ast_cap_add_all(struct ast_cap *cap);
+
+/*!
  * \brief Append the formats in src to dst
  */
 void ast_cap_append(struct ast_cap *src, struct ast_cap *dst);

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=301578&r1=301577&r2=301578
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/main/format_cap.c (original)
+++ team/dvossel/fixtheworld_phase1_step3/main/format_cap.c Wed Jan 12 12:32:13 2011
@@ -117,6 +117,18 @@
 	}
 }
 
+void ast_cap_add_all(struct ast_cap *cap)
+{
+	int x;
+	size_t f_len = 0;
+	struct ast_format tmp_fmt;
+	const struct ast_format_list *f_list = ast_get_format_list(&f_len);
+
+	for (x = 0; x < f_len; x++) {
+		ast_cap_add(cap, ast_format_set(&tmp_fmt, f_list[x].id, 0));
+	}
+}
+
 void ast_cap_append(struct ast_cap *src, struct ast_cap *dst)
 {
 	struct ast_format tmp_fmt;




More information about the svn-commits mailing list