summaryrefslogtreecommitdiff
path: root/apps/wps.c
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2004-09-19 21:58:37 +0000
committerBjörn Stenberg <bjorn@haxx.se>2004-09-19 21:58:37 +0000
commit6c33c51a4ca9907d23e3154d956fd6781122f492 (patch)
treef0e598efaf064bb72c33c0a8a2edba4cf9ebb13c /apps/wps.c
parent17f54a40f100a3343a15a431d235699024aa76c8 (diff)
downloadrockbox-6c33c51a4ca9907d23e3154d956fd6781122f492.tar.gz
rockbox-6c33c51a4ca9907d23e3154d956fd6781122f492.zip
Redesigned the button handling. The code now uses symbolic function defines instead of checking for specific buttons. This makes it easier to add support for new devices with different button layouts.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5091 a1c6a512-1295-4272-9138-f99709370657
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 */