280 lines
7.8 KiB
ObjectPascal
280 lines
7.8 KiB
ObjectPascal
unit uMain;
|
|
|
|
{$IFDEF FPC}
|
|
{$mode objfpc}{$H+}
|
|
{$ENDIF}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF FPC}
|
|
LResources,
|
|
{$ENDIF}
|
|
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Buttons,
|
|
ACS_Audio,ACS_File,ACS_Classes,ACS_Allformats, ExtCtrls, StdCtrls,
|
|
ComCtrls,uPlaylist, ACS_Indicator,uvis
|
|
//You must include Output drivers to not get an "No drier selected" exception
|
|
{$IFDEF MSWINDOWS}
|
|
,ACS_DXAudio //DirectSound Driver
|
|
{$ELSE}
|
|
,ACS_AlsaAudio //Alsa Driver
|
|
// ,ACS_AOLive //AO Live Driver
|
|
{$ENDIF}
|
|
,ACS_StdAudio //Wavemapper Driver
|
|
;
|
|
|
|
type
|
|
TTimeFormat = (tfElapsed,tfRemain);
|
|
|
|
{ TfMain }
|
|
|
|
TfMain = class(TForm)
|
|
AudioOut1: TACSAudioOut;
|
|
btVizu: TBitBtn;
|
|
btPlaylist: TBitBtn;
|
|
btPause: TBitBtn;
|
|
btRew: TBitBtn;
|
|
btFfw: TBitBtn;
|
|
btPlay: TBitBtn;
|
|
btStop: TBitBtn;
|
|
btOpen: TBitBtn;
|
|
FileIn1: TACSFileIn;
|
|
lLeft: TLabel;
|
|
lFilename: TLabel;
|
|
lTime: TLabel;
|
|
Panel1: TPanel;
|
|
Progress: TProgressBar;
|
|
PlayTimer: TTimer;
|
|
lTime1: TLabel;
|
|
lTime2: TLabel;
|
|
SoundIndicator: TACSSoundIndicator;
|
|
procedure AudioOut1Done(Sender: TComponent);
|
|
procedure AudioOut1ThreadException(Sender: TComponent; E: Exception);
|
|
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure Pauseclick(Sender: TObject);
|
|
procedure PlayClick(Sender: TObject);
|
|
procedure StopClick(Sender: TObject);
|
|
procedure OpenClick(Sender: TObject);
|
|
procedure Timer1Timer(Sender: TObject);
|
|
procedure btFfwClick(Sender: TObject);
|
|
procedure btPlaylistClick(Sender: TObject);
|
|
procedure btRewClick(Sender: TObject);
|
|
procedure btVizuClick(Sender: TObject);
|
|
procedure lTime1Click(Sender: TObject);
|
|
procedure resetDisplay;
|
|
private
|
|
{ private declarations }
|
|
FPaused : Boolean;
|
|
FStopped : Boolean;
|
|
TimeFormat : TTimeFormat;
|
|
public
|
|
{ public declarations }
|
|
end;
|
|
|
|
var
|
|
fMain: TfMain;
|
|
|
|
implementation
|
|
|
|
{ TfMain }
|
|
|
|
procedure TfMain.PlayClick(Sender: TObject);
|
|
begin
|
|
if FPaused then
|
|
begin
|
|
AudioOut1.Resume;
|
|
FPaused := False;
|
|
end
|
|
else
|
|
begin
|
|
if FileIn1.FileName = '' then
|
|
begin
|
|
if fPlaylist.lbPlaylist.Items.Count = 0 then exit;
|
|
if fPlaylist.lbPlaylist.ItemIndex = -1 then
|
|
fPlayList.lbPlaylist.ItemIndex := 0;
|
|
FileIn1.FileName := fPlayList.lbPlaylist.Items[fPlayList.lbPlaylist.ItemIndex];
|
|
lFilename.Caption := Format('File:%s',[ExtractFileName(FileIn1.FileName)]);
|
|
end;
|
|
AudioOut1.Run;
|
|
end;
|
|
FStopped := False;
|
|
btPlay.Enabled := False;
|
|
btStop.Enabled := True;
|
|
btOpen.Enabled := False;
|
|
btRew.Enabled := False;
|
|
btFfw.Enabled := False;
|
|
btPause.Enabled := True;
|
|
PlayTimer.Enabled := True;
|
|
end;
|
|
|
|
procedure TfMain.AudioOut1Done(Sender: TComponent);
|
|
begin
|
|
btPlay.Enabled := True;
|
|
btStop.Enabled := False;
|
|
btOpen.Enabled := True;
|
|
btRew.Enabled := True;
|
|
btFfw.Enabled := True;
|
|
PlayTimer.Enabled := false;
|
|
ResetDisplay;
|
|
if FStopped then
|
|
exit;
|
|
if fPlaylist.lbPlaylist.Items.Count = 0 then exit;
|
|
if fPlaylist.lbPlaylist.ItemIndex = -1 then
|
|
fPlayList.lbPlaylist.ItemIndex := 0;
|
|
FileIn1.FileName := fPlayList.lbPlaylist.Items[fPlayList.lbPlaylist.ItemIndex];
|
|
if fPlayList.lbPlaylist.Items.Count-1 > fPlayList.lbPlaylist.ItemIndex then
|
|
begin
|
|
fPlayList.lbPlaylist.ItemIndex := fPlayList.lbPlaylist.ItemIndex+1;
|
|
FileIn1.FileName := fPlayList.lbPlaylist.Items[fPlayList.lbPlaylist.ItemIndex];
|
|
lFilename.Caption := Format('File:%s',[ExtractFileName(FileIn1.FileName)]);
|
|
PlayClick(nil);
|
|
end;
|
|
end;
|
|
|
|
procedure TfMain.AudioOut1ThreadException(Sender: TComponent; E: Exception);
|
|
begin
|
|
ShowMessage(E.Message);
|
|
end;
|
|
|
|
procedure TfMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
|
|
begin
|
|
FStopped := True;
|
|
if (AudioOut1.Status <> tosIdle) then
|
|
AudioOut1.Stop;
|
|
while (AudioOut1.Status <> tosIdle) do
|
|
Application.Processmessages;
|
|
end;
|
|
|
|
procedure TfMain.FormCreate(Sender: TObject);
|
|
begin
|
|
// AudioOut1.Driver := 'Alsa';
|
|
end;
|
|
|
|
procedure TfMain.Pauseclick(Sender: TObject);
|
|
begin
|
|
if FPaused then
|
|
exit;
|
|
AudioOut1.Pause;
|
|
FPaused := True;
|
|
btPause.Enabled := False;
|
|
btPlay.Enabled := True;
|
|
PlayTimer.Enabled := False;
|
|
end;
|
|
|
|
procedure TfMain.StopClick(Sender: TObject);
|
|
begin
|
|
FStopped := True;
|
|
AudioOut1.Stop;
|
|
end;
|
|
|
|
procedure TfMain.OpenClick(Sender: TObject);
|
|
begin
|
|
FileIn1.Open;
|
|
btPlay.Enabled := True;
|
|
ResetDisplay;
|
|
end;
|
|
|
|
procedure TfMain.Timer1Timer(Sender: TObject);
|
|
var
|
|
tmp : real;
|
|
begin
|
|
case TimeFormat of
|
|
tfElapsed:
|
|
begin
|
|
tmp := ((FileIn1.Position * FileIn1.TotalTime) / FileIn1.Size);
|
|
lTime.Caption := Format('%.2d:%.2d:%.2d',[round((tmp-30) / 60) mod 120,round(tmp) mod 60,round(tmp*100) mod 100]);
|
|
tmp := FileIn1.TotalTime-((FileIn1.Position * FileIn1.TotalTime) / FileIn1.Size);
|
|
lLeft.Caption := Format('%.2d:%.2d:%.2d',[round((tmp-30) / 60) mod 120,round(tmp) mod 60,round(tmp*100) mod 100]);
|
|
lTime1.Caption := 'Time elapsed';
|
|
lTime2.Caption := 'left';
|
|
end;
|
|
tfRemain:
|
|
begin
|
|
tmp := ((FileIn1.Position * FileIn1.TotalTime) / FileIn1.Size);
|
|
lLeft.Caption := Format('%.2d:%.2d:%.2d',[round((tmp-30) / 60) mod 120,round(tmp) mod 60,round(tmp*100) mod 100]);
|
|
tmp := FileIn1.TotalTime-((FileIn1.Position * FileIn1.TotalTime) / FileIn1.Size);
|
|
lTime.Caption := Format('%.2d:%.2d:%.2d',[round((tmp-30) / 60) mod 120,round(tmp) mod 60,round(tmp*100) mod 100]);
|
|
lTime1.Caption := 'Time remain';
|
|
lTime2.Caption := 'elapsed';
|
|
end;
|
|
end;
|
|
Progress.Position := round((FileIn1.Position * 100) / FileIn1.Size);
|
|
end;
|
|
|
|
procedure TfMain.btFfwClick(Sender: TObject);
|
|
begin
|
|
if fPlayList.lbPlaylist.Items.Count-1 > fPlayList.lbPlaylist.ItemIndex then
|
|
fPlayList.lbPlaylist.ItemIndex := fPlayList.lbPlaylist.ItemIndex+1;
|
|
FileIn1.FileName := fPlayList.lbPlaylist.Items[fPlayList.lbPlaylist.ItemIndex];
|
|
ResetDisplay;
|
|
end;
|
|
|
|
procedure TfMain.btPlaylistClick(Sender: TObject);
|
|
begin
|
|
fPlaylist.Visible := True;
|
|
end;
|
|
|
|
procedure TfMain.btRewClick(Sender: TObject);
|
|
begin
|
|
if fPlayList.lbPlaylist.ItemIndex >= 1 then
|
|
fPlayList.lbPlaylist.ItemIndex := fPlayList.lbPlaylist.ItemIndex-1;
|
|
FileIn1.FileName := fPlayList.lbPlaylist.Items[fPlayList.lbPlaylist.ItemIndex];
|
|
ResetDisplay;
|
|
end;
|
|
|
|
procedure TfMain.btVizuClick(Sender: TObject);
|
|
begin
|
|
fVizu.Show;
|
|
end;
|
|
|
|
procedure TfMain.lTime1Click(Sender: TObject);
|
|
begin
|
|
case TimeFormat of
|
|
tfElapsed:TimeFormat := tfRemain;
|
|
tfRemain:TimeFormat := tfElapsed;
|
|
end;
|
|
ResetDisplay;
|
|
end;
|
|
|
|
procedure TfMain.resetDisplay;
|
|
var
|
|
tmp : real;
|
|
begin
|
|
lFilename.Caption := Format('File:%s',[ExtractFileName(FileIn1.FileName)]);
|
|
case TimeFormat of
|
|
tfElapsed:
|
|
begin
|
|
tmp := 0;
|
|
// if FileIn1.Size > 0 then
|
|
// tmp := ((FileIn1.Position * FileIn1.TotalTime) / FileIn1.Size);
|
|
lTime.Caption := Format('%.2d:%.2d:%.2d',[round((tmp-30) / 60) mod 120,round(tmp) mod 60,round(tmp*100) mod 100]);
|
|
// tmp := FileIn1.TotalTime-((FileIn1.Position * FileIn1.TotalTime) / FileIn1.Size);
|
|
lLeft.Caption := Format('%.2d:%.2d:%.2d',[round((tmp-30) / 60) mod 120,round(tmp) mod 60,round(tmp*100) mod 100]);
|
|
lTime1.Caption := 'Time elapsed';
|
|
lTime2.Caption := 'left';
|
|
end;
|
|
tfRemain:
|
|
begin
|
|
// if FileIn1.Size > 0 then
|
|
// tmp := ((FileIn1.Position * FileIn1.TotalTime) / FileIn1.Size);
|
|
lLeft.Caption := Format('%.2d:%.2d:%.2d',[round((tmp-30) / 60) mod 120,round(tmp) mod 60,round(tmp*100) mod 100]);
|
|
// tmp := FileIn1.TotalTime-((FileIn1.Position * FileIn1.TotalTime) / FileIn1.Size);
|
|
lTime.Caption := Format('%.2d:%.2d:%.2d',[round((tmp-30) / 60) mod 120,round(tmp) mod 60,round(tmp*100) mod 100]);
|
|
lTime1.Caption := 'Time remain';
|
|
lTime2.Caption := 'elapsed';
|
|
end;
|
|
end;
|
|
// Progress.Position := round((FileIn1.Position * 100) / FileIn1.Size);
|
|
end;
|
|
|
|
initialization
|
|
{$IFDEF FPC}
|
|
{$I umain.lrs}
|
|
{$ELSE}
|
|
{$R *.dfm}
|
|
{$ENDIF}
|
|
|
|
end.
|
|
|