Autor Beitrag
NetSpider
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Mo 23.03.09 17:16 
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.
ausblenden 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?
ausblenden 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: www.torry.net/vcl/mm.../acmcomponents16.zip

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Mo 23.03.09 17:35 
Es gibt 3 ueberladene SendBuffer Proceduren:

ausblenden 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:

ausblenden 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:

ausblenden Quelltext
1:
[DCC Error] Send.pas(75): E2250 There is no overloaded version of 'SendBuffer' that can be called with these arguments					

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
NetSpider Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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;

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!