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.