#!/usr/bin/perl -w

use lib '/usr/local/bin';

use slmini;
use FileHandle;
use Time::HiRes qw( usleep );

sub debug;

# Weiterhin benötigt:
# - gqview
#   UND:
# - xmms mit xmmsctrl
#   ODER:
# - audacious mit audtool

######################################################################
### Voreinstellungen
######################################################################

$version = '1.3';
$appname = 'diashow';

######################################################################
### Hauptprogramm
######################################################################

$debug = $FALSE;

Hilfe() unless defined $ARGV[1];

$slide_interval = shift;
$slidelist = shift;
$songlist  = shift || undef;

@slides = ();
@songs = ();

start_gqview();
start_music_player();

@slides = read_slidelist($slidelist);
if (defined $songlist)
{
  @songs  = read_songlist($songlist);
}

if (defined $songlist)
{
  # Musik starten
  music_set_volume(100);
  music_play_songs(@songs);
}

# Vollbildmodus
system('gqview -r -fs');

# Bilder-Liste einlesen
@tmp = ();
for($i=0; $i<=$#slides; $i++)
{
  $_ = $slides[$i];
  debug "Liste: $i -> $_\n";
  m/(\S+)\s*(\d*)/;
  $bild = $1;
  print "Bild '$bild' kann nicht gelesen werden!\n" unless -r $bild;
  push @tmp, $bild;
}
system('gqview', '-r', @tmp);

for($i=0; $i<=$#slides; $i++)
{
  debug "i: $i\n";
  $_ = $slides[$i];
  debug "Zeile: '$_'\n";
  m/(\S+)\s*(\d*)/;
  $bild = $1;
  debug "Bild: '$bild'\n";
  $pause = $2;
  $pause = $pause ne '' ? $pause : $slide_interval;
  # Letztes Bild?
  if ($i == $#slides)
  {
    debug "Letztes Bild!\n";
    $pause = $pause-5; # Musik-Fade-Out dauert ca. 5 Sekunden
    $pause = 0 if $pause < 0;
    debug "Pause: '$pause'\n";
    sleep ($pause);
  }
  else
  {
    debug "Pause: '$pause'\n";
    sleep ($pause);
    debug "Nächstes Bild...\n";
    system("gqview -r -n");
  }
}

if (defined $songlist)
{
  system("date") if $debug;
  fade_out();
  system("date") if $debug;
  music_stop();
}


######################################################################
### Unterprogramme
######################################################################

sub music_set_volume
{
  # Parameter: Laustärke in Prozent
  #
  my $volume = shift;
  system("xmmsctrl vol         $volume") if ($xmms);
  system("audtool --set-volume $volume") if ($audacious);
  if ( $audacious && ($volume == 100) )
  {
    # Sicherstellen, dass der audacious auch wirklich auf 100% ist
    my $tmp = 0;
    while ($tmp != 100)
    {
      system("audtool --set-volume 100");
      sleep 1;
      $tmp = `audtool --get-volume`;
      chomp($tmp);
    }
  }
}


sub music_play_songs
{
  # Parameter: Liste der Lieder
  #
  my @songs = @_;
  system('xmms',      @songs) if ($xmms);
  system('audacious', @songs) if ($audacious);
}


sub music_stop
{
  system("xmmsctrl stop")           if ($xmms);
  system("audtool --playback-stop") if ($audacious);
}


sub start_gqview
{
  my $tmp = which("gqview");
  if (defined $tmp)
  {
    if (is_not_running("gqview"))
    {
      system("$tmp &");
      sleep 2;
    }
    return;
  }
  die "gqview kann nicht gefunden werden!\n";
}


sub is_not_running
{
  my $program = shift;
  if (`ps -efww | grep $program | grep -v grep | grep -v " $$ "`)
  {
    return $FALSE;
  }
  return $TRUE;
}


sub start_music_player
{
  # Setzt die globale Variablen $xmms und $audacious auf TRUE oder FALSE
  #
  my $tmp;
  $tmp = which("xmms");
  if (defined $tmp)
  {
    $xmms      = $TRUE;
    $audacious = $FALSE;
    if (is_not_running("xmms"))
    {
      system("$tmp &");
      sleep 2;
    }
    return;
  }
  $tmp = which("audacious");
  if (defined $tmp)
  {
    $xmms      = $FALSE;
    $audacious = $TRUE;
    if (is_not_running("audacious"))
    {
      system("$tmp &");
      sleep 2;
    }
    return;
  }
  die "Es kann weder xmms noch audacious gefunden werden!\n";
}


sub read_slidelist
{
  my $slidelist = shift;
  my @slides = ();
  my $fh = FileHandle->new();
  open($fh, $slidelist) || die "Fehler beim Öffnen von $slidelist.\n";
  while (<$fh>)
  {
    chomp;
    next if /^#/;
    push @slides, $_;
  }
  close $fh;
  return @slides;
}


sub read_songlist
{
  my $songlist = shift;
  my @songs = ();
  my $fh = FileHandle->new();
  open($fh, $songlist) || die "Fehler beim Öffnen von $songlist.\n";
  while (<$fh>)
  {
    chomp;
    next if /^#/;
    push @songs, $_;
  }
  close $fh;
  return @songs;
}


sub fade_out
{
  # Kompletter Fade-Out dauert 5 Sekunden
  my $i = 100;
  while ($i > 0)
  {
    music_set_volume($i);
    usleep(70000);
    $i--;
    $i--;
  }
}


sub debug
{
  warn @_ if $debug == $TRUE;
}


sub Kopf
{
  my $head = "$appname $version   -   von Stephan L<F6>scher";
  return "\n$head\n" . '~' x length($head) . "\n";
}


sub Hilfe
{
  printumlaute
  Kopf().
"Syntax: $appname Verzögerung Bilderlistfile Liederlistfile

Verzögerung: Zeit in Sekunden zwischen den Bildern.

In den Files stehen zeilenweise die Dateinamen mit vollem Pfad.

Bei den Bilder kann optional mit Leerzeichen getrennt noch in der gleichen
Zeile dahinter stehen, wie lange das Bild in Sekunden gezeigt werden soll.

";
  exit;
}

