⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 u_vcmp3demo_main.pas

📁 Voice Commnucation Components for Delphi
💻 PAS
📖 第 1 页 / 共 4 页
字号:

(*
	----------------------------------------------

	  u_vcMp3Demo_main.pas
	  Voice Communicator components version 2.5 Pro
	  MP3/Ogg Streaming Demo application - main form

	----------------------------------------------
	  This source code cannot be used without
	  proper license granted to you as a private
	  person or an entity by the Lake of Soft, Ltd

	  Visit http://lakeofsoft.com/ for more information.

	  Copyright (c) 2001, 2007 Lake of Soft, Ltd
		     All rights reserved
	----------------------------------------------

	  created by:
		Lake, 21 Oct 2002

	  modified by:
		Lake, Oct-Nov 2002
		Lake, Jan-Dec 2003
		Lake, Jan-Mar 2004
		Lake, Oct 2005

	----------------------------------------------
*)

{$I unaDef.inc}
{$I unaBassDef.inc }

unit u_vcmp3Demo_main;

interface

uses
  Windows, unaTypes, Forms, MMSystem,
  unaClasses, unaEncoderAPI, unaVorbisAPI, unaMpglibAPI, unaSockets,
  Controls, StdCtrls, ComCtrls, Classes, ExtCtrls, ActnList, Dialogs,
  unavcIDE;

type
  //
  // -- tMpgLibDecoder --
  tMpgLibDecoder = class(unaMpgLibDecoder)
  private
    f_outStream: unaMemoryStream;
  protected
    procedure startIn(); override;
    procedure notifyData(data: pointer; size: unsigned; var copyToStream: bool); override;
    procedure notifySamplingChange(rate, bits, channels: unsigned); override;
  public
    procedure afterConstruction(); override;
    procedure beforeDestruction(); override;
  end;

  //
  tIPComponentEnum = (tipeEnc, tipeDec);	// IP component could be encoder or decoder
  tIPComponentType = (tiptSrv, tiptCln);	// IP component type could be server or client

  // --  --
  Tc_form_main = class(TForm)
    c_statusBar_main: TStatusBar;
    c_timer_update: TTimer;
    c_pageControl_main: TPageControl;
    c_tabSheet_encoder: TTabSheet;
    c_tabSheet_decoder: TTabSheet;
    c_comboBox_encoder: TComboBox;
    c_label_encoderChoose: TLabel;
    c_label_inputDevice: TLabel;
    c_comboBox_inputDevice: TComboBox;
    c_label_decoderSrc: TLabel;
    c_comboBox_decoderSource: TComboBox;
    c_label_decoderChoose: TLabel;
    c_comboBox_decoder: TComboBox;
    c_comboBox_outputDevice: TComboBox;
    c_label_outputDevice: TLabel;
    c_bevel_encodeSrcOptions: TBevel;
    c_label_encodeSrcOptions: TLabel;
    c_bevel_encodeOptions: TBevel;
    c_label_encodeOptions: TLabel;
    c_comboBox_encodedDest: TComboBox;
    c_label_encoderDest: TLabel;
    c_label_decodeSrcOptions: TLabel;
    c_bevel_decodeSrcOptions: TBevel;
    c_label_decodeOptions: TLabel;
    c_bevel_decodeOptions: TBevel;
    c_button_encodeStart: TButton;
    c_button_encodeStop: TButton;
    c_actionList_main: TActionList;
    a_encode_start: TAction;
    a_encode_stop: TAction;
    waveIn: TunavclWaveInDevice;
    c_comboBox_minBR: TComboBox;
    c_checkBox_enableVBR: TCheckBox;
    c_label_encoderMinBR: TLabel;
    c_label_encoderMaxBR: TLabel;
    c_comboBox_maxBR: TComboBox;
    c_comboBox_samplesRate: TComboBox;
    c_label_encoderSR: TLabel;
    c_comboBox_stereoMode: TComboBox;
    c_label_encoderSM: TLabel;
    c_label_encoderAvBR: TLabel;
    c_comboBox_avBR: TComboBox;
    c_button_decodeStart: TButton;
    c_button_decodeStop: TButton;
    a_decode_start: TAction;
    a_decode_stop: TAction;
    c_checkBox_disBRS: TCheckBox;
    c_comboBox_vbrQuality: TComboBox;
    c_label_encoderVBRQ: TLabel;
    c_label_encoderMp3File: TLabel;
    c_edit_destFile: TEdit;
    c_button_destBrowse: TButton;
    c_saveDialog_dest: TSaveDialog;
    c_button_playback: TButton;
    c_button_encCopyrights: TButton;
    c_checkBox_copyrighted: TCheckBox;
    c_checkBox_CRC: TCheckBox;
    c_checkBox_original: TCheckBox;
    c_checkBox_private: TCheckBox;
    c_checkBox_overwriteP: TCheckBox;
    waveOut: TunavclWaveOutDevice;
    a_help_show: TAction;
    c_label_encPortNumber: TLabel;
    c_edit_encPortNumber: TEdit;
    c_label_sourceFile: TLabel;
    c_edit_sourceFile: TEdit;
    c_button_sourceBrowse: TButton;
    c_openDialog_source: TOpenDialog;
    c_edit_decSrvPort: TEdit;
    c_label_decSrvPort: TLabel;
    c_label_warningOgg: TLabel;
    c_comboBox_encSocketType: TComboBox;
    c_label_encType: TLabel;
    c_comboBox_decSrvSocketType: TComboBox;
    c_label_decSrvSocketType: TLabel;
    c_edit_encSrvAddr: TEdit;
    c_label_encSrvAddr: TLabel;
    c_edit_decSrvAddr: TEdit;
    c_label_decSrvAddr: TLabel;
    c_button_decCopyrights: TButton;
    //
    procedure formCreate(sender: tObject);
    procedure formDestroy(sender: tObject);
    //
    procedure a_encode_startExecute(Sender: TObject);
    procedure a_encode_stopExecute(Sender: TObject);
    procedure a_decode_startExecute(Sender: TObject);
    procedure a_decode_stopExecute(Sender: TObject);
    //
    procedure c_timer_updateTimer(Sender: TObject);
    procedure c_checkBox_enableVBRClick(Sender: TObject);
    procedure c_comboBox_encoderChange(Sender: TObject);
    procedure c_comboBox_avBRChange(Sender: TObject);
    procedure c_comboBox_stereoModeChange(Sender: TObject);
    procedure c_button_destBrowseClick(Sender: TObject);
    procedure c_edit_destFileChange(Sender: TObject);
    procedure c_button_playbackClick(Sender: TObject);
    procedure c_button_encCopyrightsClick(Sender: TObject);
    procedure c_checkBox_overwritePClick(Sender: TObject);
    procedure c_comboBox_inputDeviceChange(Sender: TObject);
    procedure c_comboBox_outputDeviceChange(Sender: TObject);
    procedure c_comboBox_encodedDestChange(Sender: TObject);
    procedure c_comboBox_decoderSourceChange(Sender: TObject);
    procedure c_button_sourceBrowseClick(Sender: TObject);
    procedure c_edit_sourceFileChange(Sender: TObject);
    procedure c_comboBox_decoderChange(Sender: TObject);
    //
    procedure waveInDataAvailable(sender: unavclInOutPipe; data: Pointer; len: Cardinal);
    procedure waveOutFeedChunk(sender: unavclInOutPipe; data: pointer; len: cardinal);
  private
    { Private declarations }
    f_config: unaIniFile;
    //
    f_bladeOK: bool;
    f_lameOK: bool;
    f_vorbisEncodeOK: bool;
    f_vorbisDecodeOK: bool;
    f_bassOK: bool;
    f_mpgOK: bool;
    //
    f_blade: unaBladeMp3Enc;
    f_lame: unaLameMp3Enc;
    f_vorbisEncode: unaVorbisEnc;
    f_vorbisDecode: unaVorbisDecoder;
    f_vorbisDecodeVersion: int;
    //
    f_bassDecoder: unaBass;
    f_bassDecodedSize: int64;
    f_bassFile: unaBassStream;
    f_feedBuf: pointer;
    f_feedBufSize: unsigned;
    //
    // Ogg
    f_vorbisHP: int;
    f_oggOutFile: unaOggFile;
    f_oggInFile: unaOggFile;
    f_op: tOgg_packet;
    //
    // MpgLib
    f_mpgDecoder: tMpgLibDecoder;
    f_mpgDecodedSize: unsigned;
    f_mpgFile: tHandle;
    f_mpgPCM: tWAVEFORMATEX;
    f_mpgNeedFormatUpdate: bool;
    //
    // sockets
    f_socks: unaSocks;
    //
    f_sockClients: array[tIPComponentEnum] of unaList;
    f_sockId: array[tIPComponentEnum] of unsigned;
    f_sockConnId: array[tIPComponentEnum] of unsigned;
    f_ipComponentType: array[tIPComponentEnum] of tIPComponentType;
    f_ipComponentReady: array[tIPComponentEnum] of bool;
    //
    f_encoder: unaAbstractEncoder;
    f_decoderIndex: int;
    //
    f_encoderDestIndex: int;
    f_decoderSourceIndex: int;
    //
    procedure flushOgg();
    //
    procedure enumAudioDevices();
    procedure enumEngineDevices();
    procedure myOnEncoderDataAvail(sender: tObject; data: pointer; size: unsigned; var copyToStream: bool);
    procedure myOnDecoderDataAvail(sender: tObject; data: pointer; size: unsigned; var copyToStream: bool);
    procedure myOnSocksEvent(sender: tObject; event: unaSocketEvent; id, connId: unsigned; data: pointer; size: unsigned);
  public
    { Public declarations }
  end;

var
  c_form_main: Tc_form_main;


implementation


{$R *.dfm}

uses
  shellAPI, sysUtils, unaVCLUtils,
  unaUtils, unaMsAcmClasses, unaBladeEncAPI, unaBassAPI, WinSock,
  u_vcmp3Demo_about;


{ tMpgLibDecoder }

// --  --
procedure tMpgLibDecoder.afterConstruction();
begin
  f_outStream := unaMemoryStream.create();
  //
  inherited;
end;

// --  --
procedure tMpgLibDecoder.beforeDestruction();
begin
  inherited;
  //
  freeAndNil(f_outStream);
end;

// --  --
procedure tMpgLibDecoder.notifyData(data: pointer; size: unsigned; var copyToStream: bool);
begin
  inherited;
  //
  if (copyToStream) then
    f_outStream.write(data, size);
  //
  inc(c_form_main.f_mpgDecodedSize, size);
end;

// --  --
procedure tMpgLibDecoder.notifySamplingChange(rate, bits, channels: unsigned);
begin
  inherited;
  //
  fillPCMFormat(c_form_main.f_mpgPCM, rate, bits, channels);
  //
  c_form_main.f_mpgNeedFormatUpdate := true;
end;

// --  --
procedure tMpgLibDecoder.startIn();
begin
  f_outStream.clear();
  //
  inherited;
end;

{ Tc_form_main }

// --  --
procedure Tc_form_main.c_timer_updateTimer(Sender: TObject);
begin
  if (not (csDestroying in ComponentState)) then begin
    //
    c_statusBar_main.Panels[0].Text := int2str(ams() shr 10, 10, 3) + ' KB';
    //
    if (nil <> f_encoder) then
      c_statusBar_main.panels[1].text := 'Encoder Output: ' + int2str(f_encoder.encodedDataSize shr 10, 10, 3) + ' KB'
    else begin
      //
      case (f_decoderIndex) of

	0 : begin //  Ogg/Vorbis
	  //
	  if (nil <> f_vorbisDecode) then
	    c_statusBar_main.panels[1].text := 'Ogg/Vorbis Decoder Out: ' + int2str(f_vorbisDecode.encodedDataSize shr 10, 10, 3) + ' KB';
	end;

	1 : begin // BASS
	  //
	  c_statusBar_main.panels[1].text := 'BASS Decoder Out: ' + int2str(f_bassDecodedSize shr 10, 10, 3) + ' KB';
	end;

	2 : begin // MpgLib
	  //
	  c_statusBar_main.panels[1].text := 'MpgLib Decoder Out: ' + int2str(f_mpgDecodedSize shr 10, 10, 3) + ' KB';
	  //
	  if (f_mpgNeedFormatUpdate) then begin
	    //
	    f_mpgNeedFormatUpdate := false;
	    //
	    waveOut.close();
	    waveOut.pcmFormat := @f_mpgPCM;
	    //
	    waveOut.open();
	    waveOut.flush();
	  end;
	end;

      end;	// case
    end;
  end;
end;

// --  --
procedure Tc_form_main.enumAudioDevices();
var
  i: int;
  inCaps: WAVEINCAPSW;
  outCaps: WAVEOUTCAPSW;
begin
  // enum waveIn/Out devices

  // PCM INPUT
  with (c_comboBox_inputDevice) do begin
    clear();
    //
    for i := -1 to unaWaveInDevice.getDeviceCount() - 1 do begin
      unaWaveInDevice.getCaps(unsigned(i), inCaps);
      items.add(inCaps.szPname);
    end;
    itemIndex := 0;
  end;

  // ENCODED INPUT
  with (c_comboBox_decoderSource) do begin
    //
    clear();
    items.add('MP3/Ogg file');
    items.add('TCP/IP Real-time Streaming Client');
    items.add('TCP/IP Real-time Streaming Server');
    itemIndex := 0;
  end;

  // RAW OUTPUT
  with (c_comboBox_outputDevice) do begin
    //
    clear();
    //
    for i := -1 to unaWaveOutDevice.getDeviceCount() - 1 do begin
      //
      unaWaveOutDevice.getCaps(unsigned(i), outCaps);
      items.add(outCaps.szPname);
    end;
    //
    itemIndex := 0;
  end;

  // ENCODED OUTPUT
  with (c_comboBox_encodedDest) do begin
    //
    clear();
    items.add('MP3/Ogg file');
    items.add('TCP/IP Real-time Streaming Client');
    items.add('TCP/IP Real-time Streaming Server');
    //
    itemIndex := 0;
  end;
end;

// --  --
procedure Tc_form_main.enumEngineDevices();
begin
  c_comboBox_encoder.clear();
  c_comboBox_decoder.clear();

  // BLADE MP3 ENCODER
  if (f_bladeOK) then
    c_comboBox_encoder.items.add('Blade MP3 Encoder, version ' + int2str(f_blade.version.byMajorVersion) + '.' + int2str(f_blade.version.byMinorVersion))
  else
    c_comboBox_encoder.items.add('Blade MP3 Encoder - required module was not found.');

  // LAME MP3 ENCODER
  if (f_lameOK) then
    c_comboBox_encoder.items.add('Lame MP3 Encoder, version ' + int2str(f_lame.version.byMajorVersion) + '.' + int2str(f_lame.version.byMinorVersion))
  else
    c_comboBox_encoder.items.add('Lame MP3 Encoder - required module was not found.');

  // VORBIS ENCODER
  if (f_vorbisEncodeOK) then
    c_comboBox_encoder.items.add('Ogg/Vorbis Encoder, version ' + int2str(f_vorbisEncode.version))
  else
    c_comboBox_encoder.items.add('Ogg/Vorbis Encoder - required module(s) was not found.');
  //

  // VORBIS DECODER
  if (f_vorbisDecodeOK) then
    c_comboBox_decoder.items.add('Ogg/Vorbis Decoder, version ' + int2str(f_vorbisDecodeVersion))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -