📄 u_vcmp3demo_main.pas
字号:
(*
----------------------------------------------
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 + -