On Thursday 23 March 2006 02:29, Reza - Asterisk Enthusiast wrote:
> My question is quite simple:  What is the real purpose of a "timing device"
> for Asterisk, and in this * case, what really is a "timer".   Is it just a
> traditional "timing" device keeping track of time etc...  or something
> more?

As Jim mentioned, the telephone network requires a "metronome" to ensure that 
all points are in sync with each other.  That's the purpose of this timing 
device.  It's a periodic tap on the shoulder saying "you need to do something 
now," except when it comes to telephony it's not just your wife tapping you 
on the shoulder every five minutes hoping that this time you'll put the 
computer down and do what needs to be done; it's an 80-year old German nun 
with a Swiss time institute-calibrated stopwatch and a big bruise-inducing 
wooden spoon tapping you on the shoulder at PRECISE and CAREFULLY MEASURED 
intervals.  When she taps, you must accept an audio frame from her (well 8, 
see below) and you must also give her an 8 audio frames.  If you don't, she 
is going to beat you with that spoon. 

That's kind of what it's like with telephony.  When the clock says it's time 
to move, you must move.  You must exchange a full frame of information (I'm 
simplifying here, but I can get obscenely technical if you like) or you will 
have a condition known as a frame slip -- either you will drop information 
from them, or they will get partial information from you.  Either way it's 
bad.   Your conversations start to get little buzzes and chirps in them, or 
you can get a fragment of someone else's conversation in your own, etc.  You 
don't want to do that, you want to work in lock-step with whoever you're 
connected to.  The timing devices provide the mechanism or drumbeat to make 
sure you work this way.

> We all take it for granted that it provides some sort of timing
> feature/mechanism that is needed for Asterisk to function properly, if we
> wish to have the MeetMe function or the Music On Hold function...  to
> supposedly improve the sound quality of the music when MoH is activated.

It's the nun I mentioned above.  It's the mechanism that Asterisk uses to 
ensure that the voice traffic is handled in lock-step with the rest of the 
system.

> The exact same answers I have continued to receive is, "You need the timing
> device for the MoH & MeetMe function...  if you want * to work well...  you
> need it...  you have no choice...  ztdummy isn't good enough so it's best
> that you have a zaptel hardware to provide accurate timing capability".  
> -- and of course my question comes back to "what is this timing capability"
> and then there is no answer.

Telephony works on a 125us period.  That's 8000 "exchanges of information" a 
second.  Zaptel processes 8 of these at a time to try and get the interrupt 
rate down to a more reasonable level, which is why you get 1000 interrupts a 
second with Zaptel.

Computers are powers-of-two systems.  As such, almost everything revolves 
around some 2^n number.  RTC and USB clock sources are no exception.  You can 
get a 1024Hz interrupt out of the RTC or USB, but you can't get 1000Hz.  If 
it sounds like it's "close enough" it isn't.  You are pressing to exchange 
information (in this case 8 audio frames) faster than that data is actually 
available.  Over the course of a second, you want to process 24*8 more frames 
than anyone else you're connected to.  They either return a "bugger off" 
return code to you or they fake the information.  Either way it sounds bad.

The newer ztdummy code does try to smooth this out by dropping interrupts to 
try and maintain an overall 1000Hz interrupt rate, but it's still not 
perfect.  There is some mention of a software phase-locked-loop 
implementation for ztdummy that should help quite a bit, but I haven't seen 
any code for it yet.  Ultimately you want 1000 interrupts a second and if you 
don't have EXACTLY 1000 interrupts per second, you will eventually slip 
frames and your voice quality will go down.  The more often you slip, the 
worse it will sound.

Remember that MeetMe (for example) is mixing an arbitrary number of audio 
sources.  Everyone has to agree on how much data per interval they are going 
to send.  If everyone sends 20ms of data at a time everything is great and it 
sounds good.  However if you have some SIP phones sending enough data for 
20ms and Asterisk is taking that and mixing it together just slightly faster 
than 20ms (in the case of ztdummy), or if you have some phones sending 20ms 
of data at a time and another Asterisk system sending 20ms of data every 18ms 
(duplicating or fudging data to make it fit) and the box running MeetMe is 
mixing everything every 977us instead of every 1000us...  well you can see 
how this becomes a nasty little problem.   It's like trying to put a puzzle 
together after your kids have taken every puzzle in the house and mixed it 
into one box.  (not that this has ever happened with my kids, nooooo.)  It'll 
almost work, but it just won't be as pretty as it could be if you just had 
pieces of all the same size, and from only one puzzle.

> So...  here are my questions again in brief:
>   1.. What really is a Timing Device in Asterisk?
>   2.. Why do we need this for the MoH & MeetMe function?

Answered above.

>   3.. Is ztdummy good enough in a 100% VOIP setting (100% of traffic is
> through your NIC)? 4.. Does ztdummy have any limitations when compared to
> timing devices in ZAPTEL interfaces? 5.. Does ztdummy utilize a lot of CPU
> process?

Ztdummy isn't required for 100% VOIP systems unless MeetMe or MOH is used, for 
the reasons outlined above.  Until (very) recently, Asterisk relied on the 
far-end to send packets at exact intervals, because Asterisk used the packets 
themselves as the timing source.  For anything on the LAN this is okay, but 
as soon as you introduce lag or jitter or dropped packets, things fall apart 
fast.  The SIP and IAX2 jitter buffers are "self-timed" meaning they use an 
internal timer to schedule when audio must be squirted out, which is the 
proper way to do this.

If there is no audio to send when it's time (i.e. when that nun taps you on 
the shoulder and you don't have something to give her) what do you do?  You 
can't give her nothing so you either fake it and give her an approximation of 
what you think the finished product should be (this is called Packet Loss 
Concealment, very cool), or you give her a copy of the last bit of 
information and hope she doesn't notice, or you might give her an empty 
shell, but you give her something.  Thankfully the nun doesn't care what you 
give her, but she will take that to someone else and give it to them, and if 
it doesn't have what was expected, they'll start doing things like asking 
"Pardon?  I didn't make out that last word.  What did you say?" and 
eventually "Your phone system sucks.  I'm going to call Jim and ask him for a 
Norstar system, because VOIP just sucks."

>   6.. Technically the ztdummy under Linux 2.4 utilizes the UHCI-USB which
> is the hardware minus the FXO/FXS - so why would ztdummy not be good
> enough?

This is incorrect.  UHCI is the host-side.  Certain USB host controllers have 
a timer on them which ztdummy can use.  It's like the RTC driver though -- 
powers of two are in vogue, not powers of ten.  So 1024Hz is what you get, 
not 1000Hz.

> 7.. In Linux 2.6, according to " 
> http://www.voip-info.org/wiki/view/Asterisk+timer ", ztdummy uses high
> resolution kernel timer.  Is this "high res. kernel timer", 100% software
> driven, or takes advantage of the internal hardware clock on the
> motherboard or takes advantage of the UHCI/OHCI USB controller? I guess
> people who work with or write device drivers will truly appreciate my
> questions.  Would love to hear thoughts & inputs on these theoritical
> questions, my soul is seeking for, up until it finds other things to ponder
> about :)

Basically the kernel has the resources to provide a good 1000Hz software 
interrupt.  I believe that the original decision to tie MeetMe/MOH to zaptel 
was to try and lock people into Digium hardware.  Software timers are good 
enough for most applications.  Anytime you are tying to the PSTN through 
digital means (PRI, T1/E1), you want to use their clock source, though.

The SIP and IAX2 PLC jitter buffers both use software timers for the 20ms 
interrupt, and they work reasonably well.  My personal opinion is that unless 
your system's hideously overtaxed you will have no trouble with a pure 
software timer, provided that the kernel can deliver exactly 1000 interrupts 
per second (which it can).  If you're connecting to Real Telco Hardware, you 
want to let them lead, so to speak.

Hopefully this addresses your questions.

-A.

Reply via email to