_really_ fix IAX2 crazy timestamp problem (bug #4747)
authorKevin P. Fleming <kpfleming@digium.com>
Wed, 20 Jul 2005 22:46:58 +0000 (22:46 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Wed, 20 Jul 2005 22:46:58 +0000 (22:46 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6180 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_iax2.c

index 2062b9f..93d2726 100755 (executable)
@@ -3380,6 +3380,7 @@ static unsigned int calc_timestamp(struct chan_iax2_pvt *p, unsigned int ts, str
        int ms;
        int voice = 0;
        int genuine = 0;
+       int adjust;
        struct timeval *delivery = NULL;
 
 
@@ -3421,8 +3422,15 @@ static unsigned int calc_timestamp(struct chan_iax2_pvt *p, unsigned int ts, str
                        if (p->notsilenttx && abs(ms - p->nextpred) <= MAX_TIMESTAMP_SKEW) {
                                /* Adjust our txcore, keeping voice and 
                                        non-voice synchronized */
-                               p->offset = ast_tvadd(p->offset,
-                                               ast_samp2tv((ms - p->nextpred)/10, 1000)); /* XXX what scale is this ??? */
+                               /* We need someone who understands this code to comment here on
+                                  why the 'adjust' value is handled as if it was in units
+                                  of 10,000 microseconds, instead of milliseconds
+                               */
+                               adjust = (ms - p->nextpred);
+                               if (adjust < 0)
+                                       p->offset = ast_tvsub(p->offset, ast_samp2tv(abs(adjust), 10000));
+                               else if (adjust > 0)
+                                       p->offset = ast_tvadd(p->offset, ast_samp2tv(adjust, 10000));
 
                                if (!p->nextpred) {
                                        p->nextpred = ms; /*f->samples / 8;*/