Sorry for my late reply. I didn't have access to any computer during a few days.
I tried your patch and I've been able to send 148 pages in V34 at 33600 bits/s. So far it seems perfect. I will increase my tests and will keep you updated if anything goes wrong. Thanks again for your help.
Best regards, Bertrand D
--- On Sat, 5/31/08, Lee Howard <faxguy@xxxxxxxxxxxxxxxx> wrote:
From: Lee Howard <faxguy@xxxxxxxxxxxxxxxx> Subject: Re: [hylafax-users] Regarding Hylafax and V34 To: "Bertrand D" <bertrand.work@xxxxxxxxx> Cc: "Hylafax-users Mailing List"
<hylafax-users@xxxxxxxxxxx>, hylafax-users@xxxxxxxxxxxxxxxxxxxxx Date: Saturday, May 31, 2008, 5:29 PM
Bertrand D wrote: > Please find attached the new log file. >
Thanks,
The log shows that the receiver is re-sending MCF and that the DCE cannot immediately switch to the V.34 primary rate due to that. So the solution, I think, is just to try again.
It would seem that the ECM block-building is taking a bit longer than it should... and that's slowing down our responsiveness as a sender... causing the receiver to repeat MCF.
Please try/test the attached patch (which was made against HylaFAX+ 5.2.5 but should apply cleanly to your version). I hope that it will resolve the matter.
Lee. --- hylafax.orig/faxd/Class1Send.c++ 2008-05-22 00:48:33.000000000 -0700
+++ hylafax/faxd/Class1Send.c++ 2008-06-01 00:14:35.320481472 -0700
@@ -1125,9 +1125,24 @@
if (useV34) {
// switch to primary channel
buf[0] = DLE; buf[1] = 0x6B; //
- if (!putModemData(buf, 2)) return (false);
+ HDLCFrame rtncframe(conf.class1FrameOverhead);
+ u_short limit = 5;
+ bool gotprate, gotrtncframe = false;
// wait for the ready indicator,
- if (!waitForDCEChannel(false)) return (false);
+ do {
+ if (!putModemData(buf, 2)) return (false);
+ gotprate = waitForDCEChannel(false);
+ if (!gotprate && ctrlFrameRcvd != fxStr::null) {
+ /*
+ * Maybe we took so long to assemble the block that
+ * the receiver has retransmitted CFR or MCF.
+ */
+ for (u_int i = 0; i < ctrlFrameRcvd.length(); i++)
+ rtncframe.put(frameRev[ctrlFrameRcvd[i] & 0xFF]);
+ traceHDLCFrame("-->", rtncframe);
+ gotrtncframe = true;
+ }
+ } while (!gotprate && gotrtncframe && --limit);
if (renegotiate) {
// Although spec says this can be done any time,
// in practice it must be done at this moment. |