#! /usr/bin/perl # # route66 - front end for database driven mp3 player # by: Anders Brownworth (anders-route66@evantide.com) # # contributors: Michael Kidd (linuxkidd@wolfsource.org) # Peter Peterson # Ryan E. Hammond # # this program drives a Matrix Orbital 20 character by 4 line display # module connected to a serial port. they cost about $200 but are not # necessary if you set the $display_type to "console". you should go set # basic options in Settings.pm such as the serial port and control keys # that you intend to use. # # # included James Kershner's Play All and Preferencing with minor fixes use Settings; use Database; use Display; use Menu; use Audio::Play::MPG123; my ( $display_type, $serial_port, $up_key, $down_key, $forward_key, $back_key, $setvol_cmd, $menu_scr_mode, $radio_pass_thru, $halt_cmd ) = settings_get ( ); $version = '0.5.4'; $filesystemid = 1; $main_pos = 0; $options_pos = 0; $select_pos = 0; $exit = 0; $time_mode = "down"; $scroll_song_mode = "marquee"; $scroll_song_lor = "r"; $scroll_song_count = 0; $scroll_song_percent = 70; $scroll_art_mode = "marquee"; $scroll_art_lor = "r"; $scroll_art_count = 0; $scroll_art_percent = 75; $master_vol = 75; $random_play = 1; $play_menu_mode = "play"; $pref_enable = 0; $sure_select = 0; srand; ######################################################### display_init ( ); display_write ( "route66 - v$version" ); ( $dbh, $version ) = database_open (); display_write "db version: $version"; $player = new Audio::Play::MPG123; display_write "sound system init"; set_environment ( ); sleep 1; display_clear ( ); display_init_bargraph ( ); display_time ( ); ################################ # main menu loop ################################ while ( !$exit ) { # added play all command - jrk 7/30/01 @menu = ( "Select", "Play", "Play All", "Options", "Exit" ); display_clear(); menu_title ( "Main Menu" ); display_time ( ); $main_pos = menu_navigate ( @menu, $main_pos, 0 ); if ( $main_pos == 0 ) { select_menu ( ); } elsif ( $main_pos == 1 ) { system "$setvol_cmd -l 0"; play_menu ("normal"); system "$setvol_cmd -l $radio_pass_thru"; } elsif ( $main_pos == 2 ) { system "$setvol_cmd -l 0"; play_menu ("all"); system "$setvol_cmd -l $radio_pass_thru"; } elsif ( $main_pos == 3 ) { options_menu ( ); } elsif ( $main_pos == 4 ) { $exit = 1; } } $result = menu_yes_no ( "Halt the computer?", 0 ); if ( $result ) { display_clear (); display_write " shutdown -h now"; system "$halt_cmd"; } display_clear (); display_close (); #################################### # subroutines #################################### # # set_environment : sets current username, path and set. # sub set_environment { ( $usernameid, $pathid, $setid ) = database_get_current ( $dbh ); $username = database_get_username ( $dbh, $usernameid ); if ( ! $username ) { @usernames = database_get_all_usernames ( $dbh ); display_clear ( ); display_time ( ); menu_title ( "Select a Username" ); $usernameid = menu_navigate ( @usernames, 0, 0 ); $username = @usernames[$usernameid]; $usernameid ++; database_update_current ( $dbh, $usernameid, $pathid, $setid ); } @genres = database_get_all_genres ( $dbh ); @artists = database_get_all_artists ( $dbh ); @albums = database_get_all_albums ( $dbh ); @genres = sort @genres; @artists = sort @artists; @albums = sort @albums; system "$setvol_cmd -v $master_vol"; system "$setvol_cmd -l $radio_pass_thru"; return ( $usernameid, $pathid, $setid ); } # # select_menu : deals with stuff in the select menu # sub select_menu { my $exit = 0; $player->poll(0); if ($player->state == 1) { # player paused $player->stop; } while ( ! $exit ) { @menu = ( "by Genre", "by Artist", "by Album", "by Tempo", "by Preference", "by Saved Set", "Save This Set", "Unselect All" ); menu_title ( "Select" ); $result = menu_navigate ( @menu, $select_pos, 1 ); $select_pos = $result unless ( $result == -1 ); if ( $result == -1 ) { $exit = 1; } elsif ( $result == 0 ) { select_genre_menu ( ); } elsif ( $result == 1 ) { select_artist_menu ( ); } elsif ( $result == 2 ) { select_album_menu ( ); } elsif ( $result == 3 ) { # select_tempo_menu ( ); } elsif ( $result == 4 ) { # select_preference_menu ( ); } elsif ( $result == 5 ) { # select_set_menu ( ); } elsif ( $result == 6 ) { # select_saved_set ( ); } elsif ( $result == 7 ) { # unselect all undef @genres_selected; undef @albums_selected; undef @artists_selected; menu_info ( "Unselected", 2 ); } else { print "$result - out of bounds in select menu\n"; } } } sub select_genre_menu { menu_title ( "Genres" ); $select_genre_pos = menu_select ( \@genres, \@genres_selected, $select_genre_pos ); } sub select_album_menu { menu_title ( "Albums" ); $select_albums_pos = menu_select ( \@albums, \@albums_selected, $select_albums_pos ); } sub select_artist_menu { menu_title ( "Artists" ); $select_artists_pos = menu_select ( \@artists, \@artists_selected, $select_artists_pos ); } # # play_menu : deals with the play screen # sub play_menu { ($play_all) = @_; my $total = $x = $stop_pm = $result = 0; menu_title ( "Play Music" ); if ($play_all eq "normal") { @pathids = select_pathids ( ); } else { @pathids = select_all_pathids ( ); } $total = @pathids; if ( $total < 1 ) { menu_info ( "No music is selected", 2 ); } else { if ( $random_play ) { $max_no_rotate= int ( $total / 2 ); undef @no_rotate; undef @tracks; for $i ( 1..$total ) { push @tracks, $i; } } @songnames = build_songnames ( @pathids ); $stop_pm = 0; $current_song = 1; $player->poll(0); $paused = $player->state; if ( $paused == 1 ) { $jump=$cur_song; $current_song=$cur_song; } while ( ! $stop_pm ) { if ( $random_play ) { if ( $jump ) { $found = 0; for $i ( 0..$#tracks ) { if ( $tracks[$i] eq $current_song ) { $rd_track = $i; $found = 1; } } } else { if ( $current_song lt $#no_rotate ) { $cur_song = $no_rotate[$current_song]; $found = 0; $jump = $cur_song; } else { $rd_track = int ( rand $#tracks ); } } if ( $found || !$jump ) { $cur_song = $tracks[$rd_track]; push @no_rotate, splice ( @tracks, $rd_track, 1 ); if ( @no_rotate > $max_no_rotate ) { push @tracks, shift ( @no_rotate ); } } else { $cur_song = $jump; } } else { $cur_song = $current_song; } $jump=0; my ( $result, $track ) = play ( \@pathids, \@songnames, $cur_song ); if ( $result == 1 ) { # hard quit. exit to main menu. $stop_pm = 1; } elsif ( $result == 2 ) { # go back one track. $current_song --; $current_song -- if ( $current_song eq $#no_rotate ); } elsif ( $result == 3 ) { # go to next track. $current_song ++; $current_song = @no_rotate if ( $random_play); } else { # go to $track. $current_song = $track; $jump = $track; } if ( $current_song > $total ) { $current_song = 1; # start over at the beginning } elsif ( $current_song < 1 ) { $current_song = $total; # go to the end of the list $current_song = 0 if ( $random_play ); } } } } # # @songnames = build_songnames ( @pathids ); # spin through the array of songs and get the names # sub build_songnames { my @pathids = @_; my @songnames, @pathinfo; my $counter = 0; my $total = @pathids; while ( $counter < $total ) { @pathinfo = database_get_path ( $dbh, @pathids [ $counter ] ); $songid = @pathinfo [ 4 ]; @songinfo = database_get_song ( $dbh, $songid ); push @songnames, @songinfo [ 5 ]; $counter ++; } return @songnames; } sub select_all_pathids { my @pathids; my $sql = 0; $sql = "select distinct paths.pathid from paths"; menu_info ( "Building Playlist...", 0 ); @pathids = database_raw_sql ( $dbh, $sql ); return ( @pathids ); } # # @pathids = select_pathids ( ); # builds a playlist from the selections in @artists_selected, # @albums_selected, @genres_selected which I consider to be global. # sub select_pathids { my @pathids; my $albums_total, $artists_total, $genres_total, $junk, $time, $path, $pathid, $x; my $sql = $x = $genre_sql = $artist_sql = $album_sql = 0; $albums_total = @albums; while ( $x < $albums_total ) { if ( @albums_selected[$x] == 1 ) { $total ++; if ( $album_sql ) { $album_sql = $album_sql . ", '@albums[$x]'"; } else { $album_sql = "'@albums[$x]'"; } } $x ++; } $x = 0; $genres_total = @genres; while ( $x < $genres_total ) { if ( @genres_selected[$x] == 1 ) { $total ++; if ( $genre_sql ) { $genre_sql = $genre_sql . ", '@genres[$x]'"; } else { $genre_sql = "'@genres[$x]'"; } } $x ++; } $x = 0; $artists_total = @artists; while ( $x < $artists_total ) { if ( @artists_selected[$x] == 1 ) { $total ++; if ( $artist_sql ) { $artist_sql = $artist_sql . ", '@artists[$x]'"; } else { $artist_sql = "'@artists[$x]'"; } } $x ++; } if ( $total > 0 ) { $sqlbase = "select distinct paths.pathid from paths"; if ( $artist_sql ) { $sqlbase = $sqlbase . ", artists"; $sql = " ( artists.artistid = paths.artistid and artists.artist in ( $artist_sql ) )"; if ( $album_sql ) { $sqlbase = $sqlbase . ", albums"; $sql = $sql . " or ( albums.albumid = paths.albumid and albums.album in ( $album_sql ) )"; } if ( $genre_sql ) { $sqlbase = $sqlbase . ", genres"; $sql = $sql . " or ( genres.genreid = paths.genreid and genres.genre in ( $genre_sql ) )"; } } elsif ( $album_sql ) { $sqlbase = $sqlbase . ", albums"; $sql = " ( albums.albumid = paths.albumid and albums.album in ( $album_sql ) )"; if ( $genre_sql ) { $sqlbase = $sqlbase . ", genres"; $sql = $sql . " or ( genres.genreid = paths.genreid and genres.genre in ( $genre_sql ) )"; } } elsif ($genre_sql) { $sqlbase = $sqlbase . ", genres"; $sql = " ( genres.genreid = paths.genreid and genres.genre in ( $genre_sql ))"; } $sqlbase = $sqlbase . " where"; $sql = $sqlbase . $sql . ";"; menu_info ( "Building Playlist...", 0 ); @pathids = database_raw_sql ( $dbh, $sql ); } return ( @pathids ); } # # options_menu : deals with stuff in the options menu # sub options_menu { my $exit = 0; my @menu; while ( !$exit ) { @menu = ( "Set User [$username]", "Add User", "Delete User", "Set Filesystem", "Random", "Time Mode", "Adjust Display", "Screensaver", "Song Scroll", "Artist Scroll", "Enable Preferences", "Master Volume" ); menu_title ( "Options" ); $result = menu_navigate ( @menu, $options_pos, 1 ); $options_pos = $result unless ( $result == -1 ); if ( $result == -1 ) { $exit = 1; } elsif ( $result == 0 ) { options_set_user_menu ( ); } elsif ( $result == 1 ) { options_add_user_menu ( ); } elsif ( $result == 2 ) { menu_info ( "Delete not done", 2 ); } elsif ( $result == 3 ) { menu_info ( "Filesystem not done", 2 ); } elsif ( $result == 4 ) { display_clear(); @menu = ( "Random", "Sequential" ); menu_title ("Play Mode"); if ($random_play) { $result = menu_navigate ( @menu, 0, 1 ); } else { $result = menu_navigate ( @menu, 1, 1 ); } if ($result) { $random_play=0; } else { $random_play=1; } } elsif ( $result == 5 ) { @menu = ( "Count Up", "Count Down" ); menu_title ( "Time Mode" ); if ( $time_mode eq "up" ) { $result = menu_navigate ( @menu, 0, 1 ); } else { $result = menu_navigate ( @menu, 1, 1 ); } if ( $result == 0 ) { $time_mode = "up"; } else { $time_mode = "down"; } } elsif ( $result == 6 ) { menu_info ( "Adjust not done", 2 ); } elsif ( $result == 7 ) { menu_info ( "Screensaver not done", 2 ); } elsif ( $result == 8 ) { @menu = ( "Bounce", "Marquee" ); menu_title ( "Song Scroll" ); if ( $scroll_song_mode eq "bounce" ) { $result = menu_navigate ( @menu, 0, 1 ); } else { $result = menu_navigate ( @menu, 1, 1 ); } if ( $result == 0 ) { $scroll_song_mode = "bounce"; } else { $scroll_song_mode = "marquee"; } } elsif ( $result == 9 ) { @menu = ( "Bounce 100%", "Bounce 75%", "Bounce 50%", "Bounce 25%", "Marquee 100%", "Marquee 75%", "Marquee 50%", "Marquee 25%", "None" ); menu_title ( "Artist Scroll" ); if (( $scroll_art_mode eq "bounce" )&($scroll_art_percent eq 100)) { $result = menu_navigate ( @menu, 0, 1 ); } elsif (( $scroll_art_mode eq "bounce" )&($scroll_art_percent eq 75)) { $result = menu_navigate ( @menu, 1, 1 ); } elsif (( $scroll_art_mode eq "bounce" )&($scroll_art_percent eq 50)) { $result = menu_navigate ( @menu, 2, 1 ); } elsif (( $scroll_art_mode eq "bounce" )&($scroll_art_percent eq 25)) { $result = menu_navigate ( @menu, 3, 1 ); } elsif (( $scroll_art_mode eq "marquee" )&($scroll_art_percent eq 100)) { $result = menu_navigate ( @menu, 4, 1 ); } elsif (( $scroll_art_mode eq "marquee" )&($scroll_art_percent eq 75)) { $result = menu_navigate ( @menu, 5, 1 ); } elsif (( $scroll_art_mode eq "marquee" )&($scroll_art_percent eq 50)) { $result = menu_navigate ( @menu, 6, 1 ); } elsif (( $scroll_art_mode eq "marquee" )&($scroll_art_percent eq 25)) { $result = menu_navigate ( @menu, 7, 1 ); } elsif (( $scroll_art_mode eq "marquee" )&($scroll_art_percent eq 0)) { $result = menu_navigate ( @menu, 8, 1 ); } if ( $result == 0 ) { $scroll_art_mode = "bounce"; $scroll_art_percent = 100; } elsif ( $result == 1 ) { $scroll_art_mode = "bounce"; $scroll_art_percent = 75; } elsif ( $result == 2 ) { $scroll_art_mode = "bounce"; $scroll_art_percent = 50; } elsif ( $result == 3 ) { $scroll_art_mode = "bounce"; $scroll_art_percent = 25; } elsif ( $result == 4 ) { $scroll_art_mode = "marquee"; $scroll_art_percent = 100; } elsif ( $result == 5 ) { $scroll_art_mode = "marquee"; $scroll_art_percent = 75; } elsif ( $result == 6 ) { $scroll_art_mode = "marquee"; $scroll_art_percent = 50; } elsif ( $result == 7 ) { $scroll_art_mode = "marquee"; $scroll_art_percent = 25; } elsif ( $result == 8 ) { $scroll_art_mode = "marquee"; $scroll_art_percent = 0; } } elsif ( $result == 10 ) { display_clear(); @menu = ( "Skip hated songs", "Play everything" ); menu_title ("Prefs Mode"); if ($pref_enable) { $result = menu_navigate ( @menu, 0, 1 ); } else { $result = menu_navigate ( @menu, 1, 1 ); } if ($result) { $pref_enable=0; } else { $pref_enable=1; } } elsif ($result == 11) { display_clear(); menu_title("Master Volume"); display_time(); $vol_exit=0; $new_volume=$master_vol; while ( !$vol_exit ) { display_position(1,3); display_write("Volume: $new_volume"); display_position(1,4); menu_mini("Cancel", " ", "Save"); undef $key; $key=display_check_for_key(1); if ($key eq $up_key) { $new_volume+=5 unless ( $new_volume eq 100 ); }elsif ($key eq $down_key){ $new_volume-=5 unless ( $new_volume eq 0 ); }elsif ($key eq $back_key){ $vol_exit=1; }elsif ($key eq $forward_key){ $master_vol=$new_volume; system("$setvol_cmd -v $master_vol"); $vol_exit=1; } } } } } # # options_set_user_menu : select the current user # sub options_set_user_menu { my @usernames = database_get_all_usernames ( $dbh ); my $x = 0; $username = database_get_username ( $dbh, $usernameid ); $max = @usernames; while ( ( $username ne @usernames[$x] ) && ( $x >= $max ) ) { $x ++; } print "Warning!! User not found!" if ( $x > $max ); menu_title ( "Current User" ); $result = menu_navigate ( @usernames, $x, 1 ); if ( $result > -1 ) { $username = @usernames[$result]; $usernameid = database_get_usernameid ( $dbh, @usernames[$result] ); database_update_current ( $dbh, $usernameid, $pathid, $setid ); } } # # options_add_user_menu : add another user to the system # sub options_add_user_menu { my $name; menu_title ( "Add User" ); $name = menu_text_entry ( "Enter a Username", 20 ); $name =~ s/\s*$//; if ( $name ne "" ) { if ( menu_yes_no ( "Shall I add $name?", 1 ) ) { database_put_username ( $dbh, $name ); menu_info ( "$name added", 1 ); } } } # # rips through an array and returns 1 if there is a number # higher than 0 in it. # sub any_selected { my @ary = @_; my $key = $found = 0; while ( defined ( $key = pop ( @ary ) ) ) { if ( $key > 0 ) { $found = 1; } } return ( $found ); } # # ( $result, $newtrack ) = play ( \@pathids, \@song_names, $song_number ); # pulls up all the info for the pathid and plays the file. # sub play { my ( $pathids, $song_names, $song_number ) = @_; my $pathid = @$pathids [$song_number - 1]; ( $filesystemid, $contributorid, $artistid, $albumid, $songid, $genreid, $volume, $timestamp, $path ) = database_get_path ( $dbh, $pathid ); my ( $mood, $tempo, $endsilence, $tracknumber, $year, $song ) = database_get_song ( $dbh, $songid ); my ( $artist ) = database_get_artist ( $dbh, $artistid ); my ( $artistid, $album, $year ) = database_get_album ( $dbh, $albumid ); ( $pref ) = database_get_preference ( $dbh, $pathid, $usernameid ); $total_songs = @$pathids; $stop = $total = $stat = $minutes = $seconds = $percent = $key = 0; $last_seconds = $last_percent = $last_barval = ""; $barval = $sroll_art_count = 0; $start_volume = $volume; $start_pref = $pref; $old_song_number_selected = $song_number_selected = $song_number - 1; $display = "progress"; $old_play_menu_mode = $play_menu_mode; $progress_up = 0; $menu_up = 0; $play_menu_mode = "play"; if ( $volume < 1 ) { $volume = $volume * 100; # normalize volume } # add some simple minded preferencing. Basically, roll the dice. If # the value returned is higher than the preference # in the database we skip the song - jrk 7/30/01 if ($sure_select == 0 ) { #This disables this for direct song selection if ($pref_enable) { $rand; $rand_chance = int (rand scalar (100)); $pref_test = int ($pref); $sure_select = 0; if ( $pref_test < $rand_chance ){ return (3,0); } } }else{ $sure_select = 0; } database_put_history ( $dbh, $usernameid, $pathid ); system "$setvol_cmd -w $volume"; if ( !-e $path ) { print "\n\n\n"; print "The database returned an invalid path:\n[$path]\n\n"; $stop=3; } else { $player->poll(0); if ($player->state == 1) { #player is paused $player->pause; #unpause } else { $player->load($path); } #set the frequency the player sends messages to the queue $player->statfreq(.01/$player->tpf); $player->poll(0); # frame 2 is current second and frame 3 is seconds left. # frame 1 counts down remaining frames by frame # This is total sec / time per frame (Gets total frames) $total = (($player->{frame}[2] + $player->{frame}[3])/$player->tpf); $stat = (($player->{frame}[2])/$player->tpf); #this is current frame if ( $player->state == 0 ) { # player has no song loaded $stop = 3; # continue to next track. } } if ( length "$artist: $album" > 20 ) { $art_n_alb = "- $artist: $album -="; $art_n_alb = "$artist: $album" if ( ! $scroll_art_percent ); } else { $art_n_alb = "$artist: $album"; } $pre_song_text= ""; $song_max= 20 - length ( $pre_song_text ); if ((length $song) >= $song_max) { $scroll_menu = 1; $song = "- $song -=" unless (! $scroll_song_percent ); } else { $scroll_menu = 0; } @art_n_alb_scroll = ( 0 , $art_n_alb, 0, 20, $scroll_art_mode, $scroll_art_lor, $scroll_art_percent, 0, 0 ); @song_scroll = ( $pre_song_text, $song, 0, $song_max, $scroll_song_mode, $scroll_song_lor, $scroll_song_percent, 0, 0); @mini_options = ( "Prev", "Play", "Next" ); $barval=0; $bar_max=75; play_display_full (\@art_n_alb_scroll, \@song_scroll, \@mini_options, $barval, $bar_max, $minutes, $seconds); while ( !$stop ) { $player->poll(0); # The following fixes a problem with the scroll updating faster than the # display can handle things... - Petey select( undef, undef, undef, .01) if ($display_type ne "console"); $stat = (($player->{frame}[2])/$player->tpf); #current frame if ( $player->state == 0) { $stop = 3; # song finished. continue to next track. # state is 0 when song complete # state is 1 when paused # state is 2 when playing } if ( !$stop ) { undef $key; $key = display_check_for_key ( 0 ); if ( $key ) { if ( $key eq $forward_key ) { play_key_forward(); } elsif ( $key eq $back_key ) { $sure_select = 1; play_key_back(); } elsif ( $key eq $up_key ) { play_key_up(); } elsif ( $key eq $down_key ) { play_key_down(); } } $stat = (($player->{frame}[2])/$player->tpf); if ( $time_mode eq "up" ) { $seconds = int ($player->{frame}[2]); #current second } else { $seconds = int ($player->{frame}[3]); # seconds remaining } $minutes = int ( $seconds / 60 ); $seconds = $seconds - ( $minutes * 60 ); $seconds = sprintf ( "%.2d", $seconds ); if ($total > 0) { $barval = int ( ( $stat / $total ) * 75 ) + 1; } if ($song_scroll[6] ne 0) { display_scroll_code( \@song_scroll ); } if ($art_n_alb_scroll[6] ne 0) { display_scroll_code( \@art_n_alb_scroll ); } if ( $display eq "progress" ) { if ( ( $seconds != $last_seconds ) || ( $barval != $last_barval) || ( ! $art_n_alb_scroll[8] ) || ( ! $song_scroll[8]) ) { if ( !$progress_up ) { play_display_full( \@art_n_alb_scroll, \@song_scroll, \@mini_options, $barval, $bar_max, $minutes, $seconds ); $progress_up = 1; $last_seconds = $seconds; $last_barval = $barval; } if ( ! $song_scroll[8] ) { if ( length ($song_scroll[1]) > $song_max ) { display_scroll_counter( \@song_scroll ); display_position ( 1, 2 ); display_write ( display_scroll ( @song_scroll ) ); $song_scroll[8] = 1; } } if ( ! $art_n_alb_scroll[8]) { if ( length ($art_n_alb_scroll[1]) > 20 ) { display_scroll_counter( \@art_n_alb_scroll ); display_position ( 1, 1 ); display_write ( display_scroll ( @art_n_alb_scroll ) ); $art_n_alb_scroll[8] = 1; } } display_bargraph ( 1, 3, $barval, $bar_max ); display_position( 16, 3 ); if ($minutes < 10) { display_write(" "); display_position ( 17, 3 ); } display_write ( "$minutes:$seconds" ); $last_seconds = $seconds; $last_barval = $barval; } } elsif ( $display eq "songlist" ) { $pl_sg_scroll[7]++; display_scroll_code ( \@pl_sg_scroll ); if ( ( $song_number_selected != $old_song_number_selected ) || ( !$menu_up ) ) { menu_title ( "Song Select" ); display_time ( ); @pl_sg_scroll = menu_scroll ( $$song_names[$song_number_selected], 19 ); $menu_pos = menu_render ( @$song_names, \@pl_sg_scroll, 1, $song_number_selected ); $old_song_number_selected = $song_number_selected; $sure_select = 1; $menu_up = 1; } elsif ( !$pl_sg_scroll[8] ) { if ( length ( $pl_sg_scroll[1] ) > 19 ) { display_scroll_counter ( \@pl_sg_scroll ); display_position ( 2, $menu_pos ); display_write ( display_scroll ( @pl_sg_scroll ) ); } } } } } if ( $pref ne $start_pref ) { database_update_preference ( $dbh, $songid, $usernameid, $pref ); } if ( $volume ne $start_volume ) { database_set_volume ( $dbh, $pathid, $volume ); } return ( $stop, $new_song_number ); } # # Paint a full display update # # sub play_display_full { my ( $art_n_alb_p, $song_p, $mini_p, $d_barval, $d_bar_max, $disp_minutes, $disp_seconds) = @_; display_clear(); display_position( 1, 1 ); display_write ( display_scroll( @$art_n_alb_p ) ); display_position( 1, 2 ); display_write ( display_scroll( @$song_p ) ); display_bargraph( 1, 3, $d_barval, $d_bar_max ); display_position( 16, 3 ); if ($disp_minutes < 10) { display_write(" "); display_position( 17, 3 ); } display_write ( "$disp_minutes:$disp_seconds" ); menu_mini( @$mini_p ); } # # Process a Forward Key request while in Play Mode... # # sub play_key_forward { if ( $display eq "progress" ) { if ( $play_menu_mode eq "play" ) { $stop = 3; # continue to next track. $player->stop; } elsif ( $play_menu_mode eq "seek" ) { #Note: making it go fwd a track here can be bad $player->poll(0); if (($player->{frame}[3]) > 1) { #if more then 1 second left $player->jump(($player->{frame}[2]+1)/$player->tpf); #skip ahead 1 sec #update bargraph since it isn't otherwise $total = (($player->{frame}[2] + $player->{frame}[3])/$player->tpf); $stat = (($player->{frame}[2] + 1)/$player->tpf); #current frame $barval = int ( ( $stat / $total ) * 75 ) + 1; display_bargraph( 1, 3, $barval, 75); } } elsif ( $play_menu_mode eq "pause" ) { $player->poll(0); if ($player->state == 1) { #player paused (unpausing) @mini_options = ( "Exit", "Ctrl", "Pause" ); menu_mini ( @mini_options ); } else { #player is playing (pausing) @mini_options = ( "Exit", "Ctrl", "Play" ); menu_mini ( @mini_options ); } $player->pause; } elsif ( $play_menu_mode eq "volume" ) { $volume+=5; if ( $volume > 100 ) { $volume = 100; } else { system "$setvol_cmd -w $volume"; @mini_options = ( "Down", "Vol:$volume%", "Up" ); menu_mini ( @mini_options ); } } elsif ( $play_menu_mode eq "pref" ) { $pref = $pref + 5; if ( $pref > 100 ) { $pref = 100; } else { @mini_options = ( "Down", "Pref:$pref", "Up" ); menu_mini ( @mini_options ); } } elsif ( $play_menu_mode eq "scroll" ) { # Formard key = faster => ++ $song_scroll[6]+=5; $song_scroll[6] = 100 if ($song_scroll[6] > 100); if ($song_scroll[6] > 0) { @mini_options = ( "Slow", "Spd:$song_scroll[6]%","Fast" ); menu_mini ( @mini_options ); } elsif ($song_scroll[6] < 0) { @mini_options = ( "Fast", "Spd:$song_scroll[6]%", "Slow" ); menu_mini ( @mini_options ); } else { @mini_options = ("Right","Direct","Left"); menu_mini ( @mini_options ); } } elsif ( $play_menu_mode eq "select" ) { $display = "songlist"; $menu_up = 0; $progress_up = 0; } } elsif ( $display eq "songlist" ) { $new_song_number = $song_number_selected + 1; $stop = 4; $player->stop; $menu_up = 0; } } # # Process a Back Key request while in Play Mode... # # sub play_key_back { if ( $display eq "progress" ) { if ( $play_menu_mode eq "play" ) { $stop = 2; $player->stop; } elsif ( $play_menu_mode eq "seek" ) { #Note: making it go back a track here can be bad $player->poll(0); if (($player->{frame}[2]) > 2 ) { #if more then 1 second played $player->jump(($player->{frame}[2] - 2)/$player->tpf); #rev 2 sec #update bargraph since it isn't otherwise $total = (($player->{frame}[2] + $player->{frame}[3])/$player->tpf); $stat = (($player->{frame}[2] - 1)/$player->tpf); #current frame $barval = int ( ( $stat / $total ) * 75 ) + 1; display_bargraph( 1, 3, $barval, 75); } } elsif ( $play_menu_mode eq "pause" ) { $stop = 1; $player->pause; } elsif ( $play_menu_mode eq "volume" ) { $volume -=5; if ( $volume < 0 ) { $volume = 0; } else { system "$setvol_cmd -w $volume"; @mini_options = ( "Down", "Vol:$volume%", "Up" ); menu_mini ( @mini_options ); } } elsif ( $play_menu_mode eq "pref" ) { $pref = $pref - 5; if ( $pref < 0 ) { $pref = 0; } else { @mini_options = ( "Down", "Pref:$pref", "Up" ); menu_mini ( @mini_options ); } } elsif ( $play_menu_mode eq "scroll" ) { # Back key = slower => -- $song_scroll[6]-=5; $song_scroll[6] = -100 if ($song_scroll[6] < -100); if ($song_scroll[6] > 0) { @mini_options = ( "Slow", "Spd:$song_scroll[6]%","Fast" ); menu_mini ( @mini_options ); } elsif ($song_scroll[6] < 0) { @mini_options = ( "Fast", "Spd:$song_scroll[6]%", "Slow" ); menu_mini ( @mini_options ); } else { @mini_options = ("Right","Direct","Left"); menu_mini ( @mini_options ); } } elsif ( $play_menu_mode eq "select" ) { $stop = 1; $player->pause; } } elsif ( $display eq "songlist" ) { $display = "progress"; $progress_up = 0; $menu_up = 0; } } # # Process a Up Key request while in Play Mode... # # sub play_key_up { if ( $display eq "progress" ) { if ( $play_menu_mode eq "scroll" ) { $play_menu_mode = "pref"; @mini_options = ( "Down", "Pref:$pref", "Up" ); menu_mini ( @mini_options ); } elsif ( $play_menu_mode eq "select" ) { if ($scroll_menu eq 1) { $play_menu_mode = "scroll"; if ($scroll_song_percent > 0) { @mini_options = ( "Slow", "Spd:$song_scroll[6]%","Fast" ); menu_mini ( @mini_options ); } elsif ($scroll_song_percent < 0) { @mini_options = ( "Fast", "Spd:$song_scroll[6]%","Slow" ); menu_mini ( @mini_options ); } else { @mini_options = ( "Right", "Direct", "Left" ); menu_mini ( @mini_options ); } } else { $play_menu_mode = "pref"; @mini_options = ( "Down", "Pref:$pref", "Up" ); menu_mini ( @mini_options ); } } elsif ( $play_menu_mode eq "play" ) { $play_menu_mode = "select"; @mini_options = ( "Exit", "Select", "Song" ); menu_mini ( @mini_options ); } elsif ( $play_menu_mode eq "pref" ) { $play_menu_mode = "volume"; @mini_options = ( "Down", "Vol:$volume%", "Up" ); menu_mini ( @mini_options ); } elsif ( $play_menu_mode eq "seek" ) { $play_menu_mode = "play"; @mini_options = ( "Prev", "Play", "Next" ); menu_mini ( @mini_options ); } elsif ( $play_menu_mode eq "pause" ) { $play_menu_mode = "seek"; @mini_options = ( "Rew", "Seek", "FFwd" ); menu_mini ( @mini_options ); } elsif ( $play_menu_mode eq "volume" ) { $play_menu_mode = "pause"; $player->poll(0); if ($player->state == 1) { @mini_options = ( "Exit", "Ctrl", "Play" ); menu_mini ( @mini_options ); } else { @mini_options = ( "Exit", "Ctrl", "Pause" ); menu_mini ( @mini_options ); } } } elsif ( $display eq "songlist" ) { $song_number_selected --; $song_number_selected = ( $total_songs - 1 ) if ( $song_number_selected lt 0 ); } } # # Process a Down Key request while in Play Mode... # # sub play_key_down { if ( $display eq "progress" ) { if ( $play_menu_mode eq "play" ) { $play_menu_mode = "seek"; @mini_options = ( "Rew", "Seek", "FFwd" ); menu_mini ( @mini_options ); } elsif ( $play_menu_mode eq "seek" ) { $play_menu_mode = "pause"; $player->poll(0); if ($player->state == 1) { @mini_options = ( "Exit", "Ctrl", "Play" ); menu_mini ( @mini_options ); } else { @mini_options = ( "Exit", "Ctrl", "Pause" ); menu_mini ( @mini_options ); } } elsif ( $play_menu_mode eq "pause" ) { $play_menu_mode = "volume"; @mini_options = ( "Down", "Vol:$volume%", "Up" ); menu_mini ( @mini_options ); } elsif ( $play_menu_mode eq "volume" ) { $play_menu_mode = "pref"; @mini_options = ( "Down", "Pref:$pref", "Up" ); menu_mini ( @mini_options ); } elsif ( $play_menu_mode eq "pref" ) { if ($scroll_menu eq 1) { $play_menu_mode = "scroll"; if ($scroll_song_percent > 0) { @mini_options = ( "Slow", "Spd:$song_scroll[6]%","Fast" ); menu_mini ( @mini_options ); } elsif ($scroll_song_percent < 0) { @mini_options = ( "Fast", "Spd:$song_scroll[6]%","Slow" ); menu_mini ( @mini_options ); } else { @mini_options = ( "Right", "Direct", "Left" ); menu_mini ( @mini_options ); } } else { $play_menu_mode = "select"; @mini_options = ( "Exit", "Select", "Song" ); menu_mini ( @mini_options ); } } elsif ( $play_menu_mode eq "scroll" ) { $play_menu_mode = "select"; @mini_options = ( "Exit", "Select", "Song" ); menu_mini ( @mini_options ); } elsif ( $play_menu_mode eq "select" ) { $play_menu_mode = "play"; @mini_options = ( "Prev", "Play", "Next" ); menu_mini ( @mini_options ); } } elsif ( $display eq "songlist" ) { $song_number_selected ++; $song_number_selected = 0 if ( $song_number_selected > ( $total_songs - 1 ) ); } }