Entwickler-Ecke
Internet / Netzwerk - idUDPClient SendBuffer - Daten von Pointer zu Stream
NetSpider - Mo 23.03.09 17:16
Titel: idUDPClient SendBuffer - Daten von Pointer zu Stream
Ich moechte ein IP Telefon programmieren. Ich benutze UDPClient/Server Indy 10.1.5.
Ich habe eine DEMO, aber die scheint mit Indy 9 geschrieben zu sein:
Der folgende Code liest von der Audio-Komponente die aufgenommene Soundspur in einen Stream und veschickt sie per SendBuffer. Leider funktioniert das unter Indy 10 nicht mehr.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TSendFrm.ACMIn1Data(Sender: TACMComponent; aDataPtr: Pointer; aDataSize: Cardinal); begin UDPClient.SendBuffer(aDataPtr^,aDataSize); Bytes:=Bytes+aDataSize; BytesLbl.Caption:=Format ('%u',[Bytes]); UpDate; end; |
Ich habe schon folgendes versucht. Resultat: Es gibt zwar keine Fehler-Meldung, aber es wird auch nichts versendet. Wie bekomme ich die Daten auf die der Pointer zeigt in einen Buffer/Stream den ich mit SendBuffer verschicken kann?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TSendFrm.ACMIn1Data(Sender: TACMComponent; aDataPtr: Pointer; aDataSize: Cardinal); var My_Stream: TBytes; begin My_Stream := RawToBytes(aDataPtr^, aDataSize); UDPClient.SendBuffer(My_Stream); Bytes:=Bytes+aDataSize; BytesLbl.Caption:=Format ('%u',[Bytes]); UpDate; end; |
Die Sound-Komponenten findet man auf Torry:
http://www.torry.net/vcl/mmedia/audio/acmcomponents16.zip
Flamefire - Mo 23.03.09 17:21
warum funktioniert die 1. variante nicht mehr?
was passsiert?
und bei der 2. variante: was erwartet indy 10 denn als eingabe? also wie ist sendbuffer() definiert?
das geliche für die RawToBytes funktion und tbytes deklaration: wie sind die definiert?
NetSpider - Mo 23.03.09 17:35
Es gibt 3 ueberladene SendBuffer Proceduren:
Delphi-Quelltext
1: 2: 3:
| procedure SendBuffer(AHost: string; const APort: Integer; const ABuffer : TIdBytes); overload; override; procedure SendBuffer(const ABuffer: TIdBytes); reintroduce; overload; procedure SendBuffer(AHost: string; const APort: Integer; const AIPVersion: TIdIPVersion; const ABuffer: TIdBytes);overload; override; |
RawToBytes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| {$IFNDEF DotNet} function RawToBytes(const AValue; const ASize: Integer): TIdBytes; begin SetLength(Result, ASize); Move(AValue, Result[0], ASize); end; {$ENDIF} |
Die 1. Variante scheint zu funktionieren unter Indy 9. Aber unter Indy 10 funktioniert sie nicht mehr.
Wenn ich Version1 unter Indy10 compilieren moechte, dann bekomme ich folgende Fehler-Meldung:
Quelltext
1:
| [DCC Error] Send.pas(75): E2250 There is no overloaded version of 'SendBuffer' that can be called with these arguments |
NetSpider - Mo 23.03.09 17:58
OK, ich habs jetzt hinbekommen das DEMO mit Indy10 zu compilieren und es funktioniert! Ich kann Audio-Streams an meine 127.0.0.1 Adresse senden.
Hier ist der Code:
UDPServer OnRead - Empfaenger:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TRecvFrm.SockUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle); var My_Stream: TMemoryStream; begin My_Stream := TMemoryStream.Create; My_Stream.Write(AData[0], length(adata)); ACMOut1.PlayBack(My_Stream);
My_Stream.Free; Bytes:=Bytes+ Length(AData); BytesLbl.Caption:=Format ('%u',[Bytes]); UpDate; end; |
Und die Gegenseite - UDPClient - Sender:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TSendFrm.ACMIn1Data(Sender: TACMComponent; aDataPtr: Pointer; aDataSize: Cardinal); var My_Stream: TBytes; begin My_Stream := RawToBytes(aDataPtr^, aDataSize); Sock.SendBuffer(My_Stream); Bytes:=Bytes+aDataSize; BytesLbl.Caption:=Format ('%u',[Bytes]); UpDate; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!