mastertester schrieb:
@florixyz
An welcher Stelle in welcher Datei finde ich das?
Oder wo meinst Du sollte man mal dran drehen?
Hm, am meisten findest du in der ivcall.c , da ist die fax_loop_capi funktion, die so aufgebaut ist (schematisch):
vom capi lesen, mit fax_rx spandsp verarbeitung dann fax_tx spandsp verarbeitung, und dann wieder ans capi senden.
zwischendrin muss noch irgendwo ein handle_messages stehen, weil sonst vom capi nix mehr verarbeitet werden kann. Und genau hierdran kann man drehen, also einmal wo der steht und dann wie lang die block time ist (letzter paramter). Das ganze endet in einem select aufruf, der entweder nur einmal ausgeführt wird, und dann blocktime lang blockt, oder solange bis nix mehr zu handeln ist, und dann beim letzten mal nicht blockt.
Im Prinzip ist es nicht falsch, dass er blockt, nur sollte es vielleicht nach der fax_rx , fax_tx verarbeitung sein, da sonst beim blocken rechenzeit verloren geht. ausserdem sieht man die incoming capi buffer overflows scheinbar nur, wenn handle_messages zweimal im loop aufgerufen wird.
Manche capi funktionen in capi.c rufen auch ein internes handle_messages auf, wo in der alten version ein timeout von 1 angegeben war, ich in der neuen ihn aber auf 0 gesetzt habe. ist aber irgendwie völlig egal, scheinbar.
Wenn du überall 0 timeout machst, dann scheints gar nicht mehr zu klappen, kA. warum, vielleicht kommt ja dann der kernel oder der telefond nicht mehr mit der Verarbeitung nach.
Ausserdem findet sich in der void go() (in ivcall.c) noch ein setpriority aufruf, den die box auch zu unterstützen scheint, weil bei -20 alle anderen Prozesse schon irgendwie fast nix mehr melden.
Einfluss haben könnten auch noch die Debug ausgaben, also eigentlich alles was kernel aufrufe sind, die irgendwie bisschen blocken könnten, oder zu nem Taskwechsel führen könnten, der nicht durch nen timer hervorgerufen wird. Also printf, write, read, und natürlich die capidev_read / send aufrufe.
Dann wäre da auch noch das put_bit zeugs in spandsp, dass dann irgendwie mal das tiff speichert, zu finden ist das alles in t4.c und spandsp/t4.h
naja, und natürlich auch in LibTiff, nur soweit bin ich bis jetzt noch nicht vorgedrungen.
Interessant wäre es vielleicht ob da noch irgendwo floating point code ist, oder irgendwelche stellen, die von der faxauflösung und inhalt abhängen, lzw, oder ähnlich.
Beim Profiling, also Zeitmessen mit gettimeofday (was eine gute möglichkeit darstellt um langsame Stellen zu finden), ist die Fbox allerdings etwas dumm, weil die uSec auflöung nicht bei 1us liegt sondern leider nur bei 10000us, also 10ms oder 0.01s, und ich vermute, dass das gleiche für die blocktime bei den handle_messages oder select aufrufen gilt, also auch wenn man da ne 1 angibt, blockt er max. 0.01s , was dann bei nem Fenster von 0.03 s schon knapp werden kann.
Also..... bessere timer auf der fbox finden. Die CPU hat laut /proc/cpuinfo sogar Microsecond timers.
Du kannst auch noch #define NSAMPLES (in ivcall.c) ändern, aber ich glaube das ist schon ein guter Wert mit 240, das ist auf jeden Fall die größe eines Verarbeitungsfensters.
Dann is noch ne CAPI geschichte. Ich weiss nicht ob Fax irgendwie Delay empfindlich ist. In der capi.c (capi.h) gibts den define MAX_ASBS, der die ANzahl der CAPI-internen Pufferblöcke angibt, maximal sind 8 möglich, weniger wären für Fax vielleicht von Vorteil, jedoch wenn ich den define einfach auf 4 setzte, dann klappts nimmer mitm senden, dann fehlt vom audio irgendwie was... muss also noch an ner anderen Stelle vorkommen.
Sowas aber erstmal immer mit nem audio .raw file und nem telefon testen, das ist viel aufschlussreicher und meistens einfacher als ein ganzes fax senden, wo man vom audio eh nicht viel hört.
mastertester schrieb:
Was muss ich angeben, damit er das Binary stript? Meins ist nämlich z.Z. 1,7 MB Groß….?
Keine Ahnung, meines war immer 1,3MB groß, aber vielleicht hast du ne andere -lm oder zlib oder uclibc die größer ist. wenn du das buildroot aus dem danisahne mod verwendest, dann probier doch mal alles dynamisch zu linken, bis auf tiff und spandsp: die linkst du so static: (LDFLAGS): -W,-Bstatic -lspandsp -W,-Bstatic -ltiff (evtl. auch zlib noch so linken, k.A. ob sie beim danisahne mod dabei ist.
Den Float-Wrapper müsstest du überall hintun können, aber nur wenn du undefined references to powf und lrintf bekommst, wenn du linkst.
WICHTIG: Bitte bei spandsp überprüfen ob in der config.h der eintrag
"#define PURE_INTEGER_DSP 1" steht!