Fix a bug when using zaptel timing for playing back files that have a sample rate
authorRussell Bryant <russell@russellbryant.com>
Thu, 20 Mar 2008 20:08:26 +0000 (20:08 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 20 Mar 2008 20:08:26 +0000 (20:08 +0000)
other than 8 kHz.  The issue here is that format modules give a "whennext" sample
value, which is used to calculate when to set a timer for to retrieve the next
frame.  However, the zaptel timer operates on 8 kHz samples, so this must be taken
into account.

(another part of issue #12164, reported by milazzo and jsmith, patch by me)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@110303 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/file.c

index 1bec4fc..73387a2 100644 (file)
@@ -665,9 +665,17 @@ static enum fsread_res ast_readaudio_callback(struct ast_filestream *s)
        }
        if (whennext != s->lasttimeout) {
 #ifdef HAVE_ZAPTEL
-               if (s->owner->timingfd > -1)
-                       ast_settimeout(s->owner, whennext, ast_fsread_audio, s);
-               else
+               if (s->owner->timingfd > -1) {
+                       int zap_timer_samples = whennext;
+                       int rate;
+                       /* whennext is in samples, but zaptel timers operate in 8 kHz samples. */
+                       if ((rate = ast_format_rate(s->fmt->format)) != 8000) {
+                               float factor;
+                               factor = ((float) rate) / ((float) 8000.0); 
+                               zap_timer_samples = (int) ( ((float) zap_timer_samples) / factor );
+                       }
+                       ast_settimeout(s->owner, zap_timer_samples, ast_fsread_audio, s);
+               } else
 #endif         
                        s->owner->streamid = ast_sched_add(s->owner->sched, 
                                whennext / (ast_format_rate(s->fmt->format) / 1000), ast_fsread_audio, s);