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: stringconst APort: Integer; const ABuffer : TIdBytes); overloadoverride;
    procedure SendBuffer(const ABuffer: TIdBytes); reintroduceoverload;
    procedure SendBuffer(AHost: stringconst APort: Integer; const AIPVersion: TIdIPVersion; const ABuffer: TIdBytes);overloadoverride;



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;