#!/usr/bin/perl -w ######################## # Jigstar Music Daemon # ######################## use POSIX ":sys_wait_h"; use Audio::Daemon::MPG123::Server; use Audio::Daemon::MPG123::Client; use Config::Auto; our (@Queue, $Config, $PortCounter); $| = 1; mkdir "/tmp/jmd"; open LOCK, "/var/lock/jmd" and do { kill 0, <LOCK> and die "Error: JMD already running!"; }; open LOCK, ">/var/lock/jmd"; print LOCK $$; close LOCK; $Config = Config::Auto::parse("/etc/jmd"); if ($Config->{mixer} eq "esd") { # Start ESD } $SIG{ALRM} = sub { return unless -s "/tmp/jmd/input"; open INPUT, "/tmp/jmd/input"; chomp($Cmd = <INPUT>); close INPUT; Play($Cmd) if $Cmd =~ s/^play //; Add($Cmd) if $Cmd =~ s/^add //; Next() if $Cmd eq "next"; Prev() if $Cmd eq "prev"; Restart() if $Cmd eq "restart"; Forward() if $Cmd eq "forward"; Backward() if $Cmd eq "backward"; Pause() if $Cmd eq "pause"; Resume() if $Cmd eq "resume"; Toggle() if $Cmd eq "toggle"; Stop() if $Cmd eq "stop"; $SIG{QUIT}->() if $Cmd eq "quit"; }; $SIG{CHLD} = sub { my $Stiff; while (($Stiff = waitpid(-1, &WNOHANG)) > 0) { pop @Queue; sleep($Config->{lag}); Resume() if @Queue; } }; $SIG{QUIT} = sub { unlink "/var/lock/jmd"; # Blank files # Close all instances exit; }; $SIG{INT} = $SIG{QUIT}; sub Play { Pause() if @Queue; my $Port = 9100 + ++$PortCounter; my $Server = new Audio::Daemon::MPG123::Server (Port => $Port); my $Client = new Audio::Daemon::MPG123::Client (Server => "localhost" +, Port => $Port); push @Queue, { Server => $Server, Client => $Client }; $Queue[-1]->{Server}->mainloop() unless fork(); Add(shift); } sub Add { @Songs = split(/\s+/, shift); # Handle filenames with escapes. $Queue[-1]->{Client}->add(@Songs) if @Queue; } sub Next { $Queue[-1]->{Client}->next() if @Queue; } sub Prev { $Queue[-1]->{Client}->prev() if @Queue; } sub Restart { $Queue[-1]->{Client}->jump("0s") if @Queue; } sub Forward { $Queue[-1]->{Client}->jump("+" . $Config->{forward} . "s") if @Queue; } sub Backward { $Queue[-1]->{Client}->jump("-" . $Config->{backward} . "s") if @Queue +; } sub Pause { return unless @Queue; my $Status = $Queue[-1]->{Client}->status(); $Queue[-1]->{Client}->pause() if $Status->{state} == 2; } sub Resume { return unless @Queue; my $Status = $Queue[-1]->{Client}->status(); $Queue[-1]->{Client}->pause() if $Status->{state} == 1; } sub Toggle { $Queue[-1]->{Client}->pause() if @Queue; } sub Stop { } #open SONG, ">/tmp/jmd/song"; #open TIMES, ">/tmp/jmd/times"; #do { # if (@Queue) { # my $Status = $Queue[-1]->{Client}->status(); # print "1: [" . $#Queue + 1 . "] " . $Status->{url} . do { " (P)" if + $Status->{state} == 1; }; # print "\n"; # my @Times = split(/,/, $Status->{frame}); # print "2: " . $Times[2] . "(" . $Times[3] . ")"; # print "\n"; # } # sleep 1; #} while 1; sleep while 1;
In reply to Audio::Daemon::MPG123 by dabreegster
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |