summaryrefslogtreecommitdiff
path: root/apps/wps.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/wps.c')
-rw-r--r--apps/wps.c653
1 files changed, 192 insertions, 461 deletions
diff --git a/apps/wps.c b/apps/wps.c
index 92b4e008b8..49d7d3db36 100644
--- a/apps/wps.c
+++ b/apps/wps.c
@@ -61,63 +61,86 @@ static struct mp3entry* id3 = NULL;
61static struct mp3entry* nid3 = NULL; 61static struct mp3entry* nid3 = NULL;
62static char current_track_path[MAX_PATH+1]; 62static char current_track_path[MAX_PATH+1];
63 63
64#if defined(HAVE_PLAYER_KEYPAD) || defined(HAVE_NEO_KEYPAD) || defined(HAVE_ONDIO_KEYPAD) 64/* button definitions */
65void player_change_volume(int button) 65#ifdef HAVE_RECORDER_KEYPAD
66#define WPS_NEXT (BUTTON_RIGHT | BUTTON_REL)
67#define WPS_PREV (BUTTON_LEFT | BUTTON_REL)
68#define WPS_FFWD (BUTTON_RIGHT | BUTTON_REPEAT)
69#define WPS_REW (BUTTON_LEFT | BUTTON_REPEAT)
70#define WPS_INCVOL BUTTON_UP
71#define WPS_DECVOL BUTTON_DOWN
72#define WPS_PAUSE BUTTON_PLAY
73#define WPS_MENU (BUTTON_F1 | BUTTON_REL)
74#define WPS_MENU_PRE BUTTON_F1
75#define WPS_BROWSE (BUTTON_ON | BUTTON_REL)
76#define WPS_EXIT BUTTON_OFF
77#define WPS_KEYLOCK (BUTTON_F1 | BUTTON_DOWN)
78#define WPS_ID3 (BUTTON_F1 | BUTTON_ON)
79
80#define WPS_RC_NEXT BUTTON_RC_RIGHT
81#define WPS_RC_PREV BUTTON_RC_LEFT
82#define WPS_RC_PAUSE BUTTON_RC_PLAY
83#define WPS_RC_INCVOL BUTTON_RC_VOL_UP
84#define WPS_RC_DECVOL BUTTON_RC_VOL_DOWN
85#define WPS_RC_EXIT BUTTON_RC_STOP
86
87#elif defined HAVE_PLAYER_KEYPAD
88#define WPS_NEXT BUTTON_RIGHT
89#define WPS_PREV BUTTON_LEFT
90#define WPS_FFWD (BUTTON_RIGHT | BUTTON_REPEAT)
91#define WPS_REW (BUTTON_LEFT | BUTTON_REPEAT)
92#define WPS_INCVOL (BUTTON_MENU | BUTTON_RIGHT)
93#define WPS_DECVOL (BUTTON_MENU | BUTTON_LEFT)
94#define WPS_PAUSE BUTTON_PLAY
95#define WPS_MENU (BUTTON_MENU | BUTTON_REL)
96#define WPS_MENU_PRE BUTTON_MENU
97#define WPS_BROWSE (BUTTON_ON | BUTTON_REL)
98#define WPS_EXIT BUTTON_STOP
99#define WPS_KEYLOCK (BUTTON_MENU | BUTTON_STOP)
100#define WPS_ID3 (BUTTON_MENU | BUTTON_ON)
101
102#define WPS_RC_NEXT BUTTON_RC_RIGHT
103#define WPS_RC_PREV BUTTON_RC_LEFT
104#define WPS_RC_PAUSE BUTTON_RC_PLAY
105#define WPS_RC_INCVOL BUTTON_RC_VOL_UP
106#define WPS_RC_DECVOL BUTTON_RC_VOL_DOWN
107#define WPS_RC_EXIT BUTTON_RC_STOP
108
109#elif defined HAVE_ONDIO_KEYPAD
110#define WPS_NEXT (BUTTON_RIGHT | BUTTON_REL)
111#define WPS_PREV (BUTTON_LEFT | BUTTON_REL)
112#define WPS_FFWD (BUTTON_RIGHT | BUTTON_REPEAT)
113#define WPS_REW (BUTTON_LEFT | BUTTON_REPEAT)
114#define WPS_INCVOL BUTTON_UP
115#define WPS_DECVOL BUTTON_DOWN
116#define WPS_PAUSE BUTTON_OFF
117#define WPS_MENU (BUTTON_MENU | BUTTON_REPEAT)
118#define WPS_BROWSE (BUTTON_MENU | BUTTON_REL)
119#define WPS_KEYLOCK (BUTTON_MENU | BUTTON_DOWN)
120
121#endif
122
123/* set volume
124 return true if screen restore is needed
125 return false otherwise
126*/
127static bool setvol(void)
66{ 128{
67 bool exit = false; 129 if (global_settings.volume < mpeg_sound_min(SOUND_VOLUME))
68 char buffer[32]; 130 global_settings.volume = mpeg_sound_min(SOUND_VOLUME);
69 131 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
70 lcd_stop_scroll(); 132 status_draw(false);
71 while (!exit) 133 wps_refresh(id3, nid3, 0, WPS_REFRESH_NON_STATIC);
72 { 134 settings_save();
73 switch (button)
74 {
75 case BUTTON_MENU | BUTTON_RIGHT:
76 case BUTTON_MENU | BUTTON_RIGHT | BUTTON_REPEAT:
77 global_settings.volume++;
78 if(global_settings.volume > mpeg_sound_max(SOUND_VOLUME))
79 global_settings.volume = mpeg_sound_max(SOUND_VOLUME);
80 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
81 wps_refresh(id3, nid3, 0, WPS_REFRESH_NON_STATIC);
82 settings_save();
83 break;
84
85 case BUTTON_MENU | BUTTON_LEFT:
86 case BUTTON_MENU | BUTTON_LEFT | BUTTON_REPEAT:
87 global_settings.volume--;
88 if(global_settings.volume < mpeg_sound_min(SOUND_VOLUME))
89 global_settings.volume = mpeg_sound_min(SOUND_VOLUME);
90 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
91 wps_refresh(id3, nid3, 0, WPS_REFRESH_NON_STATIC);
92 settings_save();
93 break;
94
95 case BUTTON_MENU | BUTTON_REL:
96 case BUTTON_MENU | BUTTON_LEFT | BUTTON_REL:
97 case BUTTON_MENU | BUTTON_RIGHT | BUTTON_REL:
98 exit = true;
99 break;
100 }
101
102 snprintf(buffer,sizeof(buffer),"Vol: %d %% ",
103 mpeg_val2phys(SOUND_VOLUME, global_settings.volume));
104
105#ifdef HAVE_LCD_CHARCELLS 135#ifdef HAVE_LCD_CHARCELLS
106 lcd_puts(0, 0, buffer); 136 splash(0, false, "Vol: %d %% ",
107#else 137 mpeg_val2phys(SOUND_VOLUME, global_settings.volume));
108 lcd_puts(2, 3, buffer); 138 return true;
109 lcd_update();
110#endif 139#endif
111 status_draw(false); 140 return false;
112
113 if (!exit)
114 button = button_get(true);
115 }
116 wps_refresh(id3, nid3, 0, WPS_REFRESH_ALL);
117} 141}
118#endif
119 142
120void display_keylock_text(bool locked) 143static void display_keylock_text(bool locked)
121{ 144{
122 char* s; 145 char* s;
123 lcd_stop_scroll(); 146 lcd_stop_scroll();
@@ -135,176 +158,6 @@ void display_keylock_text(bool locked)
135 splash(HZ, true, s); 158 splash(HZ, true, s);
136} 159}
137 160
138void display_mute_text(bool muted)
139{
140 char *s;
141 lcd_stop_scroll();
142#ifdef HAVE_LCD_CHARCELLS
143 if (muted)
144 s = str(LANG_MUTE_ON_PLAYER);
145 else
146 s = str(LANG_MUTE_OFF_PLAYER);
147#else
148 if (muted)
149 s = str(LANG_MUTE_ON_RECORDER);
150 else
151 s = str(LANG_MUTE_OFF_RECORDER);
152#endif
153 splash(HZ, true, s);
154}
155
156bool browse_id3(void)
157{
158 int button;
159 int menu_pos = 0;
160 int menu_max = 8;
161 bool exit = false;
162 char scroll_text[MAX_PATH];
163
164 if (!(mpeg_status() & MPEG_STATUS_PLAY))
165 return false;
166
167 while (!exit)
168 {
169 lcd_clear_display();
170
171 switch (menu_pos)
172 {
173 case 0:
174 lcd_puts(0, 0, str(LANG_ID3_TITLE));
175 lcd_puts_scroll(0, 1, id3->title ? id3->title :
176 (char*)str(LANG_ID3_NO_TITLE));
177 break;
178
179 case 1:
180 lcd_puts(0, 0, str(LANG_ID3_ARTIST));
181 lcd_puts_scroll(0, 1,
182 id3->artist ? id3->artist :
183 (char*)str(LANG_ID3_NO_ARTIST));
184 break;
185
186 case 2:
187 lcd_puts(0, 0, str(LANG_ID3_ALBUM));
188 lcd_puts_scroll(0, 1, id3->album ? id3->album :
189 (char*)str(LANG_ID3_NO_ALBUM));
190 break;
191
192 case 3:
193 lcd_puts(0, 0, str(LANG_ID3_TRACKNUM));
194
195 if (id3->tracknum) {
196 snprintf(scroll_text,sizeof(scroll_text), "%d",
197 id3->tracknum);
198 lcd_puts_scroll(0, 1, scroll_text);
199 }
200 else
201 lcd_puts_scroll(0, 1, str(LANG_ID3_NO_TRACKNUM));
202 break;
203
204 case 4:
205 lcd_puts(0, 0, str(LANG_ID3_GENRE));
206 lcd_puts_scroll(0, 1,
207 id3_get_genre(id3) ?
208 id3_get_genre(id3) :
209 (char*)str(LANG_ID3_NO_INFO));
210 break;
211
212 case 5:
213 lcd_puts(0, 0, str(LANG_ID3_YEAR));
214 if (id3->year) {
215 snprintf(scroll_text,sizeof(scroll_text), "%d",
216 id3->year);
217 lcd_puts_scroll(0, 1, scroll_text);
218 }
219 else
220 lcd_puts_scroll(0, 1, str(LANG_ID3_NO_INFO));
221 break;
222
223 case 6:
224 lcd_puts(0, 0, str(LANG_ID3_LENGHT));
225 snprintf(scroll_text,sizeof(scroll_text), "%d:%02d",
226 id3->length / 60000,
227 id3->length % 60000 / 1000 );
228 lcd_puts(0, 1, scroll_text);
229 break;
230
231 case 7:
232 lcd_puts(0, 0, str(LANG_ID3_PLAYLIST));
233 snprintf(scroll_text,sizeof(scroll_text), "%d/%d",
234 playlist_get_display_index(), playlist_amount());
235 lcd_puts_scroll(0, 1, scroll_text);
236 break;
237
238
239 case 8:
240 lcd_puts(0, 0, str(LANG_ID3_BITRATE));
241 snprintf(scroll_text,sizeof(scroll_text), "%d kbps",
242 id3->bitrate);
243 lcd_puts(0, 1, scroll_text);
244 break;
245
246 case 9:
247 lcd_puts(0, 0, str(LANG_ID3_FRECUENCY));
248 snprintf(scroll_text,sizeof(scroll_text), "%d Hz",
249 id3->frequency);
250 lcd_puts(0, 1, scroll_text);
251 break;
252
253 case 10:
254 lcd_puts(0, 0, str(LANG_ID3_PATH));
255 lcd_puts_scroll(0, 1, id3->path);
256 break;
257 }
258 lcd_update();
259
260 button = button_get(true);
261
262 switch(button)
263 {
264 case BUTTON_LEFT:
265#ifdef HAVE_RECORDER_KEYPAD
266 case BUTTON_UP:
267#endif
268 if (menu_pos > 0)
269 menu_pos--;
270 else
271 menu_pos = menu_max;
272 break;
273
274 case BUTTON_RIGHT:
275#ifdef HAVE_RECORDER_KEYPAD
276 case BUTTON_DOWN:
277#endif
278 if (menu_pos < menu_max)
279 menu_pos++;
280 else
281 menu_pos = 0;
282 break;
283
284 case BUTTON_REPEAT:
285 break;
286
287#ifdef BUTTON_STOP
288 case BUTTON_STOP:
289#else
290 case BUTTON_OFF:
291#endif
292 case BUTTON_PLAY:
293 lcd_stop_scroll();
294 /* eat release event */
295 button_get(true);
296 exit = true;
297 break;
298
299 default:
300 if(default_event_handler(button) == SYS_USB_CONNECTED)
301 return true;
302 break;
303 }
304 }
305 return false;
306}
307
308static bool ffwd_rew(int button) 161static bool ffwd_rew(int button)
309{ 162{
310 static const int ff_rew_steps[] = { 163 static const int ff_rew_steps[] = {
@@ -324,8 +177,8 @@ static bool ffwd_rew(int button)
324 177
325 while (!exit) { 178 while (!exit) {
326 switch ( button ) { 179 switch ( button ) {
327 case BUTTON_LEFT | BUTTON_REPEAT: 180 case WPS_FFWD:
328 case BUTTON_RIGHT | BUTTON_REPEAT: 181 case WPS_REW:
329 if (ff_rewind) 182 if (ff_rewind)
330 { 183 {
331 if (direction == 1) 184 if (direction == 1)
@@ -367,7 +220,7 @@ static bool ffwd_rew(int button)
367#ifdef HAVE_PLAYER_KEYPAD 220#ifdef HAVE_PLAYER_KEYPAD
368 lcd_stop_scroll(); 221 lcd_stop_scroll();
369#endif 222#endif
370 direction = (button & BUTTON_RIGHT) ? 1 : -1; 223 direction = (button & WPS_FFWD) ? 1 : -1;
371 224
372 if (direction > 0) 225 if (direction > 0)
373 status_set_ffmode(STATUS_FASTFORWARD); 226 status_set_ffmode(STATUS_FASTFORWARD);
@@ -405,8 +258,8 @@ static bool ffwd_rew(int button)
405 258
406 break; 259 break;
407 260
408 case BUTTON_LEFT | BUTTON_REL: 261 case WPS_PREV:
409 case BUTTON_RIGHT | BUTTON_REL: 262 case WPS_NEXT:
410 mpeg_ff_rewind(id3->elapsed+ff_rewind_count); 263 mpeg_ff_rewind(id3->elapsed+ff_rewind_count);
411 ff_rewind_count = 0; 264 ff_rewind_count = 0;
412 ff_rewind = false; 265 ff_rewind = false;
@@ -483,133 +336,6 @@ static bool update(void)
483 return retcode; 336 return retcode;
484} 337}
485 338
486static bool menu(void)
487{
488 static bool muted = false;
489 bool exit = false;
490 int last_button = 0;
491
492#ifdef HAVE_LCD_CHARCELLS
493 status_set_param(true);
494 status_draw(false);
495#endif
496
497 while (!exit) {
498 int button = button_get(true);
499
500 /* these are never locked */
501 switch (button)
502 {
503 /* key lock */
504#ifdef HAVE_RECORDER_KEYPAD
505 case BUTTON_F1 | BUTTON_DOWN:
506#else
507 case BUTTON_MENU | BUTTON_STOP:
508#endif
509 keys_locked = !keys_locked;
510 display_keylock_text(keys_locked);
511 exit = true;
512 while (button_get(false)); /* clear button queue */
513 break;
514
515 default:
516 if(default_event_handler(button) == SYS_USB_CONNECTED) {
517 keys_locked = false;
518 return true;
519 }
520 break;
521 }
522
523 if (keys_locked) {
524 display_keylock_text(true);
525 break;
526 }
527
528 switch ( button ) {
529 /* go into menu */
530#ifdef HAVE_RECORDER_KEYPAD
531 case BUTTON_F1 | BUTTON_REL:
532#else
533 case BUTTON_MENU | BUTTON_REL:
534#endif
535 exit = true;
536 if ( !last_button && !keys_locked ) {
537 lcd_stop_scroll();
538
539 if (main_menu())
540 return true;
541#ifdef HAVE_LCD_BITMAP
542 if(global_settings.statusbar)
543 lcd_setmargins(0, STATUSBAR_HEIGHT);
544 else
545 lcd_setmargins(0, 0);
546#endif
547 }
548 break;
549
550 /* mute */
551#ifdef BUTTON_MENU
552 case BUTTON_MENU | BUTTON_PLAY:
553#else
554 case BUTTON_F1 | BUTTON_PLAY:
555#endif
556 if ( muted )
557 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
558 else
559 mpeg_sound_set(SOUND_VOLUME, 0);
560 muted = !muted;
561#ifdef HAVE_LCD_CHARCELLS
562 status_set_param(false);
563#endif
564 display_mute_text(muted);
565 break;
566
567#ifdef BUTTON_MENU
568 /* change volume */
569 case BUTTON_MENU | BUTTON_LEFT:
570 case BUTTON_MENU | BUTTON_LEFT | BUTTON_REPEAT:
571 case BUTTON_MENU | BUTTON_RIGHT:
572 case BUTTON_MENU | BUTTON_RIGHT | BUTTON_REPEAT:
573 player_change_volume(button);
574 exit = true;
575 break;
576
577 /* show id3 tags */
578#ifdef BUTTON_ON
579 case BUTTON_MENU | BUTTON_ON:
580#ifdef HAVE_LCD_CHARCELLS
581 status_set_param(true);
582 status_set_audio(true);
583#endif
584#endif
585#else
586 case BUTTON_F1 | BUTTON_ON:
587#endif
588 lcd_clear_display();
589 lcd_puts(0, 0, str(LANG_ID3_INFO));
590 lcd_puts(0, 1, str(LANG_ID3_SCREEN));
591 lcd_update();
592 sleep(HZ);
593
594 if(browse_id3())
595 return true;
596#ifdef HAVE_PLAYER_KEYPAD
597 status_set_param(false);
598 status_set_audio(true);
599#endif
600 exit = true;
601 break;
602 }
603 last_button = button;
604 }
605
606#ifdef HAVE_LCD_CHARCELLS
607 status_set_param(false);
608#endif
609
610 return false;
611}
612
613static void fade(bool fade_in) 339static void fade(bool fade_in)
614{ 340{
615 if (fade_in) { 341 if (fade_in) {
@@ -647,12 +373,20 @@ static void fade(bool fade_in)
647} 373}
648 374
649 375
376static void waitfor_nokey(void)
377{
378 /* wait until all keys are released */
379 while (button_get(false) != BUTTON_NONE)
380 yield();
381}
382
650/* demonstrates showing different formats from playtune */ 383/* demonstrates showing different formats from playtune */
651int wps_show(void) 384int wps_show(void)
652{ 385{
653 int button = 0, lastbutton = 0; 386 int button = 0, lastbutton = 0;
654 bool ignore_keyup = true; 387 bool ignore_keyup = true;
655 bool restore = false; 388 bool restore = false;
389 long restoretimer = 0; /* timer to delay screen redraw temporarily */
656 bool exit = false; 390 bool exit = false;
657 bool update_track = false; 391 bool update_track = false;
658 392
@@ -763,26 +497,22 @@ int wps_show(void)
763 if (button >= 0 && button & BUTTON_REL ) 497 if (button >= 0 && button & BUTTON_REL )
764 continue; 498 continue;
765 } 499 }
766 500
501#ifdef WPS_KEYLOCK
767 /* ignore non-remote buttons when keys are locked */ 502 /* ignore non-remote buttons when keys are locked */
768 if (keys_locked && 503 if (keys_locked &&
769 ! ((button < 0) || 504 ! ((button < 0) ||
770#ifdef HAVE_RECORDER_KEYPAD 505 (button == BUTTON_NONE) ||
771 (button & BUTTON_F1) || 506 ((button & WPS_KEYLOCK) == WPS_KEYLOCK) ||
772#else 507 (button & BUTTON_REMOTE)
773 (button & BUTTON_MENU) || 508 ))
774#endif
775 (button == BUTTON_NONE)
776#ifdef BUTTON_REMOTE
777 || (button & BUTTON_REMOTE)
778#endif
779 ))
780 { 509 {
781 while (button_get(false)); /* clear button queue */ 510 if (!(button & BUTTON_REL))
782 display_keylock_text(true); 511 display_keylock_text(true);
783 restore = true; 512 restore = true;
784 continue; 513 button = BUTTON_NONE;
785 } 514 }
515#endif
786 516
787 /* Exit if mpeg has stopped playing. This can happen if using the 517 /* Exit if mpeg has stopped playing. This can happen if using the
788 sleep timer with the charger plugged or if starting a recording 518 sleep timer with the charger plugged or if starting a recording
@@ -792,49 +522,25 @@ int wps_show(void)
792 522
793 switch(button) 523 switch(button)
794 { 524 {
795#ifdef BUTTON_ON 525 case WPS_BROWSE:
796 case BUTTON_ON:
797#ifdef HAVE_RECORDER_KEYPAD
798 switch (on_screen()) {
799 case 2:
800 /* usb connected? */
801 return SYS_USB_CONNECTED;
802
803 case 1:
804 /* was on_screen used? */
805 restore = true;
806
807 /* pause may have been turned off by pitch screen */
808 if (paused && !(mpeg_status() & MPEG_STATUS_PAUSE)) {
809 paused = false;
810 }
811 break;
812
813 case 0:
814 /* otherwise, exit to browser */
815#else
816#ifdef HAVE_LCD_CHARCELLS 526#ifdef HAVE_LCD_CHARCELLS
817 status_set_record(false); 527 status_set_record(false);
818 status_set_audio(false); 528 status_set_audio(false);
819#endif
820#endif 529#endif
821 lcd_stop_scroll(); 530 lcd_stop_scroll();
822 531
823 /* set dir browser to current playing song */ 532 /* set dir browser to current playing song */
824 if (global_settings.browse_current && 533 if (global_settings.browse_current &&
825 current_track_path[0] != '\0') 534 current_track_path[0] != '\0')
826 set_current_file(current_track_path); 535 set_current_file(current_track_path);
827 536
828 return 0; 537 return 0;
829#ifdef HAVE_RECORDER_KEYPAD
830 }
831 break; 538 break;
832#endif 539
833#endif /* BUTTON_ON */
834 /* play/pause */ 540 /* play/pause */
835 case BUTTON_PLAY: 541 case WPS_PAUSE:
836#ifdef BUTTON_RC_PLAY 542#ifdef WPS_RC_PAUSE
837 case BUTTON_RC_PLAY: 543 case WPS_RC_PAUSE:
838#endif 544#endif
839 if ( paused ) 545 if ( paused )
840 { 546 {
@@ -861,53 +567,50 @@ int wps_show(void)
861 break; 567 break;
862 568
863 /* volume up */ 569 /* volume up */
864#ifdef HAVE_RECORDER_KEYPAD 570 case WPS_INCVOL:
865 case BUTTON_UP: 571 case WPS_INCVOL | BUTTON_REPEAT:
866 case BUTTON_UP | BUTTON_REPEAT: 572#ifdef WPS_RC_INCVOL
867#endif 573 case WPS_RC_INCVOL:
868#ifdef BUTTON_RC_VOL_UP
869 case BUTTON_RC_VOL_UP:
870#endif 574#endif
871 global_settings.volume++; 575 global_settings.volume++;
872 if(global_settings.volume > mpeg_sound_max(SOUND_VOLUME)) 576 if (setvol()) {
873 global_settings.volume = mpeg_sound_max(SOUND_VOLUME); 577 restore = true;
874 mpeg_sound_set(SOUND_VOLUME, global_settings.volume); 578 restoretimer = current_tick + HZ;
875 status_draw(false); 579 }
876 settings_save();
877 break; 580 break;
878 581
879 /* volume down */ 582 /* volume down */
880#ifdef HAVE_RECORDER_KEYPAD 583 case WPS_DECVOL:
881 case BUTTON_DOWN: 584 case WPS_DECVOL | BUTTON_REPEAT:
882 case BUTTON_DOWN | BUTTON_REPEAT: 585#ifdef WPS_RC_DECVOL
883#endif 586 case WPS_RC_DECVOL:
884#ifdef BUTTON_RC_VOL_DOWN
885 case BUTTON_RC_VOL_DOWN:
886#endif 587#endif
887 global_settings.volume--; 588 global_settings.volume--;
888 if(global_settings.volume < mpeg_sound_min(SOUND_VOLUME)) 589 if (setvol()) {
889 global_settings.volume = mpeg_sound_min(SOUND_VOLUME); 590 restore = true;
890 mpeg_sound_set(SOUND_VOLUME, global_settings.volume); 591 restoretimer = current_tick + HZ;
891 status_draw(false); 592 }
892 settings_save();
893 break; 593 break;
894 594
895 /* fast forward / rewind */ 595 /* fast forward / rewind */
896 case BUTTON_LEFT | BUTTON_REPEAT: 596 case WPS_FFWD:
897 case BUTTON_RIGHT | BUTTON_REPEAT: 597 case WPS_REW:
598#ifdef WPS_RC_FFWD
599 case WPS_RC_FFWD:
600 case WPS_RC_RWD:
601#endif
898 ffwd_rew(button); 602 ffwd_rew(button);
899 break; 603 break;
900 604
901 /* prev / restart */ 605 /* prev / restart */
902#ifdef BUTTON_RC_LEFT 606#ifdef WPS_RC_PREV
903 case BUTTON_RC_LEFT: 607 case WPS_RC_PREV:
904#endif 608#endif
905 case BUTTON_LEFT | BUTTON_REL: 609 case WPS_PREV:
906#ifdef HAVE_RECORDER_KEYPAD 610 /* ignore release event after rewind */
907 if ((button == (BUTTON_LEFT | BUTTON_REL)) && 611 if (lastbutton & BUTTON_REPEAT)
908 (lastbutton != BUTTON_LEFT ))
909 break; 612 break;
910#endif 613
911 if (!id3 || (id3->elapsed < 3*1000)) { 614 if (!id3 || (id3->elapsed < 3*1000)) {
912 mpeg_prev(); 615 mpeg_prev();
913 } 616 }
@@ -923,29 +626,43 @@ int wps_show(void)
923 break; 626 break;
924 627
925 /* next */ 628 /* next */
926#ifdef BUTTON_RC_RIGHT 629#ifdef WPS_RC_NEXT
927 case BUTTON_RC_RIGHT: 630 case WPS_RC_NEXT:
928#endif 631#endif
929 case BUTTON_RIGHT | BUTTON_REL: 632 case WPS_NEXT:
930#ifdef HAVE_RECORDER_KEYPAD 633#ifdef HAVE_RECORDER_KEYPAD
931 if ((button == (BUTTON_RIGHT | BUTTON_REL)) && 634 if (lastbutton & BUTTON_REPEAT)
932 (lastbutton != BUTTON_RIGHT)) 635 break;
933 break;
934#endif 636#endif
935 mpeg_next(); 637 mpeg_next();
936 break; 638 break;
937 639
938 /* menu key functions */ 640 /* menu key functions */
939#ifdef BUTTON_MENU 641 case WPS_MENU:
940 case BUTTON_MENU: 642#ifdef WPS_MENU_PRE
941#else 643 if (lastbutton != WPS_MENU_PRE)
942 case BUTTON_F1: 644 break;
943#endif 645#endif
944 if (menu()) 646 lcd_stop_scroll();
945 return SYS_USB_CONNECTED;
946 647
947 update_track = true; 648 if (main_menu())
649 return true;
650#ifdef HAVE_LCD_BITMAP
651 if (global_settings.statusbar)
652 lcd_setmargins(0, STATUSBAR_HEIGHT);
653 else
654 lcd_setmargins(0, 0);
655#endif
656 restore = true;
657 break;
658
659 /* key lock */
660 case WPS_KEYLOCK:
661 case WPS_KEYLOCK | BUTTON_REPEAT:
662 keys_locked = !keys_locked;
663 display_keylock_text(keys_locked);
948 restore = true; 664 restore = true;
665 waitfor_nokey();
949 break; 666 break;
950 667
951#ifdef HAVE_RECORDER_KEYPAD 668#ifdef HAVE_RECORDER_KEYPAD
@@ -962,22 +679,32 @@ int wps_show(void)
962 return SYS_USB_CONNECTED; 679 return SYS_USB_CONNECTED;
963 restore = true; 680 restore = true;
964 break; 681 break;
682
683 /* pitch screen */
684 case BUTTON_ON | BUTTON_REPEAT:
685 if (2 == pitch_screen())
686 return SYS_USB_CONNECTED;
687 restore = true;
688 break;
965#endif 689#endif
966 690
967 /* stop and exit wps */ 691 /* stop and exit wps */
968#ifdef BUTTON_OFF 692#ifdef WPS_EXIT
969 case BUTTON_OFF | BUTTON_REL: 693 case WPS_EXIT:
970#else 694#ifdef WPS_RC_EXIT
971 case BUTTON_STOP | BUTTON_REL: 695 case WPS_RC_EXIT:
972 if ( lastbutton != BUTTON_STOP )
973 break;
974#endif
975#ifdef BUTTON_RC_STOP
976 case BUTTON_RC_STOP:
977#endif 696#endif
978 exit = true; 697 exit = true;
979 break; 698 break;
699#endif
980 700
701#ifdef WPS_ID3
702 case WPS_ID3:
703 browse_id3();
704 restore = true;
705 break;
706#endif
707
981 case BUTTON_NONE: /* Timeout */ 708 case BUTTON_NONE: /* Timeout */
982 update_track = true; 709 update_track = true;
983 break; 710 break;
@@ -1029,8 +756,12 @@ int wps_show(void)
1029 if ( button ) 756 if ( button )
1030 ata_spin(); 757 ata_spin();
1031 758
1032 if (restore) { 759 if (restore &&
760 ((restoretimer == 0) ||
761 (restoretimer < current_tick)))
762 {
1033 restore = false; 763 restore = false;
764 restoretimer = 0;
1034 if (wps_display(id3, nid3)) 765 if (wps_display(id3, nid3))
1035 { 766 {
1036 /* set dir browser to current playing song */ 767 /* set dir browser to current playing song */
@@ -1044,7 +775,7 @@ int wps_show(void)
1044 if (id3) 775 if (id3)
1045 wps_refresh(id3, nid3, 0, WPS_REFRESH_NON_STATIC); 776 wps_refresh(id3, nid3, 0, WPS_REFRESH_NON_STATIC);
1046 } 777 }
1047 if(button != BUTTON_NONE) 778 if (button != BUTTON_NONE)
1048 lastbutton = button; 779 lastbutton = button;
1049 } 780 }
1050 return 0; /* unreachable - just to reduce compiler warnings */ 781 return 0; /* unreachable - just to reduce compiler warnings */