[Asterisk-Dev] Fix for file playback

Michael Manousos manousos at inaccessnetworks.com
Wed Jul 16 08:40:18 MST 2003


This patch fixes the playback of the prompt files for
machines that do not have any zaptel hardware (real or dummy).
Mark, consider it disclaimed and feel free to apply it
in the CVS.

Michael.


-------------- next part --------------
Index: sched.c
===================================================================
RCS file: /usr/cvsroot/asterisk/sched.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 sched.c
--- sched.c	12 Feb 2003 13:59:13 -0000	1.1.1.1
+++ sched.c	16 Jul 2003 15:32:22 -0000
@@ -180,13 +180,36 @@
 
 static inline int sched_settime(struct timeval *tv, int when)
 {
-	if (gettimeofday(tv, NULL) < 0) {
-			/* This shouldn't ever happen, but let's be sure */
-			ast_log(LOG_NOTICE, "gettimeofday() failed!\n");
-			return -1;
+	struct timeval tv_tmp;
+	long error_sec, error_usec;
+
+	if (gettimeofday(&tv_tmp, NULL) < 0) {
+		/* This shouldn't ever happen, but let's be sure */
+		ast_log(LOG_NOTICE, "gettimeofday() failed!\n");
+		return -1;
+	}
+	/*ast_log(LOG_DEBUG, "TV -> %lu,%lu\n", tv->tv_sec, tv->tv_usec);*/
+	if (((unsigned long)(tv->tv_sec) > 0)&&((unsigned long)(tv->tv_usec) > 0)) {
+		if ((unsigned long)(tv_tmp.tv_usec) < (unsigned long)(tv->tv_usec)) {
+			tv_tmp.tv_usec += 1000000;
+			tv_tmp.tv_sec -= 1;
+		}
+		error_sec = (unsigned long)(tv_tmp.tv_sec) - (unsigned long)(tv->tv_sec);
+		error_usec = (unsigned long)(tv_tmp.tv_usec) - (unsigned long)(tv->tv_usec);
+	} else {
+		/*ast_log(LOG_DEBUG, "Initializing error\n");*/
+		error_sec = 0;
+		error_usec = 0;
+	}
+	/*ast_log(LOG_DEBUG, "ERROR -> %lu,%lu\n", error_sec, error_usec);*/
+	if (error_sec * 1000 + error_usec / 1000 < when) {
+		tv->tv_sec = tv_tmp.tv_sec + (when/1000 - error_sec);
+		tv->tv_usec = tv_tmp.tv_usec + ((when % 1000) * 1000 - error_usec);
+	} else {
+		ast_log(LOG_NOTICE, "Request to schedule in the past?!?!\n");
+		tv->tv_sec = tv_tmp.tv_sec;
+		tv->tv_usec = tv_tmp.tv_usec;
 	}
-	tv->tv_sec += when/1000;
-	tv->tv_usec += (when % 1000) * 1000;
 	if (tv->tv_usec > 1000000) {
 		tv->tv_sec++;
 		tv->tv_usec-= 1000000;
@@ -210,6 +233,8 @@
 		tmp->callback = callback;
 		tmp->data = data;
 		tmp->resched = when;
+		tmp->when.tv_sec = 0;
+		tmp->when.tv_usec = 0;
 		if (sched_settime(&tmp->when, when)) {
 			sched_release(con, tmp);
 			return -1;


More information about the asterisk-dev mailing list