summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/wps.c934
1 files changed, 446 insertions, 488 deletions
diff --git a/apps/wps.c b/apps/wps.c
index d9aed39588..6f4ccf782e 100644
--- a/apps/wps.c
+++ b/apps/wps.c
@@ -68,10 +68,11 @@
68#endif 68#endif
69 69
70bool keys_locked = false; 70bool keys_locked = false;
71bool device_muted = false;
72static bool ff_rewind = false; 71static bool ff_rewind = false;
73static bool paused = false; 72static bool paused = false;
74int ff_rewind_count = 0; 73static int ff_rewind_count = 0;
74static struct mp3entry* id3 = NULL;
75static int old_release_mask;
75 76
76#ifdef CUSTOM_WPS 77#ifdef CUSTOM_WPS
77static char custom_wps[5][64]; 78static char custom_wps[5][64];
@@ -80,7 +81,7 @@ static int scroll_line;
80static int scroll_line_custom; 81static int scroll_line_custom;
81#endif 82#endif
82 83
83static void draw_screen(struct mp3entry* id3) 84static void draw_screen(void)
84{ 85{
85 int font_height; 86 int font_height;
86 87
@@ -327,9 +328,6 @@ bool refresh_wps(bool refresh_scroll)
327#endif 328#endif
328#endif 329#endif
329 330
330 struct mp3entry* id3 = NULL;
331 id3 = mpeg_current_track();
332
333 if(!id3) 331 if(!id3)
334 { 332 {
335 lcd_stop_scroll(); 333 lcd_stop_scroll();
@@ -437,14 +435,12 @@ bool display_custom_wps(int x_val, int y_val, bool do_scroll, char *wps_string)
437 char cchr3; 435 char cchr3;
438 unsigned int seek; 436 unsigned int seek;
439 437
440 struct mp3entry* id3 = NULL;
441 char* szLast; 438 char* szLast;
442 439
443 id3 = mpeg_current_track();
444 szLast = strrchr(id3->path, '/'); 440 szLast = strrchr(id3->path, '/');
445 if(szLast) 441 if(szLast)
446 /* point to the first letter in the file name */ 442 /* point to the first letter in the file name */
447 szLast++; 443 szLast++;
448 444
449 buffer[0] = 0; 445 buffer[0] = 0;
450 446
@@ -468,11 +464,11 @@ bool display_custom_wps(int x_val, int y_val, bool do_scroll, char *wps_string)
468 { 464 {
469 case 't': /* ID3 Title */ 465 case 't': /* ID3 Title */
470 snprintf(tmpbuf, sizeof(tmpbuf), "%s", 466 snprintf(tmpbuf, sizeof(tmpbuf), "%s",
471 id3->title?id3->title:"<no title>"); 467 id3->title?id3->title:"<no title>");
472 break; 468 break;
473 case 'a': /* ID3 Artist */ 469 case 'a': /* ID3 Artist */
474 snprintf(tmpbuf, sizeof(tmpbuf), "%s", 470 snprintf(tmpbuf, sizeof(tmpbuf), "%s",
475 id3->artist?id3->artist:"<no artist>"); 471 id3->artist?id3->artist:"<no artist>");
476 break; 472 break;
477 case 'n': /* ID3 Track Number */ 473 case 'n': /* ID3 Track Number */
478 snprintf(tmpbuf, sizeof(tmpbuf), "%d", id3->tracknum); 474 snprintf(tmpbuf, sizeof(tmpbuf), "%d", id3->tracknum);
@@ -490,11 +486,11 @@ bool display_custom_wps(int x_val, int y_val, bool do_scroll, char *wps_string)
490 case 'c': /* Conditional Filename \ ID3 Artist-Title */ 486 case 'c': /* Conditional Filename \ ID3 Artist-Title */
491 if(id3->artist && id3->title) 487 if(id3->artist && id3->title)
492 snprintf(tmpbuf, sizeof(tmpbuf), "%s - %s", 488 snprintf(tmpbuf, sizeof(tmpbuf), "%s - %s",
493 id3->artist?id3->artist:"<no artist>", 489 id3->artist?id3->artist:"<no artist>",
494 id3->title?id3->title:"<no title>"); 490 id3->title?id3->title:"<no title>");
495 else 491 else
496 snprintf(tmpbuf, sizeof(tmpbuf), "%s", 492 snprintf(tmpbuf, sizeof(tmpbuf), "%s",
497 szLast?szLast:id3->path); 493 szLast?szLast:id3->path);
498 break; 494 break;
499 case 'd': /* Conditional Filename \ ID3 Title-Artist */ 495 case 'd': /* Conditional Filename \ ID3 Title-Artist */
500 if(id3->artist && id3->title) 496 if(id3->artist && id3->title)
@@ -503,7 +499,7 @@ bool display_custom_wps(int x_val, int y_val, bool do_scroll, char *wps_string)
503 id3->artist?id3->artist:"<no artist>"); 499 id3->artist?id3->artist:"<no artist>");
504 else 500 else
505 snprintf(tmpbuf, sizeof(tmpbuf), "%s", 501 snprintf(tmpbuf, sizeof(tmpbuf), "%s",
506 szLast?szLast:id3->path); 502 szLast?szLast:id3->path);
507 break; 503 break;
508 case 'b': /* File Bitrate */ 504 case 'b': /* File Bitrate */
509 snprintf(tmpbuf, sizeof(tmpbuf), "%d", id3->bitrate); 505 snprintf(tmpbuf, sizeof(tmpbuf), "%d", id3->bitrate);
@@ -516,11 +512,11 @@ bool display_custom_wps(int x_val, int y_val, bool do_scroll, char *wps_string)
516 break; 512 break;
517 case 'n': /* File Name */ 513 case 'n': /* File Name */
518 snprintf(tmpbuf, sizeof(tmpbuf), "%s", 514 snprintf(tmpbuf, sizeof(tmpbuf), "%s",
519 szLast?szLast:id3->path); 515 szLast?szLast:id3->path);
520 break; 516 break;
521 case 's': /* File Size (In Kilobytes) */ 517 case 's': /* File Size (In Kilobytes) */
522 snprintf(tmpbuf, sizeof(tmpbuf), "%d", 518 snprintf(tmpbuf, sizeof(tmpbuf), "%d",
523 id3->filesize / 1024); 519 id3->filesize / 1024);
524 break; 520 break;
525 } 521 }
526 break; 522 break;
@@ -537,13 +533,13 @@ bool display_custom_wps(int x_val, int y_val, bool do_scroll, char *wps_string)
537 break; 533 break;
538 case 'c': /* Current Time in Song */ 534 case 'c': /* Current Time in Song */
539 snprintf(tmpbuf, sizeof(tmpbuf), "%d:%02d", 535 snprintf(tmpbuf, sizeof(tmpbuf), "%d:%02d",
540 (id3->elapsed + ff_rewind_count) / 60000, 536 (id3->elapsed + ff_rewind_count) / 60000,
541 (id3->elapsed + ff_rewind_count) % 60000 / 1000); 537 (id3->elapsed + ff_rewind_count) % 60000 / 1000);
542 break; 538 break;
543 case 't': /* Total Time */ 539 case 't': /* Total Time */
544 snprintf(tmpbuf, sizeof(tmpbuf), "%d:%02d", 540 snprintf(tmpbuf, sizeof(tmpbuf), "%d:%02d",
545 id3->length / 60000, 541 id3->length / 60000,
546 id3->length % 60000 / 1000); 542 id3->length % 60000 / 1000);
547 break; 543 break;
548 } 544 }
549 break; 545 break;
@@ -623,7 +619,6 @@ int player_id3_show(void)
623 int menu_max = 6; 619 int menu_max = 6;
624 bool menu_changed = true; 620 bool menu_changed = true;
625 char scroll_text[MAX_PATH]; 621 char scroll_text[MAX_PATH];
626 struct mp3entry* id3 = NULL;
627 622
628 lcd_stop_scroll(); 623 lcd_stop_scroll();
629 lcd_clear_display(); 624 lcd_clear_display();
@@ -633,7 +628,6 @@ int player_id3_show(void)
633 628
634 while(1) 629 while(1)
635 { 630 {
636 id3 = mpeg_current_track();
637 button = button_get(false); 631 button = button_get(false);
638 632
639 switch(button) 633 switch(button)
@@ -727,7 +721,6 @@ int player_id3_show(void)
727 lcd_puts_scroll(0, 1, scroll_text); 721 lcd_puts_scroll(0, 1, scroll_text);
728 } 722 }
729 723
730 status_draw();
731 lcd_update(); 724 lcd_update();
732 yield(); 725 yield();
733 } 726 }
@@ -736,9 +729,10 @@ int player_id3_show(void)
736} 729}
737 730
738#ifndef CUSTOM_WPS 731#ifndef CUSTOM_WPS
739static void display_file_time(unsigned int elapsed, unsigned int length) 732static void display_file_time(void)
740{ 733{
741 char buffer[32]; 734 char buffer[32];
735 int elapsed = id3->elapsed + ff_rewind_count;
742 736
743#ifdef HAVE_LCD_BITMAP 737#ifdef HAVE_LCD_BITMAP
744 int line; 738 int line;
@@ -750,11 +744,12 @@ static void display_file_time(unsigned int elapsed, unsigned int length)
750 "Time:%3d:%02d/%d:%02d", 744 "Time:%3d:%02d/%d:%02d",
751 elapsed / 60000, 745 elapsed / 60000,
752 elapsed % 60000 / 1000, 746 elapsed % 60000 / 1000,
753 length / 60000, 747 id3->length / 60000,
754 length % 60000 / 1000 ); 748 id3->length % 60000 / 1000 );
755 749
756 lcd_puts(0, line, buffer); 750 lcd_puts(0, line, buffer);
757 slidebar(0, LCD_HEIGHT-6, LCD_WIDTH, 6, elapsed*100/length, Grow_Right); 751 slidebar(0, LCD_HEIGHT-6, LCD_WIDTH, 6,
752 elapsed*100/id3->length, Grow_Right);
758 lcd_update(); 753 lcd_update();
759#else 754#else
760 /* Display time with the filename scroll only because 755 /* Display time with the filename scroll only because
@@ -767,8 +762,8 @@ static void display_file_time(unsigned int elapsed, unsigned int length)
767 snprintf(buffer,sizeof(buffer), "%d:%02d/%d:%02d ", 762 snprintf(buffer,sizeof(buffer), "%d:%02d/%d:%02d ",
768 elapsed / 60000, 763 elapsed / 60000,
769 elapsed % 60000 / 1000, 764 elapsed % 60000 / 1000,
770 length / 60000, 765 id3->length / 60000,
771 length % 60000 / 1000 ); 766 id3->length % 60000 / 1000 );
772 767
773 lcd_puts(0, 1, buffer); 768 lcd_puts(0, 1, buffer);
774 lcd_update(); 769 lcd_update();
@@ -813,7 +808,6 @@ void display_keylock_text(bool locked)
813 { 808 {
814 lcd_puts(2, 3, "Key lock is OFF"); 809 lcd_puts(2, 3, "Key lock is OFF");
815 } 810 }
816 status_draw();
817 lcd_update(); 811 lcd_update();
818#endif 812#endif
819 813
@@ -839,370 +833,328 @@ void display_mute_text(bool muted)
839 { 833 {
840 lcd_puts(2, 3, "Mute is OFF"); 834 lcd_puts(2, 3, "Mute is OFF");
841 } 835 }
842 status_draw();
843 lcd_update(); 836 lcd_update();
844#endif 837#endif
845 838
846 sleep(HZ); 839 sleep(HZ);
847} 840}
848 841
849/* demonstrates showing different formats from playtune */ 842static void handle_usb(void)
850int wps_show(void)
851{ 843{
852 struct mp3entry* id3 = NULL; 844#ifndef SIMULATOR
845#ifdef HAVE_LCD_BITMAP
846 bool laststate=statusbar(false);
847#endif
848 /* Tell the USB thread that we are safe */
849 DEBUGF("wps got SYS_USB_CONNECTED\n");
850 usb_acknowledge(SYS_USB_CONNECTED_ACK);
851
852 /* Wait until the USB cable is extracted again */
853 usb_wait_for_disconnect(&button_queue);
853 854
854#ifdef HAVE_PLAYER_KEYPAD 855#ifdef HAVE_LCD_BITMAP
855 int retval; 856 statusbar(laststate);
856#endif 857#endif
857 bool dont_go_to_menu = false; 858#endif
858 bool menu_button_is_down = false; 859}
859 bool pending_keylock = true; /* Keylock will go ON next time */ 860
860 bool pending_mute = true; /* Mute will go ON next time */ 861static bool ffwd_rew(int button)
861 int old_release_mask; 862{
862 int button;
863 unsigned int ff_rewind_step = 0; /* current rewind step size */ 863 unsigned int ff_rewind_step = 0; /* current rewind step size */
864 unsigned int ff_rewind_max_step = 0; /* max rewind step size */ 864 unsigned int ff_rewind_max_step = 0; /* max rewind step size */
865 long ff_rewind_accel_tick = 0; /* next time to bump ff/rewind step size */ 865 long ff_rewind_accel_tick = 0; /* next time to bump ff/rewind step size */
866 bool ignore_keyup = true; 866 bool exit = false;
867 bool restore = false; 867 bool usb = false;
868 868
869 old_release_mask = button_set_release(RELEASE_MASK); 869 while (!exit) {
870 870 switch ( button ) {
871#ifdef HAVE_LCD_CHARCELLS 871 case BUTTON_LEFT | BUTTON_REPEAT:
872 lcd_icon(ICON_AUDIO, true); 872 if (ff_rewind)
873 lcd_icon(ICON_PARAM, false); 873 {
874#else 874 ff_rewind_count -= ff_rewind_step;
875 if(global_settings.statusbar) 875 if (global_settings.ff_rewind_accel != 0 &&
876 lcd_setmargins(0, STATUSBAR_HEIGHT); 876 current_tick >= ff_rewind_accel_tick)
877 else 877 {
878 lcd_setmargins(0, 0); 878 ff_rewind_step *= 2;
879#endif 879 if (ff_rewind_step > ff_rewind_max_step)
880 ff_rewind_step = ff_rewind_max_step;
881 ff_rewind_accel_tick = current_tick +
882 global_settings.ff_rewind_accel*HZ;
883 }
884 }
885 else
886 {
887 if ( mpeg_is_playing() && id3 && id3->length )
888 {
889 if (!paused)
890 mpeg_pause();
891#ifdef HAVE_PLAYER_KEYPAD
892 lcd_stop_scroll();
893#endif
894 status_set_playmode(STATUS_FASTBACKWARD);
895 ff_rewind = true;
896 ff_rewind_max_step =
897 id3->length * FF_REWIND_MAX_PERCENT / 100;
898 ff_rewind_step = FF_REWIND_MIN_STEP;
899 if (ff_rewind_step > ff_rewind_max_step)
900 ff_rewind_step = ff_rewind_max_step;
901 ff_rewind_count = -ff_rewind_step;
902 ff_rewind_accel_tick = current_tick +
903 global_settings.ff_rewind_accel*HZ;
904 }
905 else
906 break;
907 }
880 908
881 ff_rewind = false; 909 if ((int)(id3->elapsed + ff_rewind_count) < 0)
910 ff_rewind_count = -id3->elapsed;
882 911
883#ifdef CUSTOM_WPS 912#ifdef CUSTOM_WPS
884 load_custom_wps(); /* Load the Custom WPS file, if there is one */ 913 refresh_wps(false);
914#else
915 display_file_time();
885#endif 916#endif
917 break;
886 918
887 if(mpeg_is_playing()) 919 case BUTTON_RIGHT | BUTTON_REPEAT:
888 { 920 if (ff_rewind)
889 id3 = mpeg_current_track();
890 draw_screen(id3);
891 restore = true;
892 }
893
894 while ( 1 )
895 {
896 button = button_get_w_tmo(HZ/5);
897
898 /* discard first event if it's a button release */
899 if (button && ignore_keyup)
900 {
901 ignore_keyup = false;
902 if (button & BUTTON_REL && button != SYS_USB_CONNECTED)
903 continue;
904 }
905
906 if(mpeg_has_changed_track())
907 {
908 lcd_stop_scroll();
909 id3 = mpeg_current_track();
910 draw_screen(id3);
911 }
912
913 switch(button)
914 {
915 case BUTTON_ON:
916 if (keys_locked)
917 { 921 {
918 display_keylock_text(keys_locked); 922 ff_rewind_count += ff_rewind_step;
919 restore = true; 923 if (global_settings.ff_rewind_accel != 0 &&
920 break; 924 current_tick >= ff_rewind_accel_tick)
925 {
926 ff_rewind_step *= 2;
927 if (ff_rewind_step > ff_rewind_max_step)
928 ff_rewind_step = ff_rewind_max_step;
929 ff_rewind_accel_tick = current_tick +
930 global_settings.ff_rewind_accel*HZ;
931 }
921 } 932 }
922 933 else
923#ifdef HAVE_LCD_CHARCELLS
924 lcd_icon(ICON_RECORD, false);
925 lcd_icon(ICON_AUDIO, false);
926#endif
927 button_set_release(old_release_mask);
928 return 0;
929
930 case BUTTON_PLAY:
931 if (keys_locked)
932 { 934 {
933 display_keylock_text(keys_locked); 935 if ( mpeg_is_playing() && id3 && id3->length )
934 restore = true; 936 {
935 break; 937 if (!paused)
938 mpeg_pause();
939#ifdef HAVE_PLAYER_KEYPAD
940 lcd_stop_scroll();
941#endif
942 status_set_playmode(STATUS_FASTFORWARD);
943 ff_rewind = true;
944 ff_rewind_max_step =
945 id3->length * FF_REWIND_MAX_PERCENT / 100;
946 ff_rewind_step = FF_REWIND_MIN_STEP;
947 if (ff_rewind_step > ff_rewind_max_step)
948 ff_rewind_step = ff_rewind_max_step;
949 ff_rewind_count = ff_rewind_step;
950 ff_rewind_accel_tick = current_tick +
951 global_settings.ff_rewind_accel*HZ;
952 }
953 else
954 break;
936 } 955 }
937 956
938 if ( !paused ) 957 if ((id3->elapsed + ff_rewind_count) > id3->length)
939 { 958 ff_rewind_count = id3->length - id3->elapsed;
940 mpeg_pause(); 959
941 paused = true; 960#ifdef CUSTOM_WPS
942 status_set_playmode(STATUS_PAUSE); 961 refresh_wps(false);
943 status_draw(); 962#else
944 if (global_settings.resume) { 963 display_file_time();
945 settings_save();
946#ifndef HAVE_RTC
947 ata_flush();
948#endif 964#endif
949 } 965 break;
950 } 966
951 else 967 case BUTTON_LEFT | BUTTON_REL:
952 { 968 /* rewind */
969 mpeg_ff_rewind(ff_rewind_count);
970 ff_rewind_count = 0;
971 ff_rewind = false;
972 if (paused)
973 status_set_playmode(STATUS_PAUSE);
974 else {
953 mpeg_resume(); 975 mpeg_resume();
954 paused = false;
955 status_set_playmode(STATUS_PLAY); 976 status_set_playmode(STATUS_PLAY);
956 status_draw();
957 } 977 }
958 break; 978#ifdef HAVE_LCD_CHARCELLS
959 979 draw_screen();
960#ifdef HAVE_RECORDER_KEYPAD
961 case BUTTON_UP:
962 case BUTTON_UP | BUTTON_REPEAT:
963#endif 980#endif
964 case BUTTON_VOL_UP: 981 exit = true;
965 if (keys_locked)
966 {
967 display_keylock_text(keys_locked);
968 restore = true;
969 break;
970 }
971
972 global_settings.volume++;
973 if(global_settings.volume > mpeg_sound_max(SOUND_VOLUME))
974 global_settings.volume = mpeg_sound_max(SOUND_VOLUME);
975 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
976 status_draw();
977 settings_save();
978 break; 982 break;
979 983
980#ifdef HAVE_RECORDER_KEYPAD 984 case BUTTON_RIGHT | BUTTON_REL:
981 case BUTTON_DOWN: 985 /* fast forward */
982 case BUTTON_DOWN | BUTTON_REPEAT: 986 mpeg_ff_rewind(ff_rewind_count);
983#endif 987 ff_rewind_count = 0;
984 case BUTTON_VOL_DOWN: 988 ff_rewind = false;
985 if (keys_locked) 989 if (paused)
986 { 990 status_set_playmode(STATUS_PAUSE);
987 display_keylock_text(keys_locked); 991 else {
988 restore = true; 992 mpeg_resume();
989 break; 993 status_set_playmode(STATUS_PLAY);
990 } 994 }
995#ifdef HAVE_LCD_CHARCELLS
996 draw_screen();
997#endif
998 exit = true;
999 break;
991 1000
992 global_settings.volume--; 1001 case SYS_USB_CONNECTED:
993 if(global_settings.volume < mpeg_sound_min(SOUND_VOLUME)) 1002 handle_usb();
994 global_settings.volume = mpeg_sound_min(SOUND_VOLUME); 1003 usb = true;
995 mpeg_sound_set(SOUND_VOLUME, global_settings.volume); 1004 exit = true;
996 status_draw();
997 settings_save();
998 break; 1005 break;
1006 }
1007 if (!exit)
1008 button = button_get(true);
1009 }
999 1010
1000 case BUTTON_LEFT | BUTTON_REPEAT: 1011 return usb;
1001 if (!keys_locked) 1012}
1002 {
1003 if (ff_rewind)
1004 {
1005 ff_rewind_count -= ff_rewind_step;
1006 if (global_settings.ff_rewind_accel != 0 &&
1007 current_tick >= ff_rewind_accel_tick)
1008 {
1009 ff_rewind_step *= 2;
1010 if (ff_rewind_step > ff_rewind_max_step)
1011 ff_rewind_step = ff_rewind_max_step;
1012 ff_rewind_accel_tick = current_tick +
1013 global_settings.ff_rewind_accel*HZ;
1014 }
1015 }
1016 else
1017 {
1018 if ( mpeg_is_playing() && id3 && id3->length )
1019 {
1020 if (!paused)
1021 mpeg_pause();
1022#ifdef HAVE_PLAYER_KEYPAD
1023 lcd_stop_scroll();
1024#endif
1025 status_set_playmode(STATUS_FASTBACKWARD);
1026 status_draw();
1027 ff_rewind = true;
1028 ff_rewind_max_step =
1029 id3->length * FF_REWIND_MAX_PERCENT / 100;
1030 ff_rewind_step = FF_REWIND_MIN_STEP;
1031 if (ff_rewind_step > ff_rewind_max_step)
1032 ff_rewind_step = ff_rewind_max_step;
1033 ff_rewind_count = -ff_rewind_step;
1034 ff_rewind_accel_tick = current_tick +
1035 global_settings.ff_rewind_accel*HZ;
1036 }
1037 else
1038 break;
1039 }
1040 1013
1041 if ((int)(id3->elapsed + ff_rewind_count) < 0) 1014static void update(void)
1042 ff_rewind_count = -id3->elapsed; 1015{
1016 if (mpeg_has_changed_track())
1017 {
1018 lcd_stop_scroll();
1019 id3 = mpeg_current_track();
1020 draw_screen();
1021 }
1043 1022
1023 if (id3) {
1044#ifdef CUSTOM_WPS 1024#ifdef CUSTOM_WPS
1045 refresh_wps(false); 1025 refresh_wps(false);
1046#else 1026#else
1047 display_file_time(id3->elapsed + ff_rewind_count, 1027 display_file_time();
1048 id3->length);
1049#endif 1028#endif
1050 } 1029 }
1051 break;
1052 1030
1053 case BUTTON_RIGHT | BUTTON_REPEAT: 1031 status_draw();
1054 if (!keys_locked)
1055 {
1056 if (ff_rewind)
1057 {
1058 ff_rewind_count += ff_rewind_step;
1059 if (global_settings.ff_rewind_accel != 0 &&
1060 current_tick >= ff_rewind_accel_tick)
1061 {
1062 ff_rewind_step *= 2;
1063 if (ff_rewind_step > ff_rewind_max_step)
1064 ff_rewind_step = ff_rewind_max_step;
1065 ff_rewind_accel_tick = current_tick +
1066 global_settings.ff_rewind_accel*HZ;
1067 }
1068 }
1069 else
1070 {
1071 if ( mpeg_is_playing() && id3 && id3->length )
1072 {
1073 if (!paused)
1074 mpeg_pause();
1075#ifdef HAVE_PLAYER_KEYPAD
1076 lcd_stop_scroll();
1077#endif
1078 status_set_playmode(STATUS_FASTFORWARD);
1079 status_draw();
1080 ff_rewind = true;
1081 ff_rewind_max_step =
1082 id3->length * FF_REWIND_MAX_PERCENT / 100;
1083 ff_rewind_step = FF_REWIND_MIN_STEP;
1084 if (ff_rewind_step > ff_rewind_max_step)
1085 ff_rewind_step = ff_rewind_max_step;
1086 ff_rewind_count = ff_rewind_step;
1087 ff_rewind_accel_tick = current_tick +
1088 global_settings.ff_rewind_accel*HZ;
1089 }
1090 else
1091 break;
1092 }
1093 1032
1094 if ((id3->elapsed + ff_rewind_count) > id3->length) 1033 /* save resume data */
1095 ff_rewind_count = id3->length - id3->elapsed; 1034 if ( id3 &&
1035 global_settings.resume &&
1036 global_settings.resume_offset != id3->offset ) {
1037 DEBUGF("R%X,%X (%X)\n", global_settings.resume_offset,
1038 id3->offset,id3);
1039 global_settings.resume_index = id3->index;
1040 global_settings.resume_offset = id3->offset;
1041 settings_save();
1042 }
1043}
1096 1044
1097#ifdef CUSTOM_WPS
1098 refresh_wps(false);
1099#else
1100 display_file_time(id3->elapsed + ff_rewind_count,
1101 id3->length);
1102#endif
1103 }
1104 break;
1105 1045
1106 case BUTTON_LEFT | BUTTON_REL: 1046static bool keylock(void)
1107 if (menu_button_is_down && keys_locked) 1047{
1108 { 1048 bool exit = false;
1109 sleep(HZ/6); 1049
1110 draw_screen(id3);
1111 }
1112 if (!keys_locked)
1113 {
1114 if (ff_rewind)
1115 {
1116 /* rewind */
1117 mpeg_ff_rewind(ff_rewind_count);
1118 ff_rewind_count = 0;
1119 ff_rewind = false;
1120 if (paused)
1121 status_set_playmode(STATUS_PAUSE);
1122 else {
1123 mpeg_resume();
1124 status_set_playmode(STATUS_PLAY);
1125 }
1126#ifdef HAVE_LCD_CHARCELLS 1050#ifdef HAVE_LCD_CHARCELLS
1127 draw_screen(id3); 1051 lcd_icon(ICON_RECORD, true);
1128#endif 1052#endif
1129 } 1053 display_keylock_text(true);
1130#ifdef HAVE_PLAYER_KEYPAD 1054 keys_locked = true;
1131 else if(!menu_button_is_down) 1055 draw_screen();
1056 status_draw();
1057 while (button_get(false)); /* clear button queue */
1058
1059 while (!exit) {
1060 switch ( button_get_w_tmo(HZ/5) ) {
1061#ifdef HAVE_RECORDER_KEYPAD
1062 case BUTTON_F1 | BUTTON_DOWN:
1132#else 1063#else
1133 else 1064 case BUTTON_MENU | BUTTON_STOP:
1134#endif 1065#endif
1135 { 1066#ifdef HAVE_LCD_CHARCELLS
1136 if (!id3 || (id3->elapsed < 3*1000)) 1067 lcd_icon(ICON_RECORD, false);
1137 mpeg_prev(); 1068#endif
1138 else { 1069 display_keylock_text(false);
1139 if (!paused) 1070 keys_locked = false;
1140 mpeg_pause(); 1071 exit = true;
1072 while (button_get(false)); /* clear button queue */
1073 break;
1141 1074
1142 mpeg_ff_rewind(-(id3->elapsed)); 1075 case SYS_USB_CONNECTED:
1076 handle_usb();
1077 return true;
1143 1078
1144 if (!paused) 1079 case BUTTON_NONE:
1145 mpeg_resume(); 1080 update();
1146 } 1081 break;
1147 } 1082
1148 } 1083#ifdef HAVE_RECORDER_KEYPAD
1149#ifdef HAVE_PLAYER_KEYPAD 1084 case BUTTON_F1:
1150 else if(!menu_button_is_down)
1151#else 1085#else
1152 else 1086 case BUTTON_MENU:
1153#endif 1087#endif
1154 { 1088 /* ignore menu key, to avoid displaying "Keylock ON"
1155 display_keylock_text(keys_locked); 1089 every time we unlock the keys */
1156 restore = true;
1157 }
1158 break; 1090 break;
1159 1091
1160 case BUTTON_RIGHT | BUTTON_REL: 1092 default:
1161 if (menu_button_is_down && keys_locked) 1093 display_keylock_text(true);
1162 { 1094 while (button_get(false)); /* clear button queue */
1163 sleep(HZ/6); 1095 draw_screen();
1164 draw_screen(id3); 1096 break;
1165 } 1097 }
1166 if (!keys_locked) 1098 }
1167 { 1099 return false;
1168 if (ff_rewind) 1100}
1169 { 1101
1170 /* fast forward */ 1102static bool menu(void)
1171 mpeg_ff_rewind(ff_rewind_count); 1103{
1172 ff_rewind_count = 0; 1104 static bool muted = false;
1173 ff_rewind = false; 1105 bool exit = false;
1174 if (paused) 1106 int last_button = 0;
1175 status_set_playmode(STATUS_PAUSE); 1107
1176 else {
1177 mpeg_resume();
1178 status_set_playmode(STATUS_PLAY);
1179 }
1180#ifdef HAVE_LCD_CHARCELLS 1108#ifdef HAVE_LCD_CHARCELLS
1181 draw_screen(id3); 1109 lcd_icon(ICON_PARAM, true);
1182#endif 1110#endif
1183 } 1111
1184#ifdef HAVE_PLAYER_KEYPAD 1112 while (!exit) {
1185 else if(!menu_button_is_down) 1113 int button = button_get(true);
1114
1115 switch ( button ) {
1116 /* go into menu */
1117#ifdef HAVE_RECORDER_KEYPAD
1118 case BUTTON_F1 | BUTTON_REL:
1186#else 1119#else
1187 else 1120 case BUTTON_MENU | BUTTON_REL:
1188#endif 1121#endif
1189 { 1122 exit = true;
1190 mpeg_next(); 1123 if ( !last_button ) {
1191 } 1124 lcd_stop_scroll();
1125 button_set_release(old_release_mask);
1126 main_menu();
1127 old_release_mask = button_set_release(RELEASE_MASK);
1192 } 1128 }
1129 break;
1130
1131 /* mute */
1193#ifdef HAVE_PLAYER_KEYPAD 1132#ifdef HAVE_PLAYER_KEYPAD
1194 else if(!menu_button_is_down) 1133 case BUTTON_PLAY:
1195#else 1134#else
1135 case BUTTON_UP:
1136#endif
1137 if ( muted )
1138 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
1196 else 1139 else
1140 mpeg_sound_set(SOUND_VOLUME, 0);
1141 muted = !muted;
1142 display_mute_text(muted);
1143 break;
1144
1145 /* key lock */
1146#ifdef HAVE_RECORDER_KEYPAD
1147 case BUTTON_F1 | BUTTON_DOWN:
1148#else
1149 case BUTTON_MENU | BUTTON_STOP:
1197#endif 1150#endif
1198 { 1151 if (keylock())
1199 display_keylock_text(keys_locked); 1152 return true;
1200 restore = true; 1153 exit = true;
1201 break;
1202 }
1203 break; 1154 break;
1204 1155
1205#ifdef HAVE_PLAYER_KEYPAD 1156#ifdef HAVE_PLAYER_KEYPAD
1157 /* change volume */
1206 case BUTTON_MENU | BUTTON_LEFT: 1158 case BUTTON_MENU | BUTTON_LEFT:
1207 case BUTTON_MENU | BUTTON_LEFT | BUTTON_REPEAT: 1159 case BUTTON_MENU | BUTTON_LEFT | BUTTON_REPEAT:
1208 dont_go_to_menu = true; 1160 dont_go_to_menu = true;
@@ -1211,11 +1163,12 @@ int wps_show(void)
1211 global_settings.volume = mpeg_sound_min(SOUND_VOLUME); 1163 global_settings.volume = mpeg_sound_min(SOUND_VOLUME);
1212 mpeg_sound_set(SOUND_VOLUME, global_settings.volume); 1164 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
1213 display_volume_level(global_settings.volume); 1165 display_volume_level(global_settings.volume);
1214 draw_screen(id3); 1166 draw_screen();
1215 status_draw(); 1167 status_draw();
1216 settings_save(); 1168 settings_save();
1217 break; 1169 break;
1218 1170
1171 /* change volume */
1219 case BUTTON_MENU | BUTTON_RIGHT: 1172 case BUTTON_MENU | BUTTON_RIGHT:
1220 case BUTTON_MENU | BUTTON_RIGHT | BUTTON_REPEAT: 1173 case BUTTON_MENU | BUTTON_RIGHT | BUTTON_REPEAT:
1221 dont_go_to_menu = true; 1174 dont_go_to_menu = true;
@@ -1224,11 +1177,12 @@ int wps_show(void)
1224 global_settings.volume = mpeg_sound_max(SOUND_VOLUME); 1177 global_settings.volume = mpeg_sound_max(SOUND_VOLUME);
1225 mpeg_sound_set(SOUND_VOLUME, global_settings.volume); 1178 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
1226 display_volume_level(global_settings.volume); 1179 display_volume_level(global_settings.volume);
1227 draw_screen(id3); 1180 draw_screen();
1228 status_draw(); 1181 status_draw();
1229 settings_save(); 1182 settings_save();
1230 break; 1183 break;
1231 1184
1185 /* show id3 tags */
1232 case BUTTON_MENU | BUTTON_ON: 1186 case BUTTON_MENU | BUTTON_ON:
1233 if (keys_locked) 1187 if (keys_locked)
1234 { 1188 {
@@ -1237,139 +1191,184 @@ int wps_show(void)
1237 break; 1191 break;
1238 } 1192 }
1239 lcd_stop_scroll(); 1193 lcd_stop_scroll();
1240 dont_go_to_menu = false;
1241 menu_button_is_down = false;
1242 lcd_icon(ICON_PARAM, true); 1194 lcd_icon(ICON_PARAM, true);
1243 lcd_icon(ICON_AUDIO, true); 1195 lcd_icon(ICON_AUDIO, true);
1244 retval = player_id3_show(); 1196 if(player_id3_show() == SYS_USB_CONNECTED)
1245 if(retval == SYS_USB_CONNECTED) 1197 return true;
1246 return SYS_USB_CONNECTED;
1247 lcd_icon(ICON_PARAM, false); 1198 lcd_icon(ICON_PARAM, false);
1248 lcd_icon(ICON_AUDIO, true); 1199 lcd_icon(ICON_AUDIO, true);
1249 draw_screen(id3); 1200 draw_screen();
1250 break; 1201 break;
1202#endif
1251 1203
1252 case BUTTON_MENU: 1204 case SYS_USB_CONNECTED:
1253 lcd_icon(ICON_PARAM, true); 1205 handle_usb();
1254 lcd_icon(ICON_AUDIO, false); 1206 return true;
1255 menu_button_is_down = true; 1207 }
1256 break; 1208 last_button = button;
1209 }
1257 1210
1258 case BUTTON_PLAY | BUTTON_REL: 1211#ifdef HAVE_LCD_CHARCELLS
1259 /* The PLAY key has been release while the MENU key 1212 lcd_icon(ICON_PARAM, false);
1260 was held */ 1213#endif
1261 if(menu_button_is_down)
1262 pending_mute = !pending_mute;
1263 break;
1264 1214
1265 case BUTTON_STOP | BUTTON_REL: 1215 draw_screen();
1266 /* The STOP key has been release while the MENU key 1216
1267 was held */ 1217 return false;
1268 if(menu_button_is_down) 1218}
1269 pending_keylock = !pending_keylock; 1219
1270 break; 1220/* demonstrates showing different formats from playtune */
1271#else 1221int wps_show(void)
1272 case BUTTON_F1: 1222{
1273 menu_button_is_down = true; 1223
1274 break; 1224#ifdef HAVE_PLAYER_KEYPAD
1275 1225 int retval;
1276 case BUTTON_UP | BUTTON_REL:
1277 /* The UP key has been release while the F1 key
1278 was held */
1279 if(menu_button_is_down)
1280 {
1281 pending_mute = !pending_mute;
1282 debugf("pending: %d\n", pending_mute);
1283 }
1284 break;
1285
1286 case BUTTON_DOWN | BUTTON_REL:
1287 /* The DOWN key has been release while the F1 key
1288 was held */
1289 if(menu_button_is_down)
1290 {
1291 pending_keylock = !pending_keylock;
1292 debugf("pending: %d\n", pending_keylock);
1293 }
1294 break;
1295#endif 1226#endif
1227 int button;
1228 bool ignore_keyup = true;
1229 bool restore = false;
1296 1230
1297#ifdef HAVE_RECORDER_KEYPAD 1231 id3 = NULL;
1298 case BUTTON_F1 | BUTTON_UP: 1232
1233 old_release_mask = button_set_release(RELEASE_MASK);
1234
1235#ifdef HAVE_LCD_CHARCELLS
1236 lcd_icon(ICON_AUDIO, true);
1237 lcd_icon(ICON_PARAM, false);
1299#else 1238#else
1300 case BUTTON_MENU | BUTTON_PLAY: 1239 if(global_settings.statusbar)
1240 lcd_setmargins(0, STATUSBAR_HEIGHT);
1241 else
1242 lcd_setmargins(0, 0);
1243#endif
1244
1245 ff_rewind = false;
1246 ff_rewind_count = 0;
1247
1248#ifdef CUSTOM_WPS
1249 load_custom_wps(); /* Load the Custom WPS file, if there is one */
1250#endif
1251
1252 if(mpeg_is_playing())
1253 {
1254 id3 = mpeg_current_track();
1255 if (id3) {
1256 draw_screen();
1257 display_file_time();
1258 }
1259 restore = true;
1260 }
1261
1262 while ( 1 )
1263 {
1264 button = button_get_w_tmo(HZ/5);
1265
1266 /* discard first event if it's a button release */
1267 if (button && ignore_keyup)
1268 {
1269 ignore_keyup = false;
1270 if (button & BUTTON_REL && button != SYS_USB_CONNECTED)
1271 continue;
1272 }
1273
1274 switch(button)
1275 {
1276 /* exit to dir browser */
1277 case BUTTON_ON:
1278#ifdef HAVE_LCD_CHARCELLS
1279 lcd_icon(ICON_RECORD, false);
1280 lcd_icon(ICON_AUDIO, false);
1301#endif 1281#endif
1302 if(keys_locked) 1282 button_set_release(old_release_mask);
1283 return 0;
1284
1285 /* play/pause */
1286 case BUTTON_PLAY:
1287 if ( paused )
1303 { 1288 {
1304 display_keylock_text(keys_locked); 1289 mpeg_resume();
1305 restore = true; 1290 paused = false;
1306 break; 1291 status_set_playmode(STATUS_PLAY);
1307 } 1292 }
1308 1293 else
1309 if(device_muted != pending_mute)
1310 { 1294 {
1311 device_muted = pending_mute; 1295 mpeg_pause();
1312 1296 paused = true;
1313 if(device_muted) 1297 status_set_playmode(STATUS_PAUSE);
1314 mpeg_sound_set(SOUND_VOLUME, 0); 1298 if (global_settings.resume) {
1315 else 1299 settings_save();
1316 mpeg_sound_set(SOUND_VOLUME, global_settings.volume); 1300#ifndef HAVE_RTC
1317 display_mute_text(device_muted); 1301 ata_flush();
1318 restore = true; 1302#endif
1303 }
1319 } 1304 }
1320 dont_go_to_menu = true;
1321 break; 1305 break;
1322 1306
1307 /* volume up */
1323#ifdef HAVE_RECORDER_KEYPAD 1308#ifdef HAVE_RECORDER_KEYPAD
1324 case BUTTON_F1 | BUTTON_DOWN: 1309 case BUTTON_UP:
1325#else 1310 case BUTTON_UP | BUTTON_REPEAT:
1326 case BUTTON_MENU | BUTTON_STOP:
1327#endif 1311#endif
1328 if(keys_locked != pending_keylock) 1312 case BUTTON_VOL_UP:
1329 { 1313 global_settings.volume++;
1330 keys_locked = pending_keylock; 1314 if(global_settings.volume > mpeg_sound_max(SOUND_VOLUME))
1315 global_settings.volume = mpeg_sound_max(SOUND_VOLUME);
1316 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
1317 status_draw();
1318 settings_save();
1319 break;
1331 1320
1332#ifdef HAVE_LCD_CHARCELLS 1321 /* volume down */
1333 if(keys_locked) 1322#ifdef HAVE_RECORDER_KEYPAD
1334 lcd_icon(ICON_RECORD, true); 1323 case BUTTON_DOWN:
1335 else 1324 case BUTTON_DOWN | BUTTON_REPEAT:
1336 lcd_icon(ICON_RECORD, false);
1337#endif 1325#endif
1338 display_keylock_text(keys_locked); 1326 case BUTTON_VOL_DOWN:
1339 restore = true; 1327 global_settings.volume--;
1328 if(global_settings.volume < mpeg_sound_min(SOUND_VOLUME))
1329 global_settings.volume = mpeg_sound_min(SOUND_VOLUME);
1330 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
1331 status_draw();
1332 settings_save();
1333 break;
1334
1335 /* fast forward / rewind */
1336 case BUTTON_LEFT | BUTTON_REPEAT:
1337 case BUTTON_RIGHT | BUTTON_REPEAT:
1338 ffwd_rew(button);
1339 break;
1340
1341 /* prev / restart */
1342 case BUTTON_LEFT | BUTTON_REL:
1343 if (!id3 || (id3->elapsed < 3*1000))
1344 mpeg_prev();
1345 else {
1346 if (!paused)
1347 mpeg_pause();
1348
1349 mpeg_ff_rewind(-(id3->elapsed));
1350
1351 if (!paused)
1352 mpeg_resume();
1340 } 1353 }
1354 break;
1341 1355
1342 dont_go_to_menu = true; 1356 /* next */
1357 case BUTTON_RIGHT | BUTTON_REL:
1358 mpeg_next();
1343 break; 1359 break;
1344 1360
1345#ifdef HAVE_RECORDER_KEYPAD 1361 /* menu key functions */
1346 case BUTTON_F1 | BUTTON_REL: 1362#ifdef HAVE_PLAYER_KEYPAD
1363 case BUTTON_MENU:
1347#else 1364#else
1348 case BUTTON_MENU | BUTTON_REL: 1365 case BUTTON_F1:
1349#endif
1350#ifdef HAVE_LCD_CHARCELLS
1351 lcd_icon(ICON_PARAM, false);
1352#endif
1353 if(!keys_locked && !dont_go_to_menu && menu_button_is_down)
1354 {
1355 lcd_stop_scroll();
1356 button_set_release(old_release_mask);
1357 main_menu();
1358 old_release_mask = button_set_release(RELEASE_MASK);
1359 ignore_keyup = true;
1360 id3 = mpeg_current_track();
1361 restore = true;
1362 }
1363 else
1364 {
1365 dont_go_to_menu = false;
1366 }
1367#ifdef HAVE_LCD_CHARCELLS
1368 lcd_icon(ICON_AUDIO, true);
1369#endif 1366#endif
1370 menu_button_is_down = false; 1367 if (menu())
1368 return SYS_USB_CONNECTED;
1371 break; 1369 break;
1372 1370
1371 /* toggle status bar */
1373#ifdef HAVE_RECORDER_KEYPAD 1372#ifdef HAVE_RECORDER_KEYPAD
1374 case BUTTON_F3: 1373 case BUTTON_F3:
1375#ifdef HAVE_LCD_BITMAP 1374#ifdef HAVE_LCD_BITMAP
@@ -1384,18 +1383,12 @@ int wps_show(void)
1384 break; 1383 break;
1385#endif 1384#endif
1386 1385
1386 /* stop and exit wps */
1387#ifdef HAVE_RECORDER_KEYPAD 1387#ifdef HAVE_RECORDER_KEYPAD
1388 case BUTTON_OFF: 1388 case BUTTON_OFF:
1389#else 1389#else
1390 case BUTTON_STOP: 1390 case BUTTON_STOP:
1391#endif 1391#endif
1392 if (keys_locked)
1393 {
1394 display_keylock_text(keys_locked);
1395 restore = true;
1396 break;
1397 }
1398
1399#ifdef HAVE_LCD_CHARCELLS 1392#ifdef HAVE_LCD_CHARCELLS
1400 lcd_icon(ICON_RECORD, false); 1393 lcd_icon(ICON_RECORD, false);
1401 lcd_icon(ICON_AUDIO, false); 1394 lcd_icon(ICON_AUDIO, false);
@@ -1406,62 +1399,27 @@ int wps_show(void)
1406 return 0; 1399 return 0;
1407 1400
1408#ifndef SIMULATOR 1401#ifndef SIMULATOR
1409 case SYS_USB_CONNECTED: { 1402 case SYS_USB_CONNECTED:
1410#ifdef HAVE_LCD_BITMAP 1403 handle_usb();
1411 bool laststate=statusbar(false);
1412#endif
1413 /* Tell the USB thread that we are safe */
1414 DEBUGF("wps got SYS_USB_CONNECTED\n");
1415 usb_acknowledge(SYS_USB_CONNECTED_ACK);
1416
1417 /* Wait until the USB cable is extracted again */
1418 usb_wait_for_disconnect(&button_queue);
1419
1420#ifdef HAVE_LCD_BITMAP
1421 statusbar(laststate);
1422#endif
1423 /* Signal to our caller that we have been in USB mode */
1424 return SYS_USB_CONNECTED; 1404 return SYS_USB_CONNECTED;
1425 break;
1426 }
1427#endif 1405#endif
1428 case BUTTON_NONE: /* Timeout */
1429 if(!mpeg_is_playing())
1430 restore = true;
1431
1432 if (id3)
1433#ifdef CUSTOM_WPS
1434 refresh_wps(false);
1435#else
1436 display_file_time(id3->elapsed, id3->length);
1437#endif
1438
1439 /* save resume data */
1440 if ( id3 &&
1441 global_settings.resume &&
1442 global_settings.resume_offset != id3->offset ) {
1443 DEBUGF("R%X,%X (%X)\n", global_settings.resume_offset,
1444 id3->offset,id3);
1445 global_settings.resume_index = id3->index;
1446 global_settings.resume_offset = id3->offset;
1447 settings_save();
1448 }
1449 1406
1450 status_draw(); 1407 case BUTTON_NONE: /* Timeout */
1408 update();
1451 break; 1409 break;
1452 } 1410 }
1453 1411
1454 if ( button ) 1412 if ( button )
1455 ata_spin(); 1413 ata_spin();
1456 1414
1457 if(restore) { 1415 if (restore) {
1458 restore = false; 1416 restore = false;
1459 draw_screen(id3); 1417 draw_screen();
1460 if (mpeg_is_playing() && id3) 1418 if (id3)
1461#ifdef CUSTOM_WPS 1419#ifdef CUSTOM_WPS
1462 refresh_wps(false); 1420 refresh_wps(false);
1463#else 1421#else
1464 display_file_time(id3->elapsed, id3->length); 1422 display_file_time();
1465#endif 1423#endif
1466 } 1424 }
1467 } 1425 }