HylaFAX The world's most advanced open source fax server

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [hylafax-users] voice prompt playback before DTMF read?



Ivan Petrov wrote:

Hi guys,

I found another issue - when I dial the numbers automatically (from my fax machine and add pauses to bypass the voice greeting, then the desired DTMF code - everything works great, but if I enter the code manually (pressing the keys longer than instantaneous) code does not get recorded properly but with repetitions - for example if I enter 1234, I get 1123 or 1112. Is there a away to avoid "autorepeat" and force the modem to read the digits no matter how long a single digit DTMF is being received?
I found the modem extremely sensitive - if you don't press the keys as quickly as possible you will usually get repetitions.


(OS -RHEL 3 U6, HylaFAX 4.2.4.1, modem LT V.92 1.0 MT5634ZPX-PCI-U INTERNAL
DATA/FAX/VOICE MODEM VERSION 1.32K(MULTI-TECH SYSTEMS MT5634ZPX-PCI-U/1.32k)


Ivan,

Please test the attached patch (if you used source tarball). If you used RPM, then I've uploaded a 4.2.4.1 RH7 RPM (that includes this patch, which is not part of 4.2.4.1) to:

http://sourceforge.net/project/showfiles.php?group_id=148904

I forgot that IS-101 "book-ends" DTMF digits with a leading <DLE></> and a trailing <DLE><~> and then repeats the digit every 70 ms while the tone is present.

Let me know how it goes.

Thanks,

Lee.
--- hylafax.orig/faxd/ClassModem.c++	2005-12-22 09:24:30.000000000 -0800
+++ hylafax/faxd/ClassModem.c++	2006-01-04 21:25:31.754091072 -0800
@@ -1376,13 +1376,25 @@
 		for (u_int j = 0 ; j < conf.idConfig.length(); j++) {
 		    if (conf.idConfig[j].pattern == "SHIELDED_DTMF") {	// retrieve DID, e.g. via voice DTMF
 			ringstart = Sys::now();
+			bool marked = false, gotdigit = false;
 			do {
 			    int c = server.getModemChar(10000);
 			    if (c == 0x10) c = server.getModemChar(10000);
 			    if (c == 0x23 || c == 0x2A || (c >= 0x30 && c <= 0x39)) {
 				// a DTMF digit was received...
-				protoTrace("MODEM HEARD DTMF: %c", c);
-				callid[j].append(fxStr::format("%c", c));
+				if (!marked || (marked && !gotdigit)) {
+				    protoTrace("MODEM HEARD DTMF: %c", c);
+				    callid[j].append(fxStr::format("%c", c));
+				    gotdigit = true;
+				}
+			    } else if (c == 0x2F) {
+				// got IS-101 DTMF lead marker
+				marked = true;
+				gotdigit = false;
+			    } else if (c == 0x7E) {
+				// got IS-101 DTMF end marker
+				marked = false;
+				gotdigit = false;
 			    } else if (c == 0x73) {
 				// got silence, keep waiting
 				protoTrace("MODEM HEARD SILENCE");



Project hosted by iFAX Solutions