aboutsummaryrefslogtreecommitdiffstats
path: root/main/file.c
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-03-20 20:08:26 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-03-20 20:08:26 +0000
commit96e830497052e2b14dbad4303cbf1ed9d0e21a8a (patch)
tree0cb8b23b20da4971801ad47db9f910cc4bfeeddf /main/file.c
parente1c50566afb7f419b64b48296fb455cde1047c3f (diff)
Fix a bug when using zaptel timing for playing back files that have a sample rate
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: http://svn.digium.com/svn/asterisk/trunk@110303 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/file.c')
-rw-r--r--main/file.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/main/file.c b/main/file.c
index 1bec4fca4..73387a2ff 100644
--- a/main/file.c
+++ b/main/file.c
@@ -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);