Revision
15797
Author
anthm
Date
2009-12-04 16:06:03 -0600 (Fri, 04 Dec 2009)

Log Message

dont mix ptimes in the codec string lists, just discard conflicting ones

Modified Paths

Diff

Modified: freeswitch/trunk/src/switch_loadable_module.c (15796 => 15797)


--- freeswitch/trunk/src/switch_loadable_module.c	2009-12-04 21:25:57 UTC (rev 15796)
+++ freeswitch/trunk/src/switch_loadable_module.c	2009-12-04 22:06:03 UTC (rev 15797)
@@ -1414,7 +1414,7 @@
 	switch_hash_index_t *hi;
 	void *val;
 	switch_codec_interface_t *codec_interface;
-	int i = 0;
+	int i = 0, lock = 0;
 	const switch_codec_implementation_t *imp;
 
 	switch_mutex_lock(loadable_modules.mutex);
@@ -1423,6 +1423,10 @@
 		codec_interface = (switch_codec_interface_t *) val;
 		/* Look for a 20ms implementation because it's the safest choice */
 		for (imp = codec_interface->implementations; imp; imp = imp->next) {
+			if (lock && imp->microseconds_per_packet != lock) {
+				continue;
+			}
+
 			if (imp->microseconds_per_packet / 1000 == 20) {
 				array[i++] = imp;
 				goto found;
@@ -1433,6 +1437,8 @@
 
 	  found:
 
+		if (!lock) lock = array[i-1]->microseconds_per_packet;
+
 		if (i > arraylen) {
 			break;
 		}
@@ -1446,7 +1452,7 @@
 
 SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(const switch_codec_implementation_t **array, int arraylen, char **prefs, int preflen)
 {
-	int x, i = 0;
+	int x, i = 0, lock = 0;
 	switch_codec_interface_t *codec_interface;
 	const switch_codec_implementation_t *imp;
 
@@ -1482,49 +1488,56 @@
 		if ((codec_interface = switch_loadable_module_get_codec_interface(name)) != 0) {
 			/* If no specific codec interval is requested opt for 20ms above all else because lots of stuff assumes it */
 			for (imp = codec_interface->implementations; imp; imp = imp->next) {
-				uint8_t match = 1;
 				
 				if (imp->codec_type != SWITCH_CODEC_TYPE_VIDEO) {
+					if (lock && imp->microseconds_per_packet != lock) {
+						continue;
+					}
 
 					if ((!interval && (uint32_t) (imp->microseconds_per_packet / 1000) != 20) || 
 						(interval && (uint32_t) (imp->microseconds_per_packet / 1000) != interval)) {
-						match = 0;
+						continue;
 					}
 
-					if (match && ((!rate && (uint32_t) imp->samples_per_second != 8000) || (rate && (uint32_t) imp->samples_per_second != rate))) {
-						match = 0;
+					if (((!rate && (uint32_t) imp->samples_per_second != 8000) || (rate && (uint32_t) imp->samples_per_second != rate))) {
+						continue;
 					}
 				}
 
-				if (match) {
-					array[i++] = imp;
-					goto found;
-				}
+
+				array[i++] = imp;
+				goto found;
+
 			}
 
 			/* Either looking for a specific interval or there was no interval specified and there wasn't one @20ms available */
 			for (imp = codec_interface->implementations; imp; imp = imp->next) {
-				uint8_t match = 1;
-
 				if (imp->codec_type != SWITCH_CODEC_TYPE_VIDEO) {
 
+					if (lock && imp->microseconds_per_packet != lock) {
+						continue;
+					}
+
 					if (interval && (uint32_t) (imp->microseconds_per_packet / 1000) != interval) {
-						match = 0;
+						continue;
 					}
 					
-					if (match && rate && (uint32_t) imp->samples_per_second != rate) {
-						match = 0;
+					if (rate && (uint32_t) imp->samples_per_second != rate) {
+						continue;
 					}
 				}
 
-				if (match) {
-					array[i++] = imp;
-					goto found;
-				}
+				array[i++] = imp;
+				goto found;
+
 			}
 
 		  found:
 
+			if (!lock) {
+				lock = array[i-1]->microseconds_per_packet;
+			}
+
 			UNPROTECT_INTERFACE(codec_interface);
 
 			if (i > arraylen) {