unit Demo1Main;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ACMOut, ACMIn, ACMConvertor, StdCtrls;type
  TfmDemo1 = class(TForm)
    ACMConvertor1: TACMConvertor;
    ACMIn1: TACMIn;
    ACMOut1: TACMOut;
    Memo1: TMemo;
    Button1: TButton;
    procedure ACMIn1BufferFull(Sender: TObject; Data: Pointer;
      Size: Integer);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  fmDemo1: TfmDemo1;implementation{$R *.DFM}procedure TfmDemo1.ACMIn1BufferFull(Sender: TObject; Data: Pointer;
  Size: Integer);
begin
  ACMOut1.Play(Data^,Size);
end;procedure TfmDemo1.Button1Click(Sender: TObject);
begin
  ACMIn1.Open(ACMConvertor1.FormatIn);
  ACMOut1.Open(ACMConvertor1.FormatIn);
end;end.

解决方案 »

  1.   

    unit Demo2Client;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ScktComp, ACMConvertor, ACMOut, Spin;type
      TfmMain = class(TForm)
        Label1: TLabel;
        edAddress: TEdit;
        btnConnect: TButton;
        btnDisconnect: TButton;
        CSocket: TClientSocket;
        lblStatus: TLabel;
        ACMO: TACMOut;
        ACMC: TACMConvertor;
        Label2: TLabel;
        seDelay: TSpinEdit;
        procedure btnConnectClick(Sender: TObject);
        procedure btnDisconnectClick(Sender: TObject);
        procedure CSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
        procedure CSocketConnecting(Sender: TObject; Socket: TCustomWinSocket);
        procedure CSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket);
        procedure CSocketLookup(Sender: TObject; Socket: TCustomWinSocket);
        procedure FormCreate(Sender: TObject);
        procedure CSocketRead(Sender: TObject; Socket: TCustomWinSocket);
      private
        { Private declarations }
        procedure Status(aMessage : String);
        procedure UpdateButtons;
      public
        { Public declarations }
      end;var
      fmMain: TfmMain;implementation{$R *.DFM}procedure TfmMain.btnConnectClick(Sender: TObject);
    begin
      CSocket.Address := edAddress.Text;
      CSocket.Open;
    end;procedure TfmMain.btnDisconnectClick(Sender: TObject);
    begin
      CSocket.Close;
      ACMO.Close;
    end;procedure TfmMain.CSocketConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      Status('Connected');
      UpdateButtons;
    end;procedure TfmMain.CSocketConnecting(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      Status('Connecting...');
    end;procedure TfmMain.CSocketDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      Status('Disconnected');
      UpdateButtons;
    end;procedure TfmMain.CSocketLookup(Sender: TObject; Socket: TCustomWinSocket);
    begin
      Status('Finding host');
    end;procedure TfmMain.Status(aMessage: String);
    begin
      lblStatus.Caption := 'Status : ' + aMessage;
    end;procedure TfmMain.FormCreate(Sender: TObject);
    begin
      Status('Ready');
    end;procedure TfmMain.CSocketRead(Sender: TObject; Socket: TCustomWinSocket);
    var
      NewData                     : Pointer;
      NewDataSize                 : Integer;
    begin
      Status('Received ' + IntToStr(Socket.ReceiveLength) + ' bytes');
      with Socket do begin
        NewDataSize := ReceiveLength;
        GetMem(NewData, NewDataSize);
        try
          ReceiveBuf(NewData^, NewDataSize);
          if not ACMO.Active then begin
            ACMO.NumBuffers := seDelay.Value;
            ACMO.Open(ACMC.FormatIn);
          end;
          ACMO.Play(NewData^, NewDataSize);
        finally
          Freemem(NewData);
        end;
      end;
    end;procedure TfmMain.UpdateButtons;
    begin
      btnConnect.Enabled := not CSocket.Active;
      btnDisconnect.Enabled := CSocket.Active;
      seDelay.Enabled := not CSocket.Active;
    end;end.
      

  2.   

    unit Demo2Main;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ACMIn, ACMOut, ACMConvertor, ScktComp, StdCtrls;type
      TfmMain = class(TForm)
        ACMC: TACMConvertor;
        ACMI: TACMIn;
        SSocket: TServerSocket;
        Button1: TButton;
        procedure ACMIBufferFull(Sender: TObject; Data: Pointer;
          Size: Integer);
        procedure SSocketClientConnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure SSocketClientDisconnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure SSocketClientError(Sender: TObject; Socket: TCustomWinSocket;
          ErrorEvent: TErrorEvent; var ErrorCode: Integer);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        procedure TransmitData(Buffer : Pointer; Size : Integer);
        procedure UpdateCount;
      public
        { Public declarations }
      end;var
      fmMain: TfmMain;implementation{$R *.DFM}procedure TfmMain.ACMIBufferFull(Sender: TObject; Data: Pointer;
      Size: Integer);
    var
      NewSize : Integer;
    begin
      Move(Data^,ACMC.BufferIn^,Size);
      NewSize := ACMC.Convert;
      TransmitData(ACMC.BufferOut,NewSize);
    end;procedure TfmMain.UpdateCount;
    begin
      Caption := 'Connection count is ' + IntToStr(SSocket.Socket.ActiveConnections);
    end;procedure TfmMain.SSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      UpdateCount;
    end;procedure TfmMain.SSocketClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      UpdateCount;
    end;procedure TfmMain.TransmitData(Buffer : Pointer; Size: Integer);
    var
      X                           : Integer;
    begin
      for X:=0 to SSocket.Socket.ActiveConnections -1 do
      try
        SSocket.Socket.Connections[X].SendBuf(Buffer^,Size);
      except
      end;
    end;procedure TfmMain.SSocketClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      ShowMessage('Encountered error ' + IntToStr(ErrorCode));
    end;procedure TfmMain.Button1Click(Sender: TObject);
    begin
      ACMC.InputBufferSize := ACMC.FormatIn.Format.nAvgBytesPerSec;
      ACMI.BufferSize := ACMC.InputBufferSize;
      ACMC.Active := True;
      ACMI.Open(ACMC.FormatIn);
      UpdateCount;
    end;end.