Audio-Play-MPG123
view release on metacpan or search on metacpan
mpg123/tools/Mp3play view on Meta::CPAN
{ # an ascii character is on input
# so add it to search pattern
$ReadLine=substr($ReadLine,0,$ReadingLineCurrentPos).$_.substr($ReadLine,$ReadingLineCurrentPos);
$ReadingLineCurrentPos++;
$ReadingLineStartPos=$ReadingLineCurrentPos-$Width+length($ReadingLinePrompt)+1 if($ReadingLineCurrentPos-$ReadingLineStartPos>=$Width-length($ReadingLinePrompt));
$ReadingLineStartPos=0 if($ReadingLineStartPos<0);
Display("reading-line");
}
elsif(unpack("C",$_)==12)
{ # ASCII "Ctrl-L" - redraw screen
Display("full");
}
elsif(unpack("C",$_)==3)
{ # ASCII "Ctrl-C" - quit
$Exit=1;
}
elsif(unpack("C",$_)==27)
{ # ASCII "Esc" - abort search
# pattern
$ReadLine="";
$ReadingLine=0;
HideCursor();
Display("sort");
}
elsif(unpack("C",$_)==9)
{ # ASCII "Tab" - try to expand
# line to an existing file name
if($ReadingLineExpandToFileName)
{ # expanding is turned on
my $ReadLineStartPos=0;
if(substr($ReadLine,0,1) eq "@")
{ # we have a playlist
$ReadLineStartPos=1;
}
$ReadLineTemp=ExpandToFileName(substr($ReadLine,$ReadLineStartPos,$ReadingLineCurrentPos-$ReadLineStartPos));
$ReadLine=substr($ReadLine,0,$ReadLineStartPos).$ReadLineTemp.substr($ReadLine,$ReadingLineCurrentPos);
$ReadingLineCurrentPos=$ReadLineStartPos+length($ReadLineTemp);
$ReadingLineStartPos=$ReadingLineCurrentPos-$Width+length($ReadingLinePrompt)+1 if($ReadingLineCurrentPos-$ReadingLineStartPos>=$Width-length($ReadingLinePrompt));
$ReadingLineStartPos=0 if($ReadingLineStartPos<0);
Display("reading-line");
}
}
}
else
{
if(($_ eq "bs")||($_ eq "kb"))
{ # ASCII backspace key or
# termcap's backspace key
if($ReadingLineCurrentPos)
{
$ReadingLineCurrentPos--;
substr($ReadLine,$ReadingLineCurrentPos,1,"");
Display("reading-line");
}
}
if($_ eq "kD")
{ # termcap's delete character
Display("reading-line") if(substr($ReadLine,$ReadingLineCurrentPos,1,"") ne "");
}
if($_ eq "kl")
{ # termcap's move cursor left key
$ReadingLineCurrentPos--;
$ReadingLineCurrentPos=0 if($ReadingLineCurrentPos<0);
$ReadingLineStartPos=$ReadingLineCurrentPos if($ReadingLineStartPos>$ReadingLineCurrentPos);
Display("reading-line");
}
if($_ eq "kr")
{ # termcap's move cursor right
# key
$ReadingLineCurrentPos++;
$ReadingLineCurrentPos=length($ReadLine) if($ReadingLineCurrentPos>length($ReadLine));
$ReadingLineStartPos=$ReadingLineCurrentPos-$Width+length($ReadingLinePrompt)+1 if($ReadingLineCurrentPos-$ReadingLineStartPos>=$Width-length($ReadingLinePrompt));
$ReadingLineStartPos=0 if($ReadingLineStartPos<0);
Display("reading-line");
}
if($_ eq "kh")
{ # termcap's move cursor home key
$ReadingLineStartPos=0;
$ReadingLineCurrentPos=0;
Display("reading-line");
}
if($_ eq "kH")
{ # termcap's move cursor hold
# down key
$ReadingLineCurrentPos=length($ReadLine);
$ReadingLineStartPos=$ReadingLineCurrentPos-$Width+length($ReadingLinePrompt)+1;
$ReadingLineStartPos=0 if($ReadingLineStartPos<0);
Display("reading-line");
}
}
}
next;
}
if($ReadingSearchPattern)
{
$ReadingSearchPattern=0;
$SearchPattern=$ReadLine;
if($SearchPattern ne "")
{
Search($SearchDirection);
}
else
{
Display("sort");
}
}
if($AddingTrack)
{ # finished adding new tracks
$ReadingLineExpandToFileName=0;
if(($ReadLine ne "")&&(!$AddingTrackWaitingForAnyKey))
{ # really adding new tracks
my @TrackNew=@Track;
my $ProgramName=$0;
$0="";
@Track=();
GotoXY(0,$Height);
if(substr($ReadLine,0,1) eq "@")
{ # read given playlist
ReadPlayList(substr($ReadLine,1));
}
else
{ # read given file or files
# in given directory
ReadFile($ReadLine);
}
$0=$ProgramName;
foreach (@Track)
{ # create list of unread MP3
# info files
push @UnreadMP3Info,$_ if(!$MP3InfoRead{$_});
}
splice @TrackNew,$SelectedTrack,0,@Track; # insert new files at current
# position
@Track=@TrackNew;
$NumberWidth=length($#Track+1); # track number width
if(!$ErrorAddingToPlayList)
{ # there were no errors while
# adding new tracks to play list
$AddingTrack=0;
}
else
{ # error adding to play list
print STDOUT "PRESS ANY KEY TO CONTINUE";
mpg123/tools/Mp3play view on Meta::CPAN
Display("filename"); # update display filename status
next;
}
if($_ eq "D")
{ # ASCII "D" - display directory
$Directory=1-$Directory;
if($DisplaySequence=~/D/)
{ # if there is a real change in
# the display
GenerateTrackText();
Display("list-full"); # update play list
}
Display("directory"); # update display directory
# status
next;
}
if($_ eq "Y")
{ # ASCII "Y" - display year
$Year=1-$Year;
if($DisplaySequence=~/Y/)
{ # if there is a real change in
# the display
GenerateTrackText();
Display("list-full"); # update play list
}
Display("year"); # update display year
next;
}
if($_ eq "U")
{ # ASCII "U" - display music type
$MusicType=1-$MusicType;
if($DisplaySequence=~/U/)
{ # if there is a real change in
# the display
GenerateTrackText();
Display("list-full"); # update play list
}
Display("musictype"); # update display music type
# status
next;
}
if(($_ eq "c")||($_ eq "C"))
{ # ASCII "c" or ASCII "C" - go
# to current track in the list
$SelectedTrack=$CurrentTrack;
if(($SelectedTrack<$StartVPos)||($SelectedTrack>=$StartVPos+$ListHeight))
{
$StartVPos=$SelectedTrack-int($ListHeight/2);
$StartVPos=$#Track-$ListHeight+1 if($StartVPos>$#Track-$ListHeight+1);
$StartVPos=0 if($StartVPos<0);
}
Display("list"); # update play list
next;
}
if(unpack("C",$_)==12)
{ # ASCII "Ctrl-L" - redraw screen
Display("full"); # display everything
next;
}
if(($_ eq "j")||($_ eq "kd"))
{ # ASCII "j" or termcap's cursor
# down key - move selection one
# line down
$SelectedTrack++;
$SelectedTrack=$#Track if($SelectedTrack>$#Track);
$StartVPos++ if($SelectedTrack>=$StartVPos+$ListHeight);
Display("list"); # update play list
next;
}
if(($_ eq "k")||($_ eq "ku"))
{ # ASCII "k" or termcap's cursor
# up key - move selection one
# line up
$SelectedTrack--;
$SelectedTrack=0 if($SelectedTrack<0);
$StartVPos-- if($SelectedTrack<$StartVPos);
Display("list"); # update play list
next;
}
if(($_ eq "g")||($_ eq "kh"))
{ # ASCII "g" or termcap's cursor
# home key - move selection to
# the top
$SelectedTrack=0;
$StartVPos=0;
Display("list"); # update play list
next;
}
if(($_ eq "G")||($_ eq "kH"))
{ # ASCII "G" or termcap's cursor
# hold down key - move selection
# to the bottom
$SelectedTrack=$#Track;
$StartVPos=$#Track-$ListHeight+1;
$StartVPos=0 if($StartVPos<0);
Display("list"); # update play list
next;
}
if(($_ eq "\n")||($_ eq "\r"))
{ # ASCII newline or ASCII
# carriage return - play
# selected track
$CurrentTrack=$SelectedTrack;
KillMPG123(); # stop playing current track if
# any
$Playing=1;
next;
}
if(($_ eq "kN")||(unpack("C",$_)==6))
{ # ASCII "Ctrl-F" of termcap's
# key for next page - move
# selection one page down
$SelectedTrack=$StartVPos+$ListHeight-1;
$SelectedTrack=$#Track if($SelectedTrack>$#Track);
$StartVPos=$SelectedTrack;
$StartVPos=$#Track-$ListHeight+1 if($StartVPos>$#Track-$ListHeight+1);
$StartVPos=0 if($StartVPos<0);
Display("list"); # update play list
next;
}
if(($_ eq "kP")||(unpack("C",$_)==2))
{ # ASCII "Ctrl-B" or termcap's
# key for previous page - move
# selection one page up
$SelectedTrack=$StartVPos;
$StartVPos=$SelectedTrack-$ListHeight+1;
$StartVPos=0 if($StartVPos<0);
Display("list"); # update play list
next;
}
if(($_ eq "h")||($_ eq "kl"))
{ # ASCII "h" or termcap's cursor
# left key - shift play list
# window one character left
$StartHPos--;
$StartHPos=0 if($StartHPos<0);
Display("list"); # update play list
next;
}
if(($_ eq "l")||($_ eq "kr"))
{ # ASCII "l" or termcap's cursor
# right key - shift play list
# window one character right
$StartHPos++;
$StartHPos=$TrackTextMaxLength-ListWidth() if($StartHPos>$TrackTextMaxLength-ListWidth());
$StartHPos=0 if($StartHPos<0);
Display("list"); # update play list
next;
}
if(unpack("C",$_)==8)
{ # ASCII "Ctrl-H" - shift play
# list window half window left
$StartHPos-=int(ListWidth()/2);
$StartHPos=0 if($StartHPos<0);
Display("list"); # update play list
next;
}
if(unpack("C",$_)==18)
{ # ASCII "Ctrl-R" - shift play
# list window half window right
$StartHPos+=int(ListWidth()/2);
$StartHPos=$TrackTextMaxLength-ListWidth() if($StartHPos>$TrackTextMaxLength-ListWidth());
$StartHPos=0 if($StartHPos<0);
Display("list"); # update play list
next;
}
if($_ eq "0")
{ # ASCII "0" - shift play list
# window to the left margin
$StartHPos=0;
Display("list"); # update play list
next;
}
if($_ eq "\$")
{ # ASCII "$" - shift play list
# window to the right margin
$StartHPos=$TrackTextMaxLength-ListWidth();
$StartHPos=0 if($StartHPos<0);
Display("list"); # update play list
next;
}
if($_ eq "M")
{ # ASCII "M" - show numbers
$Numbers=1-$Numbers;
$StartHPos=$TrackTextMaxLength-ListWidth() if($StartHPos>$TrackTextMaxLength-ListWidth());
$StartHPos=0 if($StartHPos<0);
Display("numbers"); # update show numbers status
Display("list-full"); # update play list
next;
}
if(unpack("C",$_)==9)
{ # ASCII "Ctrl-I" - change
# display sequence for artist
ChangeDisplaySequence("I");
next;
}
if(unpack("C",$_)==1)
{ # ASCII "Ctrl-A" - change
# display sequence for album
ChangeDisplaySequence("A");
next;
mpg123/tools/Mp3play view on Meta::CPAN
return $& if($KeyboardInput=~s/^.//s); # no termcap capability detected
# return first ASCII character
return "";
}
sub ChangeDisplaySequence
{ # subroutine to change display
# sequence of a given argument
my $Char;
my $x;
$x=index($DisplaySequence,$_[0]);
if($x==-1)
{ # argument is in not the
# DisplaySequence, so add it to
# the end
$DisplaySequence.=$_[0];
GenerateTrackText(),Display("list-full") if(${$DisplayParameter{$_[0]}});
# update play list if this
# argument is displayed
}
else
{ # argument is in the
# DisplaySequence, so change its
# position
if($x)
{ # argument is in the middle, so
# exchange it with the one
# before
substr($DisplaySequence,$x,1,"_");
$Char=substr($DisplaySequence,$x-1,1,$_[0]);
substr($DisplaySequence,$x,1,$Char);
GenerateTrackText(),Display("list-full") if((${$DisplayParameter{$_[0]}})&&(${$DisplayParameter{$Char}}));
# update play list if both
# arguments are displayed
}
else
{ # argument is at the beginning,
# so remove it from the
# beginning and add it at the
# end
substr($DisplaySequence,$x,1,"");
$DisplaySequence.=$_[0];
if(${$DisplayParameter{$_[0]}})
{ # if this argument is displayed
# and any other arguments are
# displayed, then update play
# list
$Char=FALSE;
for($x=0;$x<length($DisplaySequence);$x++)
{
$Char||=(${$DisplayParameter{substr($DisplaySequence,$x,1)}}!=0);
}
GenerateTrackText(),Display("list-full") if($Char);
}
}
}
Display("sequence"); # update sequence display
}
sub GotoXY
{ # subroutine to put cursor to
# the given location on the
# screen
print STDOUT $TermCap->Tgoto('cm',int($_[0]),int($_[1]));
}
sub ClearScreen
{ # subroutine to clear the screen
print STDOUT $TermCap->{'_cl'};
}
sub Char
{ # subroutine to return special
# characters depending on
# display type (7-bit ascii)
return $Display{$_[0],$_7BitAsciiDisplay};
}
sub HideCursor
{ # subroutine to hide cursor
print STDOUT $TermCap->{'_vi'};
}
sub ShowCursor
{ # subroutine to show cursor
print STDOUT $TermCap->{'_ve'};
}
sub NormalMode
{ # subroutine to put terminal
# into normal mode
print STDOUT NormalModeStr() if(!$_7BitAsciiDisplay);
}
sub ReverseMode
{ # subroutine to put terminal
# into reverse mode
print STDOUT ReverseModeStr() if(!$_7BitAsciiDisplay);
}
sub BoldMode
{ # subroutine to put terminal
# into bold mode
print STDOUT BoldModeStr() if(!$_7BitAsciiDisplay);
}
sub HalfBrightMode
{ # subroutine to put terminal
# into half bright mode
print STDOUT HalfBrightModeStr() if(!$_7BitAsciiDisplay);
}
sub NormalModeStr
{ # subroutine that returns string
# putting terminal into normal
# mode
return "" if($_7BitAsciiDisplay);
return $TermCap->{'_me'};
}
sub ReverseModeStr
{ # subroutine that returns string
# putting terminal into reverse
# mode
return "" if($_7BitAsciiDisplay);
return $TermCap->{'_mr'};
}
sub BoldModeStr
{ # subroutine that returns string
# putting terminal into bold
# mode
return "" if($_7BitAsciiDisplay);
return $TermCap->{'_md'};
}
sub HalfBrightModeStr
{ # subroutine that returns string
# putting terminal into half
# bright mode
return "" if($_7BitAsciiDisplay);
return $TermCap->{'_mh'};
}
sub Display
( run in 0.611 second using v1.01-cache-2.11-cpan-5b529ec07f3 )