Bei mir läuft das Binary auf der 7170, FW ...37 ohne Absturz. Interessanter Weise hat bei mir -m1 gar nicht geklappt, und mit -m3 konnte ich ein paar Faxe empfangen (vielleicht kann mein Faxgerät die 4800 nicht?). Die Quote der nicht erfolgreichen Faxe ist natürlich deutlich zu hoch. CPU-Auslastung bei -m3 liegt bei mir im Bereich von 60-80%. Das ist sehr hoch, aber im Durchschnitt könnte es gerade so reichen, wenn es gelingt die Peaks zu glättern.
Ich habe auch ein wenig im Source-Code von spandsp gestöbert. Sieht ja so aus, als würde das Timing von spandsp mit den empfangenen Samples getaktet. Somit müßte der Empfänger eigentlich relativ robust gegen Jitter sein, solange keine empfangenen DATA_B3_IND verloren gehen - und einige Blöcke kann das CAPI ja puffern, wenn sie vorübergehend nicht rasch genug abgeholt werden.
Sendeseitig wird es m.E. schwieriger. Wenn spandsp die zu sendenden Daten nicht schnell genug anliefert (z.B. weil er noch rechnen muß), dann entstehen "Lücken" im gesendeten Datenstrom. Hier braucht man m.E. einen Jitter-Buffer, sodass die Daten mit einem künstlichen Delay verschickt werden. Diesen kann man voraussichtlich durchaus dadurch realisieren, dass man erst einmal ein paar Blöcke "silence" vorweg ans CAPI schickt, und CAPI puffern läßt. Aber danach muß man ununterbrochen Daten "nachschieben", und darf den Sendestream nicht abreißen lassen, sonst ist der Puffer wieder weg. IMO sollte man immer genau so viele Daten senden, wie auch empfangen wurden, weil die ISDN-Datenrate ja in beide Richtungen exakt gleich ist. Dann reißt der Sendestream nicht ab und es wird auch die Senderichtung nicht überfüllt. Und den sendeseitigen Jitter der B3_DATA_REQ gleicht dann die Pufferung im CAPI aus (durch die am Anfang vorausgeschickten Pakete).
Daraus würde sich für mich folgender Approach ableiten:
1. Bei der Initialisierung des Fax-State auch fax_set_transmit_on_idle(fax_state,TRUE) aufrufen. Dann liefert fax_tx(state, amp, max_len) immer genau max_len Samples zurück. Ggf. wird mit "silence" aufgefüllt, wenn spandsp momentan "nicht zu sagen" hat.
2. Beim Emfpang der allerersten DATA_B3_IND ein paar Blöcke "silence" vorweg als DATA_B3_REQ ans CAPI versenden (als Jitter-Buffer). Bei der in capi.c gewählten Blockgröße von 200 Samples enspricht das 25ms Delay pro Block.
3. Bei jedem Emfpang von DATA_B3_IND die empfangenen Samples mit fax_rx() an spandsp übergeben, und danach mit fax_tx() genau so viele Samples von spandsp abholen und als DATA_B3_REQ ans CAPI senden, wie in der DATA_B3_IND empfangen wurden.
Sind einfach nur so ein paar Gedanken, die ich loswerden wollte - ich werde kurzfristig eher nicht dazu kommen, das auszuprobieren...
Grüße
Gerhard