Moin!
BTW:
Killmag10 hat folgendes geschrieben: |
Delphi-Quelltext 1:
| AudioIn1.StopGracefully; | |
Was´n das für eine spannende Kompo?
Killmag10 hat folgendes geschrieben: |
| doch kann |
Schon klar, eigener unsauberer Code ist immer ein ganz kleines bischen sauberer, als fremder...
Killmag10 hat folgendes geschrieben: |
| aber nur unter gewissen umständen, |
Yip, unter anderem, weil du raw stream open end data sendest.

Allerdings, wenn die Samples nicht genau 1 Byte groß sind, produzierst du durch einen Versatz von einem Byte beim Senden/Empfangen wieder Schrott...
Killmag10 hat folgendes geschrieben: |
| habs aber natürlich geändert |
Wenn du schon dabei bist, dann hätte ich auch noch diese Vorschläge zu machen:
Du erzeugst einen MemoryStream:
Delphi-Quelltext
aber gibst ihn nicht wieder frei!
Hier holst du Speicher, den du zwar wenigstens wieder freigibst, aber das ganze machst du viel zu oft:
Delphi-Quelltext
1: 2: 3: 4:
| l:=socket.ReceiveLength; getmem(data,l); freemem(data); |
Bei jedem Ereignis wird wieder Speicher angefordert und freigegeben, das zerstückelt dir auf Dauer auch den Heap!

Anstatt auch noch einen Memorystream anzulegen, bietet es sich an, einen globalen Empfangspuffer zu verwenden (mehr als 8kb kommen ja nie auf einmal an!) und die Werte daraus direkt zu verarbeiten. Das darf dann auch gerne ein Stream sein, dann hast du auch die Möglichkeit, die Daten zu queuen.
Du liest immer ein Byte zu wenig:
Delphi-Quelltext
1:
| Socket.ReceiveBuf(data^,l-1); |
Das hier ist potenziell defekter Code:
Delphi-Quelltext
1: 2: 3: 4: 5:
| client.Open; Application.ProcessMessages; Client.Socket.SendBuf(Buffer,size); Application.ProcessMessages; client.Close; |
Grund: Niemand garantiert, dass der Socket nach dem Open und ("nur") dem folgenden MessageLoopCall tatsächlich schon connected ist, damit der Send-Call erfolgreich ist (besonders nicht über´s Internet; lokal mag das ja noch gehen... ist aber trotzdem ein übler Hack)! Du
musst (im non-blocking-mode) auf das OnClientConnect-Ereignis warten, wenn du nicht mit "zufällig" auftretenden Exceptions kämpfen willst!

Das gleiche nach dem Senden: "nur" ein MessageLoopCall mag bei lokalen Transfers (also nicht zu einem anderen System per Netzwerk, sondern zu localhost) ja gerade so noch laufen, der folgende .Close auf den Socket wird dir aber bei einem Internetransfer sicher mal einen solchen kaputt machen...

Fazit: du behandelst den Socket im non-blocking-mode wie einen im blocking-mode, aber das macht man dann bitte auch in diesem Mode und in einem Thread; alles andere ist kaputt.
cu
Narses
There are 10 types of people - those who understand binary and those who don´t.