📄 mpegplay.pas
字号:
or (@DllPause=nil)
or (@DllRestart=nil)
or (@DllStop=nil)
or (@DllSetPriority=nil)
or (@DllSetOutputDevice=nil)
or (@DllPlay=nil)
or (@DllClose=nil)
or (@DllGetFrequency=nil)
or (@DllGetBitRate=nil)
or (@DllGetLayer=nil)
or (@DllGetPlayerMode=nil)
or (@DllGetCurrentPos=nil)
or (@DllGetLength=nil)
or (@DllResetPlayerMode=nil)
or (@DllSeek=nil)
or (@DLLLastError=nil)
then begin
FreeLibrary(DLLHandle);
DLLHandle:=0;
Raise TMPEGError.CreateErr(ErrStr[0],0);
end;
if DllInit=false then
begin
LE:=LastError;
DLLHandle:=0;
Raise TMPEGError.CreateErr(ErrStr[LE],LE);
end;
PosUpdateTimer := TTimer.create(self);
PosUpdateTimer.OnTimer := UpdateTimer;
PosUpdateTimer.Enabled := false;
PosUpdateTimer.Interval := TimerFreq;
if not UseTimer then PosUpdateTimer.Interval := 0;
FStreamLength := 0;
end;
procedure TMPEGPlayer.Deinit;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
if FOpened then Close;
if @DLLDeInit<>nil then DLLDeInit;
FreeLibrary(DLLHandle);
DLLHandle:=0;
@DllInit := nil;
@DllDeInit := nil;
@DllOpen := nil;
@DllPause := nil;
@DLLRestart := nil;
@DllStop := nil;
@DllSetPriority := nil;
@DllSetOutputDevice := nil;
@DllPlay := nil;
@DllClose := nil;
@DllGetFrequency := nil;
@DllGetBitRate := nil;
@DllGetLayer := nil;
@DllGetPlayerMode := nil;
@DllGetCurrentPos := nil;
@DllGetLength := nil;
@DllResetPlayerMode := nil;
@DllSeek := nil;
@DLLLastError := nil;
end;
procedure TMPEGPlayer.Open;
var p:pchar;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
if FOpened then Close;
FOpened := false;
if FResource then
begin
DLLOpen(nil,true,CBCS,CBClS,CBRSS,CBRS,CBRSP,CBGS,self);
LE:=LastError;
end
else
begin
if FStreamName = '' then
Raise TMPEGError.CreateErr('Can''t play non-specified stream',254);
GetMem(p,512);
StrPCopy(p,FStreamName);
DLLOpen(p, false, nil,nil,nil,nil,nil,nil,nil);
LE:=LastError;
FreeMem(p,512);
end;
if LE>0 then
Raise TMPEGError.CreateErr(ErrStr[LE],LE);
FOpened:=true;
FPlayCount:=1;
FStreamLength:=GetLength;
if AutoPlay then Play;
end;
procedure TMPEGPlayer.Pause(value:boolean);
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
if not(FPlayStarted) or (FPlayStopped) then
begin
FPaused := false;
if value then Raise TMPEGError.CreateErr(ErrStr[2],2);
exit;
end;
DLLPause(not value);
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
FPaused:=value;
end;
procedure TMPEGPlayer.Stop;
begin
if not(FPlayStarted) or (FPlayStopped) then
Raise TMPEGError.CreateErr(ErrStr[2],2);
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
DLLStop;
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
FPlayStarted := false;
FPaused:=false;
end;
procedure TMPEGPlayer.Restart;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
if not FOpened then Raise TMPEGError.CreateErr(ErrStr[2],2);
FPlayStopped:=false;
DllRestart;
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
FPlayStarted := true;
inc(FPlayCount);
if (UseTimer) and (PosUpdateTimer.Interval<>0) then
begin
PosUpdateTimer.Enabled := true;
UpdateTimer(self);
end;
end;
procedure TMPEGPlayer.Play;
var p : pchar;
b : integer;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
if FPaused then
begin
Pause(false);
exit;
end;
if FPlayStarted then exit;
if not FOpened then Open;
if not FOpened then exit;
if FPlayCount>1 then
begin
Restart;
exit;
end;
DLLSetPriority(FPriority);
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
GetMem(p,260);
StrPCopy(p,FOutFilename);
DllSetOutPutDevice(FOutputDevice,p);
FreeMem(p,260);
LE:=LastError;
if (LE>0) then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
b:=DllPlay(FStartPos, FEndPos,@FPlayStopped);
LE:=LastError;
if (LE>0) or (b<>0) then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
FPlayStarted := true;
inc(FPlayCount);
if (UseTimer) and (PosUpdateTimer.Interval<>0) then
begin
PosUpdateTimer.Enabled := true;
UpdateTimer(self);
end;
end;
procedure TMPEGPlayer.Close;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
FOpened := false;
FPaused:=false;
FPlayStarted := false;
FPlayCount:=0;
DllClose;
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
end;
function TMPEGPlayer.GetFrequency:integer;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
result:=DLLGetFrequency;
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
end;
function TMPEGPlayer.GetBitrate:integer;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
result:=DLLGetBitrate;
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
end;
function TMPEGPlayer.GetLayer:integer;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
result:=DLLGetLayer;
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
end;
function TMPEGPlayer.GetPlayMode;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
result:=DLLGetPlayerMode;
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
end;
function TMPEGPlayer.GetPosition;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
result:=DLLGetCurrentPos;
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
end;
function TMPEGPlayer.GetLength;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
result:=DLLGetLength;
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
end;
function TMPEGPlayer.GetPlayStopped;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
result:=FPlayStopped;
if result then
begin
result:=DllResetPlayerMode;
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
FPlayStarted := false;
end;
end;
procedure TMPEGPlayer.SetStreamName;
begin
FStreamName:=value;
if FOpened then Close;
end;
procedure TMPEGPlayer.Seek;
begin
if DLLHandle=0 then Raise TMPEGError.CreateErr(ErrStr[0],0);
DLLSeek(value);
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
end;
procedure TMPEGPlayer.SetPriority(P:TPlayPriority);
begin
case p of
Idle : fPriority := THREAD_PRIORITY_IDLE;
Lowest : fPriority := THREAD_PRIORITY_LOWEST;
BelowNormal : fPriority := THREAD_PRIORITY_Below_Normal;
Normal : fPriority := THREAD_PRIORITY_NORMAL;
AboveNormal : fPriority := THREAD_PRIORITY_ABOVE_NORMAL;
Highest : fPriority := THREAD_PRIORITY_HIGHEST;
TimeCritical : fPriority := THREAD_PRIORITY_TIME_CRITICAL;
end;
if DLLHandle<>0 then
begin
DLLSetPriority(FPriority);
LE:=LastError;
if LE>0 then Raise TMPEGError.CreateErr(ErrStr[LE],LE);
end;
end;
function TMPEGPlayer.GetPriority:TPlayPriority;
begin
case fPriority of
THREAD_PRIORITY_IDLE : GetPriority := Idle;
THREAD_PRIORITY_LOWEST : GetPriority := Lowest;
THREAD_PRIORITY_Below_Normal : GetPriority := BelowNormal;
THREAD_PRIORITY_NORMAL : GetPriority := Normal;
THREAD_PRIORITY_ABOVE_NORMAL : GetPriority := AboveNormal;
THREAD_PRIORITY_HIGHEST : GetPriority := Highest;
THREAD_PRIORITY_TIME_CRITICAL : GetPriority := TimeCritical;
else GetPriority := Normal;
end;
end;
procedure TMPEGPlayer.SetOutFilename;
begin
FOutFileName:=value;
end;
procedure TMPEGPlayer.SetTimerFreq;
begin
FTimerFreq:=value;
if value=0 then UseTimer:=false;
end;
procedure TMPEGPlayer.SetOutputDevice;
begin
if FOutFilename='' then FOutputDevice:=0 else
if value=wavemapper then FOutputDevice:=0 else FOutputDevice:=2;
end;
function TMPEGPlayer.GetOutputDevice;
begin
if FOutputDevice=0 then result:=wavemapper else result:=pcmfile;
end;
procedure Register;
begin
RegisterComponents('Wabbit''s', [TMPEGPlayer]);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -