Revision
16725
Author
anthm
Date
2010-02-22 16:42:29 -0600 (Mon, 22 Feb 2010)

Log Message

small timer test tweak for horribly clocked boxen

Modified Paths

Diff

Modified: freeswitch/trunk/src/switch_time.c (16724 => 16725)


--- freeswitch/trunk/src/switch_time.c	2010-02-22 22:13:59 UTC (rev 16724)
+++ freeswitch/trunk/src/switch_time.c	2010-02-22 22:42:29 UTC (rev 16725)
@@ -181,12 +181,20 @@
 {
 	int x;
 	switch_interval_time_t avg, val = 1000, want = 1000;
-	int over = 0, under = 0, good = 0, step = 50, diff = 0, retry = 0, lastgood = 0;
+	int over = 0, under = 0, good = 0, step = 50, diff = 0, retry = 0, lastgood = 0, one_k = 0;
 
 #ifdef HAVE_CLOCK_GETRES
 	struct timespec ts;
+	long res = 0;
 	clock_getres(CLOCK_MONOTONIC, &ts);
-	if (ts.tv_nsec / 1000 > 1500) {
+	res = ts.tv_nsec / 1000;
+
+
+	if (res > 900 && res < 1100) {
+		one_k = 1;
+	}
+	
+	if (res > 1500) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING,
 						  "Timer resolution of %ld microseconds detected!\n"
 						  "Do you have your kernel timer set to higher than 1 kHz? You may experience audio problems.\n", ts.tv_nsec / 1000);
@@ -260,6 +268,10 @@
 		OFFSET = (int) (want - lastgood);
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Timer offset of %d calculated (fallback)\n", OFFSET);
 		switch_time_set_cond_yield(SWITCH_TRUE);
+	} else if (one_k) {
+		OFFSET = 900;
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Timer offset CANNOT BE DETECTED, forcing OFFSET to 900\n");
+		switch_time_set_cond_yield(SWITCH_TRUE);
 	} else {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Timer offset NOT calculated\n");
 		switch_time_set_cond_yield(SWITCH_TRUE);