[Freeswitch-dev] Detecting in-band DTMF Digits in Openzap?

Alex Green alexg at etherstack.com
Thu Aug 13 23:12:24 PDT 2009

Moises Silva wrote:
>     3.: Potential bug:
>     As suggested by Moises, adding extra logging in libteletone_detect.c
>     shows that digits were detected, but the ZAP_EVENT_DTMF events were
>     *not* sent back for an analog channel (I am using an Openvox A800p, but
>     it looks to be the same for all analog cards).
> you mean libteletone detects it but ZAP_EVENT_DTMF is not launched? the 
> next test should be in zap_channel_read, which uses teletone_dtmf_detect 
> and teletone_dtmf_get to retrieve DTMF and queue the DTMF, there you 
> will be able to find out what is going on.
On doing more testing, I have to retract that statement. I can confirm 
that the EVENT_DTMF is always correctly returned when using software 
detection, but not when using hardware DTMF detection (regardless of PRI 
or analog).

>     4.: Potential bug:
>     DTMF digit detection *eats some audio* each time a digit is detected. If
>     the device is connected directly to free switch this is not a problem.
>     If a device makes a call through freeswitch (to let's say phone banking)
>     a digit that is held down may be detected as 3 digits (sometimes more)
>     due to the consumed audio. This can be heard on the other side of
>     freeswitch as a start-stop at the start of the DTMF.
> Indeed ZAP_CHANNEL_SUPRESS_DTMF causes zap_channel_read to memset the 
> read data each time a digit hit is found. The problem is that there is 
> no DTMF_START and DTMF_END events and the DTMF length is lost, we just 
> have a plain DTMF event for the start. Not sure about how to use 
> libteletone to detect the DTMF end though.
DTMF suppression is mangling the digits.
It took me a while to get to the bottom of this, but it turns out to be 
very easy to reproduce. Take Freeswitch with an FXS port and a handset. 
Dial 1000 on the handset and answer the call on a SIP client. Now hold 
down a digit. You will notice that the digit has a wobble at the start. 
This is the symptom.

Commenting out the DTMF suppression code, changes the behaviour but does 
not fix the problem. This is what baffled me for a while. I wrote some 
trivial code that bridges two analog channels by doing a 
zap_channel_read/write() from one to the other. Commenting out the 
memset() on line 2042 of zap_io.c produced perfect digits while 
uncommenting it produced the wobble. The obvious conclusion was that the 
dodgy digit suppression is being attempted somewhere else (like the SIP 
side?) and thus the wobble is being introduced at more than one place. 
This also explains why I (non scientifically) noticed that the more 
times the call passed through Freeswitch the more incorrectly recognised 
digits were reported at the final point.

I imagine that a solution might be to just turn off DTMF digit 
suppression by default until it is fixed.

Cheers, -alex

> Anthony, Mike? care to comment about this one?
> -- 
> Moises Silva
> Software Developer
> Sangoma Technologies Inc. | 50 McIntosh Drive, Suite 120, Markham ON L3R 
> 9T3 Canada
> t. 1 905 474 1990 x 128 | e. moy at sangoma.com <mailto:moy at sangoma.com>

More information about the FreeSWITCH-dev mailing list