Revision
17151
Author
mikej
Date
2010-03-30 18:20:26 -0500 (Tue, 30 Mar 2010)

Log Message

added load/noload options for the supported codecs

Modified Paths

Diff

Modified: freeswitch/trunk/conf/autoload_configs/sangoma_codec.conf.xml (17150 => 17151)


--- freeswitch/trunk/conf/autoload_configs/sangoma_codec.conf.xml	2010-03-30 23:20:18 UTC (rev 17150)
+++ freeswitch/trunk/conf/autoload_configs/sangoma_codec.conf.xml	2010-03-30 23:20:26 UTC (rev 17151)
@@ -1,11 +1,23 @@
 <configuration name="sangoma_codec.conf" description="Sangoma Codec Configuration">
 
 	<settings>
-		<!-- nothing to put here yet -->
+		<!--
+		Comma separated list of codecs to register with FreeSWITCH, 
+		by default (if this parameter is not set) all available codecs are registered.
+		Valid codec values are: PCMU,PCMA,L16,G729,G726-32,GSM
+		<param name="load" value="all"/>
+		-->
+
+		<!-- List of codecs to not register with FreeSWITCH, by default this is empty,
+	        but you may want to not load PCMU and PCMA or may be others to not use your 
+	        vocallo resources in codecs that are done well and fast in software.	
+		<param name="noload" value="PCMU,PCMA"/>
+		-->
 	</settings>
 
 	<vocallos> 
 
+		<!-- The name of the vocallo is the ethernet device name as displayed by ifconfig -->
 		<vocallo name="eth5">
 			<!-- Starting UDP port for the vocallo -->
 			<param name="baseudp" value="5000"/>

Modified: freeswitch/trunk/src/mod/codecs/mod_sangoma_codec/Makefile (17150 => 17151)


--- freeswitch/trunk/src/mod/codecs/mod_sangoma_codec/Makefile	2010-03-30 23:20:18 UTC (rev 17150)
+++ freeswitch/trunk/src/mod/codecs/mod_sangoma_codec/Makefile	2010-03-30 23:20:26 UTC (rev 17151)
@@ -1,3 +1,3 @@
 BASE=../../../..
-LOCAL_LDFLAGS += -lsangoma_transcode
+LOCAL_LDFLAGS += -lsng-tc
 include $(BASE)/build/modmake.rules

Modified: freeswitch/trunk/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c (17150 => 17151)


--- freeswitch/trunk/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c	2010-03-30 23:20:18 UTC (rev 17150)
+++ freeswitch/trunk/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c	2010-03-30 23:20:26 UTC (rev 17151)
@@ -35,7 +35,7 @@
 #include "switch.h"
 #include "g711.h"
 
-#include <sangoma_transcode.h>
+#include <sng_tc/sng_tc.h>
 
 #ifdef __linux__
 /* for ethernet device query */
@@ -101,13 +101,21 @@
 	{ SNGTC_CODEC_G729AB,  18,  "G729",    "Sangoma G729",      40, 8000,   10000, 80,  160, 10,  1 },
 	{ SNGTC_CODEC_G726_32, 122, "G726-32", "Sangoma G.726 32k", 40, 32000,  10000, 80,  160, 40,  1 },
 	{ SNGTC_CODEC_GSM_FR,  3,   "GSM",     "Sangoma GSM",       20, 13200,  20000, 160, 320, 33,  0 },
+#if 0
 	/* FIXME: grandstream crashes with iLBC implementation */
 	{ SNGTC_CODEC_ILBC,    97,  "iLBC",    "Sangoma ILBC",      -1, -1,     -1,    -1,  -1,  -1,  0 },
 	/* FIXME: sampling rate seems wrong with this, audioooo soooundssssss sloooooow ... */
 	{ SNGTC_CODEC_G722,    9,   "G722",    "Sangoma G722",      20, 64000,  20000, 160, 640, 160, 0 },
+#endif
 	{ -1,                  -1,  NULL,      NULL,                -1, -1,     -1,    -1,  -1,      -1 },
 };
 
+/* default codec list to load, users may override, special codec 'all' loads everything available unless listed in noload */
+static char g_codec_load_list[1024] = "all";
+
+/* default codec list to NOT load, users may override */
+static char g_codec_noload_list[1024] = "";
+
 struct codec_data {
 	/* sngtc request and reply */
 	sngtc_codec_request_t request;
@@ -206,8 +214,8 @@
 	rtp_session = switch_rtp_new(local_ip, rtp_port, 
 			codec_ip, codec_reply_leg->codec_udp_port, 
 			iana,
-			codec_reg_leg->ms*8, /* samples per interval, FIXME: do based on sampling rate */
-			codec_reg_leg->ms*1000, /* ms per packet */
+			sess->impl->samples_per_packet,
+			codec_reg_leg->ms*1000, /* microseconds per packet */
 			flags, NULL, &err, g_pool);
 
 	if (!rtp_session) {
@@ -845,6 +853,21 @@
 
 	if ((settings = switch_xml_child(cfg, "settings"))) {
 		/* nothing here yet */
+		for (param = switch_xml_child(settings, "param"); param; param = param->next) {
+				char *var = (char *)switch_xml_attr_soft(param, "name");
+				char *val = (char *)switch_xml_attr_soft(param, "value");
+
+				/* this parameter overrides the default list of codecs to load */
+				if (!strcasecmp(var, "load")) {
+					strncpy(g_codec_load_list, val, sizeof(g_codec_load_list)-1);
+					g_codec_load_list[sizeof(g_codec_load_list)-1] = 0;
+				} else if (!strcasecmp(var, "noload")) {
+					strncpy(g_codec_noload_list, val, sizeof(g_codec_noload_list)-1);
+					g_codec_noload_list[sizeof(g_codec_noload_list)-1] = 0;
+				} else {
+					switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Ignored unknown Sangoma codec setting %s\n", var);
+				}
+		}
 	}
 
 	if ((vocallos = switch_xml_child(cfg, "vocallos"))) {
@@ -888,7 +911,7 @@
 					}
 					g_init_cfg.host_nic_vocallo_cfg[vidx].vocallo_ip = ntohl(vocallo_base_ip.s_addr);
 				} else {
-					switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Ignored unknown Sangoma codec setting %s\n", val);
+					switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Ignored unknown Sangoma vocallo setting %s\n", var);
 				}
 			}
 
@@ -966,11 +989,28 @@
 	*module_interface = switch_loadable_module_create_module_interface(pool, modname);
 
 
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Loading codecs, load='%s', noload='%s'\n", g_codec_load_list, g_codec_noload_list);
 	for (c = 0; g_codec_map[c].codec_id != -1; c++) {
 
+		/* check if the codec is in the load list, otherwise skip it */
+		if (strcasecmp(g_codec_load_list, "all") && !strcasestr(g_codec_load_list, g_codec_map[c].iana_name)) {
+			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Not loading codec %s because was not found in the load list\n", 
+					g_codec_map[c].iana_name);
+			continue;
+		}
+
+		/* load it unless is named in the noload list */
+		if (strcasestr(g_codec_noload_list, g_codec_map[c].iana_name)) {
+			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Not loading codec %s because was not found in the noload list\n", 
+					g_codec_map[c].iana_name);
+			continue;
+		}
+
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Registering implementations for codec %s\n", g_codec_map[c].iana_name);
+
 		/* let know the library which iana to use */
 		sngtc_set_iana_code_based_on_codec_id(g_codec_map[c].codec_id, g_codec_map[c].iana);
-		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Mapped codec %d to IANA %d\n", g_codec_map[c].codec_id, g_codec_map[c].iana);
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Mapped codec %d to IANA %d\n", g_codec_map[c].codec_id, g_codec_map[c].iana);
 
 		/* SWITCH_ADD_CODEC allocates a codec interface structure from the pool the core gave us and adds it to the internal interface 
 		 * list the core keeps, gets a codec id and set the given codec name to it.