?? unitmain.pas
字號:
unit UnitMain;
interface
uses
WinTypes,shellapi,
WinProcs,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls,
ExtCtrls,registry,
Menus,AdTapi,
AdTutil,
AdPort, OoMisc,AdTSel_My, AdTStat,MMHook, MMDesign,
MMObj, MMACMDlg, MMDSPObj, MMWave, MMCstDlg;
const
CurrentState : Integer = 0;
StateGreeting = 0;
StateRecording = 1;
StateIdle = 2;
StateBeeping = 3;
StatePlayback = 4;
StateDial = 5;
StateDialing = 6;
StateAnswer = 7;
type
TFormMain = class(TForm)
Label1: TLabel;
Label2: TLabel;
CallerID: TEdit;
CallerIDName: TEdit;
Button1: TButton;
CancelCall: TButton;
GroupBox1: TGroupBox;
Label4: TLabel;
Label5: TLabel;
MaxLengthEdit: TEdit;
Monitor: TCheckBox;
ApdComPort1: TApdComPort;
Button2: TButton;
Label6: TLabel;
Button4: TButton;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
Edit2: TEdit;
Label7: TLabel;
Label8: TLabel;
OpenDialog2: TOpenDialog;
Edit3: TEdit;
Button5: TButton;
Label9: TLabel;
Edit4: TEdit;
Button6: TButton;
Button7: TButton;
Label3: TLabel;
Label10: TLabel;
Label11: TLabel;
ApdTapiDevice1: TApdTapiDevice;
Timer1: TTimer;
Button3: TButton;
Label12: TLabel;
Edit5: TEdit;
Button8: TButton;
Button9: TButton;
ComboBox1: TComboBox;
Button10: TButton;
Label13: TLabel;
Button11: TButton;
ComboBox2: TComboBox;
OpenDialog3: TOpenDialog;
MMACM1: TMMACM;
MMDesigner1: TMMDesigner;
MMWaveFile1: TMMWaveFile;
MMWaveOpenDialog1: TMMWaveOpenDialog;
ApdTapiLog1: TApdTapiLog;
Label14: TLabel;
procedure CvtProgressCB(Sender: TObject; CurByte, NumBytes: Longint;
Var Cancel: Boolean);
procedure ConvertPCM;
procedure ConvertACM;
procedure Button1Click(Sender: TObject);
procedure CancelCallClick(Sender: TObject);
procedure ApdTapiDevice1TapiConnect(Sender: TObject);
procedure ApdTapiDevice1TapiWaveNotify(CP: TObject; Msg: TWaveMessage);
procedure ApdTapiDevice1TapiCallerID(CP: TObject; ID, IDName: String);
procedure MaxLengthEditExit(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure ApdTapiDevice1TapiFail(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure ApdTapiDevice1TapiDTMF(CP: TObject; Digit: Char;
ErrorCode: Integer);
procedure CheckBox2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure MonitorClick(Sender: TObject);
procedure Label3Click(Sender: TObject);
procedure Label10Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ApdTapiDevice1TapiStatus(CP: TObject; First, Last: Boolean;
Device, Message, Param1, Param2, Param3: Cardinal);
procedure Edit3Exit(Sender: TObject);
procedure Edit4Exit(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure CallerIDChange(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Edit5Exit(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure ApdTapiDevice1TapiWaveSilence(CP: TObject; var StopRecording,
Hangup: Boolean);
procedure ApdTapiDevice1TapiWaveRingback(CP: TObject;
var RingbackTimes: Integer; var StopRecording, Hangup: Boolean);
procedure ApdTapiDevice1TapiWaveBusy(CP: TObject; var StopRecording,
Hangup: Boolean);
procedure ComboBox2Exit(Sender: TObject);
procedure ComboBox1Exit(Sender: TObject);
private
{ Private declarations }
FileName : String;
regpath:string;
files:integer;
caller:boolean;
Timer1Busy:boolean;
public
WaveFileDir : String;
{ Public declarations }
end;
var
FormMain: TFormMain;
implementation
uses UnitFmtDialog,UnitPlay, UnitCvtProgress, UnitPhoneBook;
{$R *.DFM}
procedure wait(msec:dword);
var
t:DWORD;
begin
t:=gettickcount;
while gettickcount-t<msec do application.ProcessMessages;
end;
procedure TFormMain.Button1Click(Sender: TObject);
begin
SelectDevice_My(ApdTapiDevice1,true,regpath);
ApdTapiDevice1.EnableVoice := True;
end;
procedure TFormMain.CancelCallClick(Sender: TObject);
begin
if not ApdTapiDevice1.Cancelled then
try
if ApdTapiDevice1.WaveState = wsRecording then
ApdTapiDevice1.StopWaveRecord;
ApdTapiDevice1.OnTapiFail:=nil;
ApdTapiDevice1.CancelCall;
finally
while ApdTapiDevice1.TapiState <> tsIdle do Application.ProcessMessages;
wait(1000); //等1秒
ApdTapiDevice1.OnTapiFail:=ApdTapiDevice1TapiFail;
end;
Label4.Caption := '已經斷開...';
Button2.Enabled:=true;
Button7.Enabled:=true;
Button10.Enabled:=CheckBox2.checked;
timer1.enabled:=true;
end;
procedure TFormMain.ApdTapiDevice1TapiConnect(Sender: TObject);
begin
if CurrentState = StateDial then
begin
Label4.Caption := '正在拔打...';
CurrentState := StateDialing;
ApdTapiDevice1.PlayWaveFile(WaveFileDir+'靜音.wav');
end
else begin
CurrentState := StateGreeting;
Label4.Caption := '播放問候語...';
combobox1.text:=trim(combobox1.text);
if combobox1.text<>'' then
try
ApdTapiDevice1.PlayWaveFile(combobox1.text);
except
end;
end;
end;
procedure TFormMain.ApdTapiDevice1TapiWaveNotify(CP: TObject;
Msg: TWaveMessage);
var
datetime : TDateTime;
year,month,day,hour,min,sec,msec : word;
max : integer;
sr : TSearchRec;
begin
if (CurrentState = StateDialing)or(CurrentState = StateDial) then
begin
case Msg of
waPlayClose :
begin
ApdTapiDevice1.MaxMessageLength :=60*60;
ApdTapiDevice1.StartWaveRecord;
end;
waDataReady:
begin
datetime:=now;
decodedate(datetime,year,month,day);
decodetime(datetime,hour,min,sec,msec);
if callerid.text=',' then
FileName := WaveFileDir+Format('%.2d-%.2d-%.2d %.2d:%.2d:%.2d',[year,month,day,hour,min,sec])+'錄音.wav'
else FileName := WaveFileDir+Format('%.2d-%.2d-%.2d %.2d:%.2d:%.2d',[year,month,day,hour,min,sec])+'拔打'+callerid.text+'.wav';
ApdTapiDevice1.SaveWaveFile(FileName, True);
end;
waRecordClose :
begin
CancelCallClick(Self);
if findfirst(FileName,faAnyfile and not faDirectory,sr)=0 then
begin
if (sr.Size<=110*1024)or
(pos('回鈴音......',Label14.caption)=1) then
deletefile(FileName)
else begin
inc(files);
Button9.caption:=inttostr(files)+'個錄音';
end;
end;
end;
end;
end
else begin
case Msg of
waPlayClose :
case CurrentState of
StateGreeting :
begin
CurrentState := StateBeeping;
try
ApdTapiDevice1.PlayWaveFile(WaveFileDir+'beep.wav');
except
end;
end;
StateBeeping :
begin
CurrentState := StateRecording;
if CheckBox1.Checked then max:=strtointdef(MaxLengthEdit.Text,60*60)
else max:=60*60;
ApdTapiDevice1.MaxMessageLength :=max;
Label4.Caption := '記錄拔入的電話...';
try
ApdTapiDevice1.StartWaveRecord;
except
end;
end;
end;
waDataReady :
begin
datetime:=now;
decodedate(datetime,year,month,day);
decodetime(datetime,hour,min,sec,msec);
if not caller then callerid.text:='';
FileName := WaveFileDir+Format('%.2d-%.2d-%.2d %.2d:%.2d:%.2d',[year,month,day,hour,min,sec])
+'接聽'+callerid.text+'.wav';
ApdTapiDevice1.SaveWaveFile(FileName, True);
end;
waRecordClose :
begin
CancelCallClick(Self);
inc(files);
Button9.caption:=inttostr(files)+'個錄音';
end;
end;
end;
end;
procedure TFormMain.ApdTapiDevice1TapiCallerID(CP: TObject; ID,
IDName: String);
begin
CallerId.Text := ID;
CallerIdName.Text := IDName;
Caller:=true;
end;
procedure TFormMain.MaxLengthEditExit(Sender: TObject);
var
reg:tregistry;
begin
reg:=Tregistry.create;
reg.rootkey:=HKEY_LOCAL_MACHINE;
reg.openkey(regpath,true);
reg.writestring('AnswerRecordTime',MaxLengthEdit.text);
reg.closekey;
reg.free;
end;
procedure TFormMain.Button2Click(Sender: TObject);
begin
Label14.caption:='';
if not ApdTapiDevice1.EnableVoice then
begin
MessageDlg('沒有選擇正確的貓.', mtInformation, [mbOk], 0);
exit;
end;
callerid.text:=trim(callerid.text);
if callerid.text<>'' then
begin
try
ApdTapiDevice1.OnTapiFail:=nil;
ApdTapiDevice1.CancelCall;
finally
while ApdTapiDevice1.TapiState <> tsIdle do Application.ProcessMessages;
wait(1000); //等1秒
ApdTapiDevice1.OnTapiFail:=ApdTapiDevice1TapiFail;
end;
Button2.Enabled:=false;
Button7.Enabled:=false;
Button10.Enabled:=false;
Label4.Caption := '正在拔出...';
CurrentState := StateDial;
ApdTapiDevice1.Dial(callerid.text);
end
else MessageDlg('請輸入電話號碼.', mtInformation, [mbOk], 0);
end;
procedure TFormMain.CheckBox1Click(Sender: TObject);
var
reg:tregistry;
begin
MaxLengthEdit.Enabled:=CheckBox1.Checked;
reg:=Tregistry.create;
reg.rootkey:=HKEY_LOCAL_MACHINE;
reg.openkey(regpath,true);
if CheckBox1.Checked then reg.writeinteger('AnswerRecord',1)
else reg.writeinteger('AnswerRecord',0);
reg.closekey;
reg.free;
end;
procedure TFormMain.ApdTapiDevice1TapiFail(Sender: TObject);
begin
CurrentState := StateIdle;
Label4.Caption := '已經斷開...';
Button2.Enabled:=true;
Button7.Enabled:=true;
Button10.Enabled:=CheckBox2.checked;
if CurrentState = StateAnswer then CheckBox2.checked:=false
else timer1.enabled:=true;
end;
procedure TFormMain.ConvertPCM;
begin
FmtDialog.Wave := MMWaveFile1.Wave;
if (FmtDialog.ShowModal = mrOk) then
begin
try
try
with FormCvtProgress do
begin
Gauge1.Progress := 0;
BringToFront;
Show;
end;
MMWaveFile1.Wave.OnProgress := CvtProgressCB;
MMWaveFile1.Wave.ConvertFile(MMWaveOpenDialog1.FileName+'.wav', FmtDialog.PWaveFormat);
finally
FormCvtProgress.Close;
end;
MMWaveFile1.Wave.FreeWave;
MMWaveFile1.Wave.FileName:=MMWaveOpenDialog1.FileName;
if fileexists(MMWaveOpenDialog1.FileName+'.wav') then
begin
renamefile(MMWaveOpenDialog1.FileName,MMWaveOpenDialog1.FileName+'.bak');
renamefile(MMWaveOpenDialog1.FileName+'.wav',MMWaveOpenDialog1.FileName);
MessageDlg('轉換成功!原文件改名為.bak',mtInformation, [mbOk], 0);
end
else MessageDlg('轉換錯誤!',mtInformation, [mbOk], 0);
except
MessageDlg('轉換錯誤!',mtError, [mbOk], 0);
end;
end;
Refresh;
end;
{-- TMainForm ------------------------------------------------------------}
procedure TFormMain.ConvertACM;
begin
MMACM1.EnumFormats := efConvert;
if MMACM1.ChooseFormat(MMWaveFile1.Wave.PWaveFormat,'選擇目標格式') then
begin
try
with FormCvtProgress do
begin
Gauge1.Progress := 0;
BringToFront;
Show;
end;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -