Hi Everyone, Ik heb een probleem die ik al meer dan een week niet kon oplossen en daarom heb ik hulp nodig .
Ik probeer de Audio(Microfoon) te streamen van server naar client.
Ik stuur data naar de server en het wordt doorgevoerd alleen krijg ik BufferFull procedure niet aan het werk!
Client Code:
Code:
// READ STREAM DATA AUDIO
procedure TFrmAudio.ParseData(Data: string);
var
Stream: TMemoryStream;
Li: TListItem;
begin
if CheckBox1.Checked then ACMO.Play(pointer(Data)^,length(data));
Stream := TMemorystream.Create;
stream.Write(pointer(Data)^,length(data));
li := ListView2.Items.Add;
li.Caption := inttostr(ListView2.Items.Count);
li.SubItems.Add(inttostr(stream.Size));
li.SubItems.Add(timetostr(time));
li.Data := stream;
li.ImageIndex := 0;
end;
// BEGIN AUDIO STREAM
procedure TFrmAudio.BtnStartClick(Sender: TObject);
var
Format: TWaveFormatEx;
Stream: TMemoryStream;
Command: string;
begin
if not assigned(Listview1.Selected) then begin
Listview1.Items[9].Selected := True;
end;
Listview2.Clear;
if Listview1.Selected.SubItems[0] = 'Stereo' then Format.nChannels := 2
else Format.nChannels := 1;
Format.nSamplesPerSec := StrToInt(Listview1.Selected.Caption);
Format.wBitsPerSample := 16;
Format.nAvgBytesPerSec := Format.nSamplesPerSec * Format.nChannels * 2;
Format.nBlockAlign := Format.nChannels * 2;
ACMC.FormatIn.Format.nChannels := Format.nChannels;
ACMC.FormatIn.Format.nSamplesPerSec := Format.nSamplesPerSec;
ACMC.FormatIn.Format.nAvgBytesPerSec := Format.nAvgBytesPerSec;
ACMC.FormatIn.Format.nBlockAlign := Format.nBlockAlign;
ACMC.FormatIn.Format.wBitsPerSample := Format.wBitsPerSample;
Stream := TMemoryStream.Create;
Stream.WriteBuffer(Format, SizeOf(TWaveFormatEx));
SetString(Command,pchar(Stream.memory),Stream.Size);
Stream.Free;
//Messagebox(0,pchar(Command),0,0);
If SendPacket(sSocket, C_REQUESTAUDIO, Command) then begin
Statusbar1.Panels.Items[0].Text := 'Audio Activated!';
end else begin
Statusbar1.Panels.Items[0].Text := 'Socket Error!';
end;
//SendData(NewSocket,'Start|' + Command);
Listview1.Enabled := False;
BitBtn2.Enabled := False;
BitBtn3.Enabled := True;
end;
procedure TFrmAudio.FormCreate(Sender: TObject);
begin
ACMO := TACMOut.Create(nil);
ACMC := TACMConvertor.Create;
ACMO.NumBuffers := 0;
ACMO.Open(ACMC.FormatIn);
end;
Server Code:
Code:
procedure ParseData(Socket: TClientSocket; Data: string);
var
Command: string;
Stream: TMemorySTream;
Format: TWaveFormatEx;
begin
STream := TMemoryStream.Create;
Stream.Write(pointer(Data)^,Length(Data));
Stream.Position := 0;
Stream.ReadBuffer(Format, SizeOf(TWaveFormatEx));
Stream.Free;
Main := TMain.Create;
Main.Socket := Socket;
ACMC := TACMConvertor.Create;
ACMI := TACMIn.Create;
ACMI.OnBufferFull := Main.BufferFull;
//ACMC.InputBufferSize := 4096; //176400;
ACMI.BufferSize := ACMC.InputBufferSize;
ACMC.FormatIn.Format.nChannels := Format.nChannels;
ACMC.FormatIn.Format.nSamplesPerSec := Format.nSamplesPerSec;
ACMC.FormatIn.Format.nAvgBytesPerSec := Format.nAvgBytesPerSec;
ACMC.FormatIn.Format.nBlockAlign := Format.nBlockAlign;
ACMC.FormatIn.Format.wBitsPerSample := Format.wBitsPerSample;
ACMC.InputBufferSize := ACMC.FormatIn.Format.nAvgBytesPerSec;
ACMI.BufferSize := ACMC.InputBufferSize;
ACMC.Active := True;
ACMI.Open(ACMC.FormatIn);
Form1.Memo1.Lines.Add('ParseData Socket: '+intToStr(Socket.Socket));
end;
procedure TMain.BufferFull(Sender: TObject; Data: Pointer; Size: Integer);
var
NewSize: Integer;
Stream: TMemoryStream;
Text: string;
begin
Form1.Memo1.Lines.Add('BufferFull: '); // DIT WERK NIET
Move(Data^, ACMC.BufferIn^, Size);
NewSize := ACMC.Convert;
Stream := TMemoryStream.Create;
Stream.WriteBuffer(ACMC.BufferOut^, NewSize);
Stream.Position := 0;
SetLength(Text,Stream.Size);
Stream.ReadBuffer(pointer(Text)^,Stream.Size);
Stream.SaveToFile('D:\' + inttostr(gettickcount));
Stream.Free;
//SetString(Text,pchar(ACMC.BufferOut^),NewSize);
SendData(Socket,Text);
end;
Bookmarks