unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, ComCtrls, MPlayerCtrl, DateUtils;

type

  { TForm1 }

  TForm1 = class(TForm)
    BtOuvrir: TButton;
    BtReculer: TButton;
    BtAvancer: TButton;
    BtPlay: TButton;
    BtPosition: TButton;
    LbPos: TLabel;
    LbDuree: TLabel;
    MPlayerControl1: TMPlayerControl;
    OpenDialog1: TOpenDialog;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    TrackBarVideo: TTrackBar;
    procedure BtOuvrirClick(Sender: TObject);
    procedure BtReculerClick(Sender: TObject);
    procedure BtAvancerClick(Sender: TObject);
    procedure BtPlayClick(Sender: TObject);
    procedure BtPositionClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure MPlayerControl1Play(Sender: TObject);
    procedure MPlayerControl1Playing(ASender: TObject; APosition: single);
    procedure MPlayerControl1Stop(Sender: TObject);
    procedure TrackBarVideoChange(Sender: TObject);
  private
    { private declarations }

  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var
   FormatsVideo,
   FormatsAudio   : String;
begin
  // On met un titre sympa
  Caption:='LazMPlayer - Serge Arbiol - Juillet 2017';
  // On règle le volume de départ
  MPlayerControl1.Volume := 150;
  // Paramètres de lancement de MPlayerControl1
  MPlayerControl1.StartParam := '-vo x11 -zoom -fs';
  // Propriété filter du dialogue d'ouverture de fichiers
  FormatsVideo:='*.AVI;*.avi;*.WMV;*.wmv;*.MOV;*.mov;*.MKV;*.mkv;*.MP4;*.mp4;*.MPG;*.mpg;*.MPEG;*.mpeg;*.VOB;*.vob;*.FLV;*.flv;*.WEBM;*.webm';
  FormatsAudio:='*.MP3;*.mp3;*.AAC;*.aac;*.WAV;*.wav;*.WMA;*.wma;*.CDA;*.cda;*.FLAC;*.flac;*.M4A;*.m4a;*.MID;*.mid;*.MKA;*.mka;*.OGG;*.ogg;*.APE;*.ape';
  OpenDialog1.Filter:='Vidéo|'+FormatsVideo+'|Audio|'+FormatsAudio;
end;

procedure TForm1.MPlayerControl1Play(Sender: TObject);
begin
  Caption := MPlayerControl1.Filename;
  TrackBarVideo.Max := Trunc(MPlayerControl1.Duration);
  LbDuree.Caption:=FormatDateTime('hh:nn:ss,zzz', MPlayerControl1.Duration / (24 * 60 * 60));
end;

procedure TForm1.MPlayerControl1Playing(ASender: TObject; APosition: single);
begin
   If (MPlayerControl1.Duration>0) Then
   begin
        // pour éviter la récursivité
        TrackBarVideo.OnChange:=Nil;
        TrackBarVideo.Position:=Trunc(APosition);
        LbPos.Caption := FormatDateTime('hh:nn:ss,zzz', APosition / (24 * 60 * 60));
        // rétablit la procédure
        TrackBarVideo.OnChange := @TrackBarVideoChange;
   end;
end;

procedure TForm1.MPlayerControl1Stop(Sender: TObject);
begin
  If csDestroying In ComponentState Then exit;
  Caption := 'LazMPlayer - Serge Arbiol - Juillet 2017';
end;

procedure TForm1.TrackBarVideoChange(Sender: TObject);
begin
  // On affecte au lecteur la position correspondant à celle de TrackBarVideo
  If (MPlayerControl1.Running) then MPlayerControl1.Position := TrackBarVideo.Position;
end;

procedure TForm1.BtOuvrirClick(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    MPlayerControl1.Stop;
    MPlayerControl1.Filename:=OpenDialog1.FileName;
    MPlayerControl1.Play;
  end;
end;

procedure TForm1.BtReculerClick(Sender: TObject);
begin
  // Recule d'1 seconde
  If (MPlayerControl1.Running) then MPlayerControl1.Position:=MPlayerControl1.Position-1;
end;

procedure TForm1.BtAvancerClick(Sender: TObject);
begin
  // Avance d'1 seconde
  If (MPlayerControl1.Running) then MPlayerControl1.Position:=MPlayerControl1.Position+1;
end;

procedure TForm1.BtPlayClick(Sender: TObject);
begin
  If (MPlayerControl1.Running) then MPlayerControl1.Paused := Not MPlayerControl1.Paused;
end;

procedure TForm1.BtPositionClick(Sender: TObject);
Var
   Chaine : String;
begin
  // Place le lecteur sur la position indiquée dans le Caption du bouton
  if (MPlayerControl1.Duration>0) Then
  begin
      MPlayerControl1.Paused := True;
      Chaine:=BtPosition.Caption;
      // convertit chaine au format hh:mn:ss.mls en TDateTime
      // si le séparateur décimal est une virgule, la remplacer par un point
      // ne surtout pas utiliser DecimalSeparator := ','
      Chaine:=StringReplace(Chaine,',','.',[rfReplaceAll]);
      // SecondOfTheDay de l'unité DateUtils renvoie le résultat d'une date en secondes
      // -> permet de convertir en secondes une chaine comme '00:01:20,123'
      // -> ajouter DateUtils dans uses
      MPlayerControl1.Position:=SecondOfTheDay(StrToTime(Chaine));
  end;

end;

end.

