summaryrefslogtreecommitdiff
path: root/apps/plugins/mpegplayer/mpeg_settings.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/mpegplayer/mpeg_settings.c')
-rw-r--r--apps/plugins/mpegplayer/mpeg_settings.c1454
1 files changed, 0 insertions, 1454 deletions
diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c
deleted file mode 100644
index c904de466d..0000000000
--- a/apps/plugins/mpegplayer/mpeg_settings.c
+++ /dev/null
@@ -1,1454 +0,0 @@
1#include "plugin.h"
2#include "lib/helper.h"
3#include "lib/configfile.h"
4
5#include "mpegplayer.h"
6#include "mpeg_settings.h"
7
8struct mpeg_settings settings;
9
10#define THUMB_DELAY (75*HZ/100)
11
12/* button definitions */
13#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
14 (CONFIG_KEYPAD == IRIVER_H300_PAD)
15#define MPEG_START_TIME_SELECT BUTTON_ON
16#define MPEG_START_TIME_LEFT BUTTON_LEFT
17#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
18#define MPEG_START_TIME_UP BUTTON_UP
19#define MPEG_START_TIME_DOWN BUTTON_DOWN
20#define MPEG_START_TIME_EXIT BUTTON_OFF
21
22#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
23#define MPEG_START_TIME_SELECT BUTTON_PLAY
24#define MPEG_START_TIME_LEFT BUTTON_LEFT
25#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
26#define MPEG_START_TIME_UP BUTTON_UP
27#define MPEG_START_TIME_DOWN BUTTON_DOWN
28#define MPEG_START_TIME_EXIT BUTTON_POWER
29
30#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
31 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
32 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
33#define MPEG_START_TIME_SELECT BUTTON_SELECT
34#define MPEG_START_TIME_LEFT BUTTON_LEFT
35#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
36#define MPEG_START_TIME_UP BUTTON_SCROLL_FWD
37#define MPEG_START_TIME_DOWN BUTTON_SCROLL_BACK
38#define MPEG_START_TIME_EXIT BUTTON_MENU
39
40#elif CONFIG_KEYPAD == GIGABEAT_PAD
41#define MPEG_START_TIME_SELECT BUTTON_SELECT
42#define MPEG_START_TIME_LEFT BUTTON_LEFT
43#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
44#define MPEG_START_TIME_UP BUTTON_UP
45#define MPEG_START_TIME_DOWN BUTTON_DOWN
46#define MPEG_START_TIME_LEFT2 BUTTON_VOL_UP
47#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
48#define MPEG_START_TIME_EXIT BUTTON_POWER
49
50#define MPEG_START_TIME_RC_SELECT (BUTTON_RC_PLAY | BUTTON_REL)
51#define MPEG_START_TIME_RC_LEFT BUTTON_RC_REW
52#define MPEG_START_TIME_RC_RIGHT BUTTON_RC_FF
53#define MPEG_START_TIME_RC_UP BUTTON_RC_VOL_UP
54#define MPEG_START_TIME_RC_DOWN BUTTON_RC_VOL_DOWN
55#define MPEG_START_TIME_RC_EXIT (BUTTON_RC_PLAY | BUTTON_REPEAT)
56
57#elif CONFIG_KEYPAD == GIGABEAT_S_PAD
58#define MPEG_START_TIME_SELECT BUTTON_SELECT
59#define MPEG_START_TIME_LEFT BUTTON_LEFT
60#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
61#define MPEG_START_TIME_UP BUTTON_UP
62#define MPEG_START_TIME_DOWN BUTTON_DOWN
63#define MPEG_START_TIME_LEFT2 BUTTON_VOL_UP
64#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
65#define MPEG_START_TIME_EXIT BUTTON_POWER
66
67#define MPEG_START_TIME_RC_SELECT (BUTTON_RC_PLAY | BUTTON_REL)
68#define MPEG_START_TIME_RC_LEFT BUTTON_RC_REW
69#define MPEG_START_TIME_RC_RIGHT BUTTON_RC_FF
70#define MPEG_START_TIME_RC_UP BUTTON_RC_VOL_UP
71#define MPEG_START_TIME_RC_DOWN BUTTON_RC_VOL_DOWN
72#define MPEG_START_TIME_RC_EXIT (BUTTON_RC_PLAY | BUTTON_REPEAT)
73
74#elif CONFIG_KEYPAD == IRIVER_H10_PAD
75#define MPEG_START_TIME_SELECT BUTTON_PLAY
76#define MPEG_START_TIME_LEFT BUTTON_LEFT
77#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
78#define MPEG_START_TIME_UP BUTTON_SCROLL_UP
79#define MPEG_START_TIME_DOWN BUTTON_SCROLL_DOWN
80#define MPEG_START_TIME_EXIT BUTTON_POWER
81
82#elif (CONFIG_KEYPAD == SANSA_E200_PAD)
83#define MPEG_START_TIME_SELECT BUTTON_SELECT
84#define MPEG_START_TIME_LEFT BUTTON_LEFT
85#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
86#define MPEG_START_TIME_UP BUTTON_UP
87#define MPEG_START_TIME_DOWN BUTTON_DOWN
88#define MPEG_START_TIME_LEFT2 BUTTON_SCROLL_BACK
89#define MPEG_START_TIME_RIGHT2 BUTTON_SCROLL_FWD
90#define MPEG_START_TIME_EXIT BUTTON_POWER
91
92#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
93#define MPEG_START_TIME_SELECT BUTTON_SELECT
94#define MPEG_START_TIME_LEFT BUTTON_LEFT
95#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
96#define MPEG_START_TIME_UP BUTTON_UP
97#define MPEG_START_TIME_DOWN BUTTON_DOWN
98#define MPEG_START_TIME_LEFT2 BUTTON_SCROLL_BACK
99#define MPEG_START_TIME_RIGHT2 BUTTON_SCROLL_FWD
100#define MPEG_START_TIME_EXIT (BUTTON_HOME|BUTTON_REPEAT)
101
102#elif (CONFIG_KEYPAD == SANSA_C200_PAD) || \
103(CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
104(CONFIG_KEYPAD == SANSA_M200_PAD)
105#define MPEG_START_TIME_SELECT BUTTON_SELECT
106#define MPEG_START_TIME_LEFT BUTTON_LEFT
107#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
108#define MPEG_START_TIME_UP BUTTON_UP
109#define MPEG_START_TIME_DOWN BUTTON_DOWN
110#define MPEG_START_TIME_LEFT2 BUTTON_VOL_UP
111#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
112#define MPEG_START_TIME_EXIT BUTTON_POWER
113
114#elif CONFIG_KEYPAD == MROBE500_PAD
115#define MPEG_START_TIME_SELECT BUTTON_RC_HEART
116#define MPEG_START_TIME_LEFT BUTTON_LEFT
117#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
118#define MPEG_START_TIME_UP BUTTON_RC_PLAY
119#define MPEG_START_TIME_DOWN BUTTON_RC_DOWN
120#define MPEG_START_TIME_LEFT2 BUTTON_RC_VOL_UP
121#define MPEG_START_TIME_RIGHT2 BUTTON_RC_VOL_DOWN
122#define MPEG_START_TIME_EXIT BUTTON_POWER
123
124#elif CONFIG_KEYPAD == MROBE100_PAD
125#define MPEG_START_TIME_SELECT BUTTON_SELECT
126#define MPEG_START_TIME_LEFT BUTTON_LEFT
127#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
128#define MPEG_START_TIME_UP BUTTON_UP
129#define MPEG_START_TIME_DOWN BUTTON_DOWN
130#define MPEG_START_TIME_LEFT2 BUTTON_PLAY
131#define MPEG_START_TIME_RIGHT2 BUTTON_MENU
132#define MPEG_START_TIME_EXIT BUTTON_POWER
133
134#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
135#define MPEG_START_TIME_SELECT BUTTON_RC_PLAY
136#define MPEG_START_TIME_LEFT BUTTON_RC_REW
137#define MPEG_START_TIME_RIGHT BUTTON_RC_FF
138#define MPEG_START_TIME_UP BUTTON_RC_VOL_UP
139#define MPEG_START_TIME_DOWN BUTTON_RC_VOL_DOWN
140#define MPEG_START_TIME_EXIT BUTTON_RC_REC
141
142#elif CONFIG_KEYPAD == COWON_D2_PAD
143#define MPEG_START_TIME_EXIT BUTTON_POWER
144
145#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
146#define MPEG_START_TIME_SELECT BUTTON_SELECT
147#define MPEG_START_TIME_LEFT BUTTON_LEFT
148#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
149#define MPEG_START_TIME_UP BUTTON_UP
150#define MPEG_START_TIME_DOWN BUTTON_DOWN
151#define MPEG_START_TIME_LEFT2 BUTTON_PLAY
152#define MPEG_START_TIME_RIGHT2 BUTTON_MENU
153#define MPEG_START_TIME_EXIT BUTTON_BACK
154
155#elif (CONFIG_KEYPAD == CREATIVE_ZENXFI3_PAD)
156#define MPEG_START_TIME_SELECT (BUTTON_PLAY|BUTTON_REL)
157#define MPEG_START_TIME_LEFT BUTTON_BACK
158#define MPEG_START_TIME_RIGHT BUTTON_MENU
159#define MPEG_START_TIME_UP BUTTON_UP
160#define MPEG_START_TIME_DOWN BUTTON_DOWN
161#define MPEG_START_TIME_EXIT (BUTTON_PLAY|BUTTON_REPEAT)
162
163#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
164#define MPEG_START_TIME_SELECT BUTTON_SELECT
165#define MPEG_START_TIME_LEFT BUTTON_LEFT
166#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
167#define MPEG_START_TIME_UP BUTTON_UP
168#define MPEG_START_TIME_DOWN BUTTON_DOWN
169#define MPEG_START_TIME_LEFT2 BUTTON_VOL_UP
170#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
171#define MPEG_START_TIME_EXIT BUTTON_POWER
172
173#elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
174#define MPEG_START_TIME_SELECT BUTTON_PLAY
175#define MPEG_START_TIME_LEFT BUTTON_LEFT
176#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
177#define MPEG_START_TIME_UP BUTTON_UP
178#define MPEG_START_TIME_DOWN BUTTON_DOWN
179#define MPEG_START_TIME_LEFT2 BUTTON_VOL_UP
180#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
181#define MPEG_START_TIME_EXIT BUTTON_POWER
182
183#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
184#define MPEG_START_TIME_SELECT BUTTON_PLAY
185#define MPEG_START_TIME_LEFT BUTTON_PREV
186#define MPEG_START_TIME_RIGHT BUTTON_NEXT
187#define MPEG_START_TIME_UP BUTTON_UP
188#define MPEG_START_TIME_DOWN BUTTON_DOWN
189#define MPEG_START_TIME_LEFT2 BUTTON_VOL_UP
190#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
191#define MPEG_START_TIME_EXIT BUTTON_POWER
192
193#elif CONFIG_KEYPAD == ONDAVX747_PAD
194#define MPEG_START_TIME_EXIT BUTTON_POWER
195
196#elif CONFIG_KEYPAD == ONDAVX777_PAD
197#define MPEG_START_TIME_EXIT BUTTON_POWER
198
199#elif (CONFIG_KEYPAD == SAMSUNG_YH820_PAD) || \
200 (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD)
201#define MPEG_START_TIME_SELECT BUTTON_PLAY
202#define MPEG_START_TIME_LEFT BUTTON_LEFT
203#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
204#define MPEG_START_TIME_UP BUTTON_UP
205#define MPEG_START_TIME_DOWN BUTTON_DOWN
206#define MPEG_START_TIME_EXIT BUTTON_REW
207
208#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
209#define MPEG_START_TIME_SELECT BUTTON_PLAY
210#define MPEG_START_TIME_LEFT BUTTON_PREV
211#define MPEG_START_TIME_RIGHT BUTTON_NEXT
212#define MPEG_START_TIME_UP BUTTON_UP
213#define MPEG_START_TIME_DOWN BUTTON_DOWN
214#define MPEG_START_TIME_LEFT2 BUTTON_OK
215#define MPEG_START_TIME_RIGHT2 BUTTON_CANCEL
216#define MPEG_START_TIME_EXIT BUTTON_REC
217
218#elif CONFIG_KEYPAD == MPIO_HD200_PAD
219#define MPEG_START_TIME_SELECT BUTTON_FUNC
220#define MPEG_START_TIME_LEFT BUTTON_REW
221#define MPEG_START_TIME_RIGHT BUTTON_FF
222#define MPEG_START_TIME_UP BUTTON_VOL_UP
223#define MPEG_START_TIME_DOWN BUTTON_VOL_DOWN
224#define MPEG_START_TIME_EXIT BUTTON_REC
225
226#elif CONFIG_KEYPAD == MPIO_HD300_PAD
227#define MPEG_START_TIME_SELECT BUTTON_ENTER
228#define MPEG_START_TIME_LEFT BUTTON_REW
229#define MPEG_START_TIME_RIGHT BUTTON_FF
230#define MPEG_START_TIME_UP BUTTON_UP
231#define MPEG_START_TIME_DOWN BUTTON_DOWN
232#define MPEG_START_TIME_EXIT BUTTON_REC
233
234#elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD
235#define MPEG_START_TIME_SELECT BUTTON_SELECT
236#define MPEG_START_TIME_LEFT BUTTON_LEFT
237#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
238#define MPEG_START_TIME_UP BUTTON_UP
239#define MPEG_START_TIME_DOWN BUTTON_DOWN
240#define MPEG_START_TIME_EXIT BUTTON_POWER
241
242#elif CONFIG_KEYPAD == SANSA_CONNECT_PAD
243#define MPEG_START_TIME_SELECT BUTTON_SELECT
244#define MPEG_START_TIME_LEFT BUTTON_LEFT
245#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
246#define MPEG_START_TIME_UP BUTTON_UP
247#define MPEG_START_TIME_DOWN BUTTON_DOWN
248#define MPEG_START_TIME_EXIT BUTTON_POWER
249
250#elif CONFIG_KEYPAD == SAMSUNG_YPR0_PAD
251#define MPEG_START_TIME_SELECT BUTTON_SELECT
252#define MPEG_START_TIME_LEFT BUTTON_LEFT
253#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
254#define MPEG_START_TIME_UP BUTTON_UP
255#define MPEG_START_TIME_DOWN BUTTON_DOWN
256#define MPEG_START_TIME_EXIT BUTTON_BACK
257
258#elif (CONFIG_KEYPAD == HM60X_PAD) || (CONFIG_KEYPAD == HM801_PAD)
259#define MPEG_START_TIME_SELECT BUTTON_SELECT
260#define MPEG_START_TIME_LEFT BUTTON_LEFT
261#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
262#define MPEG_START_TIME_UP BUTTON_UP
263#define MPEG_START_TIME_DOWN BUTTON_DOWN
264#define MPEG_START_TIME_EXIT BUTTON_POWER
265
266#elif CONFIG_KEYPAD == SONY_NWZ_PAD
267#define MPEG_START_TIME_SELECT BUTTON_PLAY
268#define MPEG_START_TIME_LEFT BUTTON_LEFT
269#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
270#define MPEG_START_TIME_UP BUTTON_UP
271#define MPEG_START_TIME_DOWN BUTTON_DOWN
272#define MPEG_START_TIME_EXIT BUTTON_BACK
273
274#elif CONFIG_KEYPAD == CREATIVE_ZEN_PAD
275#define MPEG_START_TIME_SELECT BUTTON_SELECT
276#define MPEG_START_TIME_LEFT BUTTON_LEFT
277#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
278#define MPEG_START_TIME_UP BUTTON_UP
279#define MPEG_START_TIME_DOWN BUTTON_DOWN
280#define MPEG_START_TIME_EXIT BUTTON_BACK
281
282#elif CONFIG_KEYPAD == DX50_PAD
283#define MPEG_START_TIME_EXIT BUTTON_POWER
284#define MPEG_START_TIME_SELECT BUTTON_PLAY
285#define MPEG_START_TIME_LEFT BUTTON_LEFT
286#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
287#define MPEG_START_TIME_UP BUTTON_VOL_UP
288#define MPEG_START_TIME_DOWN BUTTON_VOL_DOWN
289
290#elif CONFIG_KEYPAD == CREATIVE_ZENXFI2_PAD
291#define MPEG_START_TIME_EXIT BUTTON_POWER
292
293#elif CONFIG_KEYPAD == AGPTEK_ROCKER_PAD
294#define MPEG_START_TIME_SELECT BUTTON_SELECT
295#define MPEG_START_TIME_LEFT BUTTON_LEFT
296#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
297#define MPEG_START_TIME_UP BUTTON_UP
298#define MPEG_START_TIME_DOWN BUTTON_DOWN
299#define MPEG_START_TIME_EXIT BUTTON_POWER
300
301#elif CONFIG_KEYPAD == XDUOO_X3_PAD
302#define MPEG_START_TIME_SELECT BUTTON_PLAY
303#define MPEG_START_TIME_LEFT BUTTON_PREV
304#define MPEG_START_TIME_RIGHT BUTTON_NEXT
305#define MPEG_START_TIME_UP BUTTON_HOME
306#define MPEG_START_TIME_DOWN BUTTON_OPTION
307#define MPEG_START_TIME_LEFT2 BUTTON_VOL_UP
308#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
309#define MPEG_START_TIME_EXIT BUTTON_POWER
310
311#elif CONFIG_KEYPAD == XDUOO_X3II_PAD || CONFIG_KEYPAD == XDUOO_X20_PAD
312#define MPEG_START_TIME_SELECT BUTTON_PLAY
313#define MPEG_START_TIME_LEFT BUTTON_PREV
314#define MPEG_START_TIME_RIGHT BUTTON_NEXT
315#define MPEG_START_TIME_UP BUTTON_HOME
316#define MPEG_START_TIME_DOWN BUTTON_OPTION
317#define MPEG_START_TIME_LEFT2 BUTTON_VOL_UP
318#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
319#define MPEG_START_TIME_EXIT BUTTON_POWER
320
321#elif CONFIG_KEYPAD == FIIO_M3K_LINUX_PAD
322#define MPEG_START_TIME_SELECT BUTTON_PLAY
323#define MPEG_START_TIME_LEFT BUTTON_PREV
324#define MPEG_START_TIME_RIGHT BUTTON_NEXT
325#define MPEG_START_TIME_UP BUTTON_HOME
326#define MPEG_START_TIME_DOWN BUTTON_OPTION
327#define MPEG_START_TIME_LEFT2 BUTTON_VOL_UP
328#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
329#define MPEG_START_TIME_EXIT BUTTON_POWER
330
331#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
332#define MPEG_START_TIME_SELECT BUTTON_PLAY
333#define MPEG_START_TIME_LEFT BUTTON_HOME
334#define MPEG_START_TIME_RIGHT BUTTON_VOL_DOWN
335#define MPEG_START_TIME_UP BUTTON_PREV
336#define MPEG_START_TIME_DOWN BUTTON_NEXT
337#define MPEG_START_TIME_LEFT2 (BUTTON_POWER + BUTTON_HOME)
338#define MPEG_START_TIME_RIGHT2 (BUTTON_POWER + BUTTON_VOL_DOWN)
339#define MPEG_START_TIME_EXIT BUTTON_POWER
340
341#elif CONFIG_KEYPAD == EROSQ_PAD
342#define MPEG_START_TIME_SELECT BUTTON_PLAY
343#define MPEG_START_TIME_LEFT BUTTON_SCROLL_BACK
344#define MPEG_START_TIME_RIGHT BUTTON_SCROLL_FWD
345#define MPEG_START_TIME_UP BUTTON_PREV
346#define MPEG_START_TIME_DOWN BUTTON_NEXT
347#define MPEG_START_TIME_EXIT BUTTON_POWER
348
349#elif CONFIG_KEYPAD == FIIO_M3K_PAD
350#define MPEG_START_TIME_SELECT BUTTON_SELECT
351#define MPEG_START_TIME_LEFT BUTTON_LEFT
352#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
353#define MPEG_START_TIME_UP BUTTON_UP
354#define MPEG_START_TIME_DOWN BUTTON_DOWN
355#define MPEG_START_TIME_EXIT BUTTON_POWER
356
357#elif CONFIG_KEYPAD == SHANLING_Q1_PAD
358#define MPEG_START_TIME_EXIT BUTTON_POWER
359
360#else
361#error No keymap defined!
362#endif
363
364#ifdef HAVE_TOUCHSCREEN
365#ifndef MPEG_START_TIME_SELECT
366#define MPEG_START_TIME_SELECT BUTTON_CENTER
367#endif
368#ifndef MPEG_START_TIME_LEFT
369#define MPEG_START_TIME_LEFT BUTTON_MIDLEFT
370#endif
371#ifndef MPEG_START_TIME_RIGHT
372#define MPEG_START_TIME_RIGHT BUTTON_MIDRIGHT
373#endif
374#ifndef MPEG_START_TIME_UP
375#define MPEG_START_TIME_UP BUTTON_TOPMIDDLE
376#endif
377#ifndef MPEG_START_TIME_DOWN
378#define MPEG_START_TIME_DOWN BUTTON_BOTTOMMIDDLE
379#endif
380#ifndef MPEG_START_TIME_LEFT2
381#define MPEG_START_TIME_LEFT2 BUTTON_TOPRIGHT
382#endif
383#ifndef MPEG_START_TIME_RIGHT2
384#define MPEG_START_TIME_RIGHT2 BUTTON_TOPLEFT
385#endif
386#ifndef MPEG_START_TIME_EXIT
387#define MPEG_START_TIME_EXIT BUTTON_TOPLEFT
388#endif
389#endif
390
391static struct configdata config[] =
392{
393 {TYPE_INT, 0, 2, { .int_p = &settings.showfps }, "Show FPS", NULL},
394 {TYPE_INT, 0, 2, { .int_p = &settings.limitfps }, "Limit FPS", NULL},
395 {TYPE_INT, 0, 2, { .int_p = &settings.skipframes }, "Skip frames", NULL},
396 {TYPE_INT, 0, INT_MAX, { .int_p = &settings.resume_count }, "Resume count",
397 NULL},
398 {TYPE_INT, 0, MPEG_RESUME_NUM_OPTIONS,
399 { .int_p = &settings.resume_options }, "Resume options", NULL},
400#if MPEG_OPTION_DITHERING_ENABLED
401 {TYPE_INT, 0, INT_MAX, { .int_p = &settings.displayoptions },
402 "Display options", NULL},
403#endif
404 {TYPE_INT, 0, 2, { .int_p = &settings.tone_controls }, "Tone controls",
405 NULL},
406 {TYPE_INT, 0, 2, { .int_p = &settings.channel_modes }, "Channel modes",
407 NULL},
408 {TYPE_INT, 0, 2, { .int_p = &settings.crossfeed }, "Crossfeed", NULL},
409 {TYPE_INT, 0, 2, { .int_p = &settings.equalizer }, "Equalizer", NULL},
410 {TYPE_INT, 0, 2, { .int_p = &settings.dithering }, "Dithering", NULL},
411 {TYPE_INT, 0, 2, { .int_p = &settings.play_mode }, "Play mode", NULL},
412#ifdef HAVE_BACKLIGHT_BRIGHTNESS
413 {TYPE_INT, -1, INT_MAX, { .int_p = &settings.backlight_brightness },
414 "Backlight brightness", NULL},
415#endif
416};
417
418static const struct opt_items noyes[2] = {
419 { STR(LANG_SET_BOOL_NO) },
420 { STR(LANG_SET_BOOL_YES) },
421};
422
423static const struct opt_items singleall[2] = {
424 { STR(LANG_SINGLE) },
425 { STR(LANG_ALL) },
426};
427
428static const struct opt_items globaloff[2] = {
429 { STR(LANG_OFF) },
430 { STR(LANG_USE_SOUND_SETTING) },
431};
432
433static void mpeg_settings(void);
434static bool mpeg_set_option(const char* string,
435 void* variable,
436 enum optiontype type,
437 const struct opt_items* options,
438 int numoptions,
439 void (*function)(int))
440{
441 mpeg_sysevent_clear();
442
443 /* This eats SYS_POWEROFF - :\ */
444 bool usb = rb->set_option(string, variable, type, options, numoptions,
445 function);
446
447 if (usb)
448 mpeg_sysevent_set();
449
450 return usb;
451}
452
453#ifdef HAVE_BACKLIGHT_BRIGHTNESS /* Only used for this atm */
454static bool mpeg_set_int(const char *string, const char *unit,
455 int voice_unit, const int *variable,
456 void (*function)(int), int step,
457 int min,
458 int max,
459 const char* (*formatter)(char*, size_t, int, const char*),
460 int32_t (*get_talk_id)(int, int))
461{
462 mpeg_sysevent_clear();
463
464 bool usb = rb->set_int_ex(string, unit, voice_unit, variable, function,
465 step, min, max, formatter, get_talk_id);
466
467 if (usb)
468 mpeg_sysevent_set();
469
470 return usb;
471}
472
473static int32_t backlight_brightness_getlang(int value, int unit)
474{
475 if (value < 0)
476 return LANG_USE_COMMON_SETTING;
477
478 return TALK_ID(value + MIN_BRIGHTNESS_SETTING, unit);
479}
480
481void mpeg_backlight_update_brightness(int value)
482{
483 if (value >= 0)
484 {
485 value += MIN_BRIGHTNESS_SETTING;
486 backlight_brightness_set(value);
487 }
488 else
489 {
490 backlight_brightness_use_setting();
491 }
492}
493
494static void backlight_brightness_function(int value)
495{
496 mpeg_backlight_update_brightness(value);
497}
498
499static const char* backlight_brightness_formatter(char *buf, size_t length,
500 int value, const char *input)
501{
502 (void)input;
503
504 if (value < 0)
505 return rb->str(LANG_USE_COMMON_SETTING);
506 else
507 rb->snprintf(buf, length, "%d", value + MIN_BRIGHTNESS_SETTING);
508 return buf;
509}
510#endif /* HAVE_BACKLIGHT_BRIGHTNESS */
511
512/* Sync a particular audio setting to global or mpegplayer forced off */
513static void sync_audio_setting(int setting, bool global)
514{
515 switch (setting)
516 {
517 case MPEG_AUDIO_TONE_CONTROLS:
518 #ifdef AUDIOHW_HAVE_BASS
519 rb->sound_set(SOUND_BASS, (global || settings.tone_controls)
520 ? rb->global_settings->bass
521 : rb->sound_default(SOUND_BASS));
522 #endif
523 #ifdef AUDIOHW_HAVE_TREBLE
524 rb->sound_set(SOUND_TREBLE, (global || settings.tone_controls)
525 ? rb->global_settings->treble
526 : rb->sound_default(SOUND_TREBLE));
527 #endif
528
529 #ifdef AUDIOHW_HAVE_EQ
530 for (int band = 0;; band++)
531 {
532 int setting = rb->sound_enum_hw_eq_band_setting(band, AUDIOHW_EQ_GAIN);
533
534 if (setting == -1)
535 break;
536
537 rb->sound_set(setting, (global || settings.tone_controls)
538 ? rb->global_settings->hw_eq_bands[band].gain
539 : rb->sound_default(setting));
540 }
541 #endif /* AUDIOHW_HAVE_EQ */
542 break;
543
544 case MPEG_AUDIO_CHANNEL_MODES:
545 rb->sound_set(SOUND_CHANNELS, (global || settings.channel_modes)
546 ? rb->global_settings->channel_config
547 : SOUND_CHAN_STEREO);
548 break;
549
550 case MPEG_AUDIO_CROSSFEED:
551 rb->dsp_set_crossfeed_type((global || settings.crossfeed) ?
552 rb->global_settings->crossfeed :
553 CROSSFEED_TYPE_NONE);
554 break;
555
556 case MPEG_AUDIO_EQUALIZER:
557 rb->dsp_eq_enable((global || settings.equalizer) ?
558 rb->global_settings->eq_enabled : false);
559 break;
560
561 case MPEG_AUDIO_DITHERING:
562 rb->dsp_dither_enable((global || settings.dithering) ?
563 rb->global_settings->dithering_enabled : false);
564 break;
565 }
566}
567
568/* Sync all audio settings to global or mpegplayer forced off */
569static void sync_audio_settings(bool global)
570{
571 static const int setting_index[] =
572 {
573 MPEG_AUDIO_TONE_CONTROLS,
574 MPEG_AUDIO_CHANNEL_MODES,
575 MPEG_AUDIO_CROSSFEED,
576 MPEG_AUDIO_EQUALIZER,
577 MPEG_AUDIO_DITHERING,
578 };
579 unsigned i;
580
581 for (i = 0; i < ARRAYLEN(setting_index); i++)
582 {
583 sync_audio_setting(setting_index[i], global);
584 }
585}
586
587#ifndef HAVE_LCD_COLOR
588/* Cheapo splash implementation for the grey surface */
589static void grey_splash(int ticks, const unsigned char *fmt, ...)
590{
591 unsigned char buffer[256];
592 int x, y, w, h;
593 int oldfg, oldmode;
594
595 va_list ap;
596 va_start(ap, fmt);
597
598 rb->vsnprintf(buffer, sizeof (buffer), fmt, ap);
599
600 va_end(ap);
601
602 grey_getstringsize(buffer, &w, &h);
603
604 oldfg = grey_get_foreground();
605 oldmode = grey_get_drawmode();
606
607 grey_set_drawmode(DRMODE_FG);
608 grey_set_foreground(GREY_LIGHTGRAY);
609
610 x = (LCD_WIDTH - w) / 2;
611 y = (LCD_HEIGHT - h) / 2;
612
613 grey_fillrect(x - 1, y - 1, w + 2, h + 2);
614
615 grey_set_foreground(GREY_BLACK);
616
617 grey_putsxy(x, y, buffer);
618 grey_drawrect(x - 2, y - 2, w + 4, h + 4);
619
620 grey_set_foreground(oldfg);
621 grey_set_drawmode(oldmode);
622
623 grey_update();
624
625 if (ticks > 0)
626 rb->sleep(ticks);
627}
628#endif /* !HAVE_LCD_COLOR */
629
630static void show_loading(struct vo_rect *rc)
631{
632 int oldmode = mylcd_get_drawmode();
633 mylcd_set_drawmode(DRMODE_SOLID | DRMODE_INVERSEVID);
634 mylcd_fillrect(rc->l-1, rc->t-1, rc->r - rc->l + 2, rc->b - rc->t + 2);
635 mylcd_set_drawmode(oldmode);
636 mylcd_splash(0, "Loading...");
637}
638
639static void draw_slider(uint32_t range, uint32_t pos, struct vo_rect *rc)
640{
641 #define SLIDER_WIDTH (LCD_WIDTH-SLIDER_LMARGIN-SLIDER_RMARGIN)
642 #define SLIDER_X SLIDER_LMARGIN
643 #define SLIDER_Y (LCD_HEIGHT-SLIDER_HEIGHT-SLIDER_BMARGIN)
644 #define SLIDER_HEIGHT 8
645 #define SLIDER_TEXTMARGIN 1
646 #define SLIDER_LMARGIN 1
647 #define SLIDER_RMARGIN 1
648 #define SLIDER_TMARGIN 1
649 #define SLIDER_BMARGIN 1
650 #define SCREEN_MARGIN 1
651
652 struct hms hms;
653 char str[32];
654 int text_w, text_h, text_y;
655
656 /* Put positition on left */
657 ts_to_hms(pos, &hms);
658 hms_format(str, sizeof(str), &hms);
659 mylcd_getstringsize(str, NULL, &text_h);
660 text_y = SLIDER_Y - SLIDER_TEXTMARGIN - text_h;
661
662 if (rc == NULL)
663 {
664 int oldmode = mylcd_get_drawmode();
665 mylcd_set_drawmode(DRMODE_BG | DRMODE_INVERSEVID);
666 mylcd_fillrect(SLIDER_X, text_y, SLIDER_WIDTH,
667 LCD_HEIGHT - SLIDER_BMARGIN - text_y
668 - SLIDER_TMARGIN);
669 mylcd_set_drawmode(oldmode);
670
671 mylcd_putsxy(SLIDER_X, text_y, str);
672
673 /* Put duration on right */
674 ts_to_hms(range, &hms);
675 hms_format(str, sizeof(str), &hms);
676 mylcd_getstringsize(str, &text_w, NULL);
677
678 mylcd_putsxy(SLIDER_X + SLIDER_WIDTH - text_w, text_y, str);
679
680 /* Draw slider */
681 mylcd_drawrect(SLIDER_X, SLIDER_Y, SLIDER_WIDTH, SLIDER_HEIGHT);
682 mylcd_fillrect(SLIDER_X, SLIDER_Y,
683 muldiv_uint32(pos, SLIDER_WIDTH, range),
684 SLIDER_HEIGHT);
685
686 /* Update screen */
687 mylcd_update_rect(SLIDER_X, text_y - SLIDER_TMARGIN, SLIDER_WIDTH,
688 LCD_HEIGHT - SLIDER_BMARGIN - text_y + SLIDER_TEXTMARGIN);
689 }
690 else
691 {
692 /* Just return slider rectangle */
693 rc->l = SLIDER_X;
694 rc->t = text_y - SLIDER_TMARGIN;
695 rc->r = rc->l + SLIDER_WIDTH;
696 rc->b = rc->t + LCD_HEIGHT - SLIDER_BMARGIN - text_y;
697 }
698}
699
700static bool display_thumb_image(const struct vo_rect *rc)
701{
702 bool retval = true;
703 unsigned ltgray = MYLCD_LIGHTGRAY;
704 unsigned dkgray = MYLCD_DARKGRAY;
705
706 int oldcolor = mylcd_get_foreground();
707
708 if (!stream_display_thumb(rc))
709 {
710 /* Display "No Frame" and erase any border */
711 const char * const str = "No Frame";
712 int x, y, w, h;
713
714 mylcd_getstringsize(str, &w, &h);
715 x = (rc->r + rc->l - w) / 2;
716 y = (rc->b + rc->t - h) / 2;
717 mylcd_putsxy(x, y, str);
718
719 mylcd_update_rect(x, y, w, h);
720
721 ltgray = dkgray = mylcd_get_background();
722 retval = false;
723 }
724
725 /* Draw a raised border around the frame (or erase if no frame) */
726
727 mylcd_set_foreground(ltgray);
728
729 mylcd_hline(rc->l-1, rc->r-1, rc->t-1);
730 mylcd_vline(rc->l-1, rc->t, rc->b-1);
731
732 mylcd_set_foreground(dkgray);
733
734 mylcd_hline(rc->l-1, rc->r, rc->b);
735 mylcd_vline(rc->r, rc->t-1, rc->b);
736
737 mylcd_set_foreground(oldcolor);
738
739 mylcd_update_rect(rc->l-1, rc->t-1, rc->r - rc->l + 2, 1);
740 mylcd_update_rect(rc->l-1, rc->t, 1, rc->b - rc->t);
741 mylcd_update_rect(rc->l-1, rc->b, rc->r - rc->l + 2, 1);
742 mylcd_update_rect(rc->r, rc->t, 1, rc->b - rc->t);
743
744 return retval;
745}
746
747/* Add an amount to the specified time - with saturation */
748static uint32_t increment_time(uint32_t val, int32_t amount, uint32_t range)
749{
750 if (amount < 0)
751 {
752 uint32_t off = -amount;
753 if (range > off && val >= off)
754 val -= off;
755 else
756 val = 0;
757 }
758 else if (amount > 0)
759 {
760 uint32_t off = amount;
761 if (range > off && val <= range - off)
762 val += off;
763 else
764 val = range;
765 }
766
767 return val;
768}
769
770#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
771static void get_start_time_lcd_enable_hook(unsigned short id, void *param)
772{
773 (void)id;
774 (void)param;
775 rb->queue_post(rb->button_queue, LCD_ENABLE_EVENT_0, 0);
776}
777#endif /* HAVE_LCD_ENABLE */
778
779static int get_start_time(uint32_t duration)
780{
781 int button = 0;
782 int tmo = TIMEOUT_NOBLOCK;
783 uint32_t resume_time = settings.resume_time;
784 struct vo_rect rc_vid, rc_bound;
785 uint32_t aspect_vid, aspect_bound;
786 bool sliding = false;
787
788 enum state_enum slider_state = STATE0;
789
790 mylcd_clear_display();
791 mylcd_update();
792
793#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
794 rb->add_event(LCD_EVENT_ACTIVATION, get_start_time_lcd_enable_hook);
795#endif
796
797 draw_slider(0, 100, &rc_bound);
798 rc_bound.b = rc_bound.t - SLIDER_TMARGIN;
799 rc_bound.t = SCREEN_MARGIN;
800
801 DEBUGF("rc_bound: %d, %d, %d, %d\n", rc_bound.l, rc_bound.t,
802 rc_bound.r, rc_bound.b);
803
804 rc_vid.l = rc_vid.t = 0;
805 if (!stream_vo_get_size((struct vo_ext *)&rc_vid.r))
806 {
807 /* Can't get size - fill whole thing */
808 rc_vid.r = rc_bound.r - rc_bound.l;
809 rc_vid.b = rc_bound.b - rc_bound.t;
810 }
811
812 /* Get aspect ratio of bounding rectangle and video in u16.16 */
813 aspect_bound = ((rc_bound.r - rc_bound.l) << 16) /
814 (rc_bound.b - rc_bound.t);
815
816 DEBUGF("aspect_bound: %u.%02u\n", (unsigned)(aspect_bound >> 16),
817 (unsigned)(100*(aspect_bound & 0xffff) >> 16));
818
819 aspect_vid = (rc_vid.r << 16) / rc_vid.b;
820
821 DEBUGF("aspect_vid: %u.%02u\n", (unsigned)(aspect_vid >> 16),
822 (unsigned)(100*(aspect_vid & 0xffff) >> 16));
823
824 if (aspect_vid >= aspect_bound)
825 {
826 /* Video proportionally wider than or same as bounding rectangle */
827 if (rc_vid.r > rc_bound.r - rc_bound.l)
828 {
829 rc_vid.r = rc_bound.r - rc_bound.l;
830 rc_vid.b = (rc_vid.r << 16) / aspect_vid;
831 }
832 /* else already fits */
833 }
834 else
835 {
836 /* Video proportionally narrower than bounding rectangle */
837 if (rc_vid.b > rc_bound.b - rc_bound.t)
838 {
839 rc_vid.b = rc_bound.b - rc_bound.t;
840 rc_vid.r = (aspect_vid * rc_vid.b) >> 16;
841 }
842 /* else already fits */
843 }
844
845 /* Even width and height >= 2 */
846 rc_vid.r = (rc_vid.r < 2) ? 2 : (rc_vid.r & ~1);
847 rc_vid.b = (rc_vid.b < 2) ? 2 : (rc_vid.b & ~1);
848
849 /* Center display in bounding rectangle */
850 rc_vid.l = ((rc_bound.l + rc_bound.r) - rc_vid.r) / 2;
851 rc_vid.r += rc_vid.l;
852
853 rc_vid.t = ((rc_bound.t + rc_bound.b) - rc_vid.b) / 2;
854 rc_vid.b += rc_vid.t;
855
856 DEBUGF("rc_vid: %d, %d, %d, %d\n", rc_vid.l, rc_vid.t,
857 rc_vid.r, rc_vid.b);
858
859#ifndef HAVE_LCD_COLOR
860 stream_gray_show(true);
861#endif
862
863 while (slider_state < STATE9)
864 {
865 button = mpeg_button_get(tmo);
866
867 switch (button)
868 {
869 case BUTTON_NONE:
870 break;
871
872 /* Coarse (1 minute) control */
873 case MPEG_START_TIME_DOWN:
874 case MPEG_START_TIME_DOWN | BUTTON_REPEAT:
875#ifdef MPEG_START_TIME_RC_DOWN
876 case MPEG_START_TIME_RC_DOWN:
877 case MPEG_START_TIME_RC_DOWN | BUTTON_REPEAT:
878#endif
879 resume_time = increment_time(resume_time, -60*TS_SECOND, duration);
880 slider_state = STATE0;
881 break;
882
883 case MPEG_START_TIME_UP:
884 case MPEG_START_TIME_UP | BUTTON_REPEAT:
885#ifdef MPEG_START_TIME_RC_UP
886 case MPEG_START_TIME_RC_UP:
887 case MPEG_START_TIME_RC_UP | BUTTON_REPEAT:
888#endif
889 resume_time = increment_time(resume_time, 60*TS_SECOND, duration);
890 slider_state = STATE0;
891 break;
892
893 /* Fine (1 second) control */
894 case MPEG_START_TIME_LEFT:
895 case MPEG_START_TIME_LEFT | BUTTON_REPEAT:
896#ifdef MPEG_START_TIME_RC_LEFT
897 case MPEG_START_TIME_RC_LEFT:
898 case MPEG_START_TIME_RC_LEFT | BUTTON_REPEAT:
899#endif
900#ifdef MPEG_START_TIME_LEFT2
901 case MPEG_START_TIME_LEFT2:
902 case MPEG_START_TIME_LEFT2 | BUTTON_REPEAT:
903#endif
904 resume_time = increment_time(resume_time, -TS_SECOND, duration);
905 slider_state = STATE0;
906 break;
907
908 case MPEG_START_TIME_RIGHT:
909 case MPEG_START_TIME_RIGHT | BUTTON_REPEAT:
910#ifdef MPEG_START_TIME_RC_RIGHT
911 case MPEG_START_TIME_RC_RIGHT:
912 case MPEG_START_TIME_RC_RIGHT | BUTTON_REPEAT:
913#endif
914#ifdef MPEG_START_TIME_RIGHT2
915 case MPEG_START_TIME_RIGHT2:
916 case MPEG_START_TIME_RIGHT2 | BUTTON_REPEAT:
917#endif
918 resume_time = increment_time(resume_time, TS_SECOND, duration);
919 slider_state = STATE0;
920 break;
921
922 case MPEG_START_TIME_SELECT:
923#ifdef MPEG_START_TIME_RC_SELECT
924 case MPEG_START_TIME_RC_SELECT:
925#endif
926 settings.resume_time = resume_time;
927 button = MPEG_START_SEEK;
928 slider_state = STATE9;
929 break;
930
931 case MPEG_START_TIME_EXIT:
932#ifdef MPEG_START_TIME_RC_EXIT
933 case MPEG_START_TIME_RC_EXIT:
934#endif
935 button = MPEG_START_EXIT;
936 slider_state = STATE9;
937 break;
938
939 case ACTION_STD_CANCEL:
940 button = MPEG_START_QUIT;
941 slider_state = STATE9;
942 break;
943
944#ifdef HAVE_LCD_ENABLE
945 case LCD_ENABLE_EVENT_0:
946 if (slider_state == STATE2)
947 display_thumb_image(&rc_vid);
948 continue;
949#endif
950
951 default:
952 rb->default_event_handler(button);
953 rb->yield();
954 continue;
955 }
956
957 switch (slider_state)
958 {
959 case STATE0:
960 if (!sliding)
961 {
962 if (rb->global_settings->talk_menu)
963 {
964 rb->talk_disable(true);
965#ifdef PLUGIN_USE_IRAM
966 mpegplayer_iram_restore();
967#endif
968 }
969 trigger_cpu_boost();
970 sliding = true;
971 }
972 stream_seek(resume_time, SEEK_SET);
973 show_loading(&rc_bound);
974 draw_slider(duration, resume_time, NULL);
975 slider_state = STATE1;
976 tmo = THUMB_DELAY;
977 break;
978 case STATE1:
979 display_thumb_image(&rc_vid);
980 slider_state = STATE2;
981 tmo = TIMEOUT_BLOCK;
982 if (sliding)
983 {
984 cancel_cpu_boost();
985 if (rb->global_settings->talk_menu)
986 {
987#ifdef PLUGIN_USE_IRAM
988 mpegplayer_iram_preserve();
989#endif
990 rb->talk_disable(false);
991 talk_val(resume_time / TS_SECOND, UNIT_TIME, false);
992 talk_val(resume_time * 100 / duration, UNIT_PERCENT, true);
993 }
994 sliding = false;
995 }
996 default:
997 break;
998 }
999
1000 rb->yield();
1001 }
1002
1003#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
1004 rb->remove_event(LCD_EVENT_ACTIVATION, get_start_time_lcd_enable_hook);
1005#endif
1006#ifndef HAVE_LCD_COLOR
1007 stream_gray_show(false);
1008 grey_clear_display();
1009 grey_update();
1010#endif
1011
1012 cancel_cpu_boost();
1013
1014 return button;
1015}
1016
1017static int show_start_menu(uint32_t duration)
1018{
1019 int selected = 0;
1020 int result = 0;
1021 bool menu_quit = false;
1022
1023 MENUITEM_STRINGLIST(menu, "Mpegplayer Menu", mpeg_sysevent_callback,
1024 ID2P(LANG_RESTART_PLAYBACK),
1025 ID2P(LANG_RESUME_PLAYBACK),
1026 ID2P(LANG_SET_RESUME_TIME),
1027 ID2P(LANG_SETTINGS),
1028 ID2P(LANG_MENU_QUIT));
1029
1030 if (rb->global_settings->talk_menu)
1031 {
1032#ifdef PLUGIN_USE_IRAM
1033 mpegplayer_iram_preserve();
1034#endif
1035 rb->talk_disable(false);
1036 }
1037
1038 rb->button_clear_queue();
1039
1040 while (!menu_quit)
1041 {
1042 mpeg_sysevent_clear();
1043 result = rb->do_menu(&menu, &selected, NULL, false);
1044
1045 switch (result)
1046 {
1047 case MPEG_START_RESTART:
1048 settings.resume_time = 0;
1049 menu_quit = true;
1050 break;
1051
1052 case MPEG_START_RESUME:
1053 menu_quit = true;
1054 break;
1055
1056 case MPEG_START_SEEK:
1057 if (!stream_can_seek())
1058 {
1059 rb->splash(HZ, ID2P(LANG_UNAVAILABLE));
1060 break;
1061 }
1062
1063 result = get_start_time(duration);
1064
1065 if (result != MPEG_START_EXIT)
1066 menu_quit = true;
1067 break;
1068
1069 case MPEG_START_SETTINGS:
1070 mpeg_settings();
1071 break;
1072
1073 default:
1074 result = MPEG_START_QUIT;
1075 menu_quit = true;
1076 break;
1077 }
1078
1079 if (mpeg_sysevent() != 0)
1080 {
1081 result = MPEG_START_QUIT;
1082 menu_quit = true;
1083 }
1084 }
1085
1086 if (rb->global_settings->talk_menu)
1087 {
1088 rb->talk_disable(true);
1089#ifdef PLUGIN_USE_IRAM
1090 mpegplayer_iram_restore();
1091#endif
1092 }
1093
1094 return result;
1095}
1096
1097/* Return the desired resume action */
1098int mpeg_start_menu(uint32_t duration)
1099{
1100 mpeg_sysevent_clear();
1101
1102 switch (settings.resume_options)
1103 {
1104 case MPEG_RESUME_MENU_IF_INCOMPLETE:
1105 if (!stream_can_seek() || settings.resume_time == 0)
1106 {
1107 case MPEG_RESUME_RESTART:
1108 settings.resume_time = 0;
1109 return MPEG_START_RESTART;
1110 }
1111 default:
1112 case MPEG_RESUME_MENU_ALWAYS:
1113 return show_start_menu(duration);
1114 case MPEG_RESUME_ALWAYS:
1115 return MPEG_START_SEEK;
1116 }
1117}
1118
1119int mpeg_menu(void)
1120{
1121 int result;
1122
1123 MENUITEM_STRINGLIST(menu, "Mpegplayer Menu", mpeg_sysevent_callback,
1124 ID2P(LANG_SETTINGS),
1125 ID2P(LANG_RESUME_PLAYBACK),
1126 ID2P(LANG_MENU_QUIT));
1127
1128 if (rb->global_settings->talk_menu)
1129 {
1130#ifdef PLUGIN_USE_IRAM
1131 mpegplayer_iram_preserve();
1132#endif
1133 rb->talk_disable(false);
1134 }
1135
1136 rb->button_clear_queue();
1137
1138 mpeg_sysevent_clear();
1139
1140 result = rb->do_menu(&menu, NULL, NULL, false);
1141
1142 switch (result)
1143 {
1144 case MPEG_MENU_SETTINGS:
1145 mpeg_settings();
1146 break;
1147
1148 case MPEG_MENU_RESUME:
1149 break;
1150
1151 case MPEG_MENU_QUIT:
1152 break;
1153
1154 default:
1155 break;
1156 }
1157
1158 if (mpeg_sysevent() != 0)
1159 result = MPEG_MENU_QUIT;
1160
1161 if (rb->global_settings->talk_menu)
1162 {
1163 rb->talk_disable(true);
1164#ifdef PLUGIN_USE_IRAM
1165 mpegplayer_iram_restore();
1166#endif
1167 }
1168
1169 return result;
1170}
1171
1172static void display_options(void)
1173{
1174 int selected = 0;
1175 int result;
1176 bool menu_quit = false;
1177
1178 MENUITEM_STRINGLIST(menu, "Display Options", mpeg_sysevent_callback,
1179#if MPEG_OPTION_DITHERING_ENABLED
1180 ID2P(LANG_DITHERING),
1181#endif
1182 ID2P(LANG_DISPLAY_FPS),
1183 ID2P(LANG_LIMIT_FPS),
1184 ID2P(LANG_SKIP_FRAMES),
1185#ifdef HAVE_BACKLIGHT_BRIGHTNESS
1186 ID2P(LANG_BACKLIGHT_BRIGHTNESS),
1187#endif
1188 );
1189
1190 rb->button_clear_queue();
1191
1192 while (!menu_quit)
1193 {
1194 mpeg_sysevent_clear();
1195 result = rb->do_menu(&menu, &selected, NULL, false);
1196
1197 switch (result)
1198 {
1199#if MPEG_OPTION_DITHERING_ENABLED
1200 case MPEG_OPTION_DITHERING:
1201 result = (settings.displayoptions & LCD_YUV_DITHER) ? 1 : 0;
1202 mpeg_set_option(rb->str(LANG_DITHERING), &result, INT, noyes, 2, NULL);
1203 settings.displayoptions =
1204 (settings.displayoptions & ~LCD_YUV_DITHER)
1205 | ((result != 0) ? LCD_YUV_DITHER : 0);
1206 rb->lcd_yuv_set_options(settings.displayoptions);
1207 break;
1208#endif /* MPEG_OPTION_DITHERING_ENABLED */
1209
1210 case MPEG_OPTION_DISPLAY_FPS:
1211 mpeg_set_option(rb->str(LANG_DISPLAY_FPS), &settings.showfps, INT,
1212 noyes, 2, NULL);
1213 break;
1214
1215 case MPEG_OPTION_LIMIT_FPS:
1216 mpeg_set_option(rb->str(LANG_LIMIT_FPS), &settings.limitfps, INT,
1217 noyes, 2, NULL);
1218 break;
1219
1220 case MPEG_OPTION_SKIP_FRAMES:
1221 mpeg_set_option(rb->str(LANG_SKIP_FRAMES), &settings.skipframes, INT,
1222 noyes, 2, NULL);
1223 break;
1224
1225#ifdef HAVE_BACKLIGHT_BRIGHTNESS
1226 case MPEG_OPTION_BACKLIGHT_BRIGHTNESS:
1227 result = settings.backlight_brightness;
1228 mpeg_backlight_update_brightness(result);
1229 mpeg_set_int(rb->str(LANG_BACKLIGHT_BRIGHTNESS), NULL, UNIT_INT, &result,
1230 backlight_brightness_function, 1, -1,
1231 MAX_BRIGHTNESS_SETTING - MIN_BRIGHTNESS_SETTING,
1232 backlight_brightness_formatter,
1233 backlight_brightness_getlang);
1234 settings.backlight_brightness = result;
1235 mpeg_backlight_update_brightness(-1);
1236 break;
1237#endif /* HAVE_BACKLIGHT_BRIGHTNESS */
1238
1239 default:
1240 menu_quit = true;
1241 break;
1242 }
1243
1244 if (mpeg_sysevent() != 0)
1245 menu_quit = true;
1246 }
1247}
1248
1249static void audio_options(void)
1250{
1251 int selected = 0;
1252 int result;
1253 bool menu_quit = false;
1254
1255 MENUITEM_STRINGLIST(menu, "Audio Options", mpeg_sysevent_callback,
1256 ID2P(LANG_TONE_CONTROLS),
1257 ID2P(LANG_CHANNEL_CONFIGURATION),
1258 ID2P(LANG_CROSSFEED),
1259 ID2P(LANG_EQUALIZER),
1260 ID2P(LANG_DITHERING));
1261
1262 rb->button_clear_queue();
1263
1264 while (!menu_quit)
1265 {
1266 mpeg_sysevent_clear();
1267 result = rb->do_menu(&menu, &selected, NULL, false);
1268
1269 switch (result)
1270 {
1271 case MPEG_AUDIO_TONE_CONTROLS:
1272 mpeg_set_option(rb->str(LANG_TONE_CONTROLS), &settings.tone_controls, INT,
1273 globaloff, 2, NULL);
1274 sync_audio_setting(result, false);
1275 break;
1276
1277 case MPEG_AUDIO_CHANNEL_MODES:
1278 mpeg_set_option(rb->str(LANG_CHANNEL_CONFIGURATION), &settings.channel_modes,
1279 INT, globaloff, 2, NULL);
1280 sync_audio_setting(result, false);
1281 break;
1282
1283 case MPEG_AUDIO_CROSSFEED:
1284 mpeg_set_option(rb->str(LANG_CROSSFEED), &settings.crossfeed, INT,
1285 globaloff, 2, NULL);
1286 sync_audio_setting(result, false);
1287 break;
1288
1289 case MPEG_AUDIO_EQUALIZER:
1290 mpeg_set_option(rb->str(LANG_EQUALIZER), &settings.equalizer, INT,
1291 globaloff, 2, NULL);
1292 sync_audio_setting(result, false);
1293 break;
1294
1295 case MPEG_AUDIO_DITHERING:
1296 mpeg_set_option(rb->str(LANG_DITHERING), &settings.dithering, INT,
1297 globaloff, 2, NULL);
1298 sync_audio_setting(result, false);
1299 break;
1300
1301 default:
1302 menu_quit = true;
1303 break;
1304 }
1305
1306 if (mpeg_sysevent() != 0)
1307 menu_quit = true;
1308 }
1309}
1310
1311static void resume_options(void)
1312{
1313 static const struct opt_items items[MPEG_RESUME_NUM_OPTIONS] = {
1314 [MPEG_RESUME_MENU_ALWAYS] =
1315 { STR(LANG_FORCE_START_MENU) },
1316 [MPEG_RESUME_MENU_IF_INCOMPLETE] =
1317 { STR(LANG_CONDITIONAL_START_MENU) },
1318 [MPEG_RESUME_ALWAYS] =
1319 { STR(LANG_AUTO_RESUME) },
1320 [MPEG_RESUME_RESTART] =
1321 { STR(LANG_RESTART_PLAYBACK) },
1322 };
1323
1324 mpeg_set_option(rb->str(LANG_MENU_RESUME_OPTIONS), &settings.resume_options,
1325 INT, items, MPEG_RESUME_NUM_OPTIONS, NULL);
1326}
1327
1328static void clear_resume_count(void)
1329{
1330 settings.resume_count = 0;
1331 configfile_save(SETTINGS_FILENAME, config, ARRAYLEN(config),
1332 SETTINGS_VERSION);
1333}
1334
1335static void mpeg_settings(void)
1336{
1337 int selected = 0;
1338 int result;
1339 bool menu_quit = false;
1340
1341 MENUITEM_STRINGLIST(menu, "Settings", mpeg_sysevent_callback,
1342 ID2P(LANG_MENU_DISPLAY_OPTIONS),
1343 ID2P(LANG_MENU_AUDIO_OPTIONS),
1344 ID2P(LANG_MENU_RESUME_OPTIONS),
1345 ID2P(LANG_MENU_PLAY_MODE),
1346 ID2P(LANG_CLEAR_ALL_RESUMES));
1347
1348 rb->button_clear_queue();
1349
1350 while (!menu_quit)
1351 {
1352 mpeg_sysevent_clear();
1353
1354 result = rb->do_menu(&menu, &selected, NULL, false);
1355
1356 switch (result)
1357 {
1358 case MPEG_SETTING_DISPLAY_SETTINGS:
1359 display_options();
1360 break;
1361
1362 case MPEG_SETTING_AUDIO_SETTINGS:
1363 audio_options();
1364 break;
1365
1366 case MPEG_SETTING_ENABLE_START_MENU:
1367 resume_options();
1368 break;
1369
1370 case MPEG_SETTING_PLAY_MODE:
1371 mpeg_set_option(rb->str(LANG_MENU_PLAY_MODE), &settings.play_mode,
1372 INT, singleall, 2, NULL);
1373 break;
1374
1375 case MPEG_SETTING_CLEAR_RESUMES:
1376 clear_resume_count();
1377 break;
1378
1379 default:
1380 menu_quit = true;
1381 break;
1382 }
1383
1384 if (mpeg_sysevent() != 0)
1385 menu_quit = true;
1386 }
1387}
1388
1389void init_settings(const char* filename)
1390{
1391 /* Set the default settings */
1392 settings.showfps = 0; /* Do not show FPS */
1393 settings.limitfps = 1; /* Limit FPS */
1394 settings.skipframes = 1; /* Skip frames */
1395 settings.play_mode = 0; /* Play single video */
1396 settings.resume_options = MPEG_RESUME_MENU_ALWAYS; /* Enable start menu */
1397 settings.resume_count = 0;
1398#ifdef HAVE_BACKLIGHT_BRIGHTNESS
1399 settings.backlight_brightness = -1; /* Use default setting */
1400#endif
1401#if MPEG_OPTION_DITHERING_ENABLED
1402 settings.displayoptions = 0; /* No visual effects */
1403#endif
1404 settings.tone_controls = false;
1405 settings.channel_modes = false;
1406 settings.crossfeed = false;
1407 settings.equalizer = false;
1408 settings.dithering = false;
1409
1410 if (configfile_load(SETTINGS_FILENAME, config, ARRAYLEN(config),
1411 SETTINGS_MIN_VERSION) < 0)
1412 {
1413 /* Generate a new config file with default values */
1414 configfile_save(SETTINGS_FILENAME, config, ARRAYLEN(config),
1415 SETTINGS_VERSION);
1416 }
1417
1418 rb->strlcpy(settings.resume_filename, filename, MAX_PATH);
1419
1420 /* get the resume time for the current mpeg if it exists */
1421 if ((settings.resume_time = configfile_get_value
1422 (SETTINGS_FILENAME, filename)) < 0)
1423 {
1424 settings.resume_time = 0;
1425 }
1426
1427#if MPEG_OPTION_DITHERING_ENABLED
1428 rb->lcd_yuv_set_options(settings.displayoptions);
1429#endif
1430
1431 /* Set our audio options */
1432 sync_audio_settings(false);
1433}
1434
1435void save_settings(void)
1436{
1437 unsigned i;
1438 for (i = 0; i < ARRAYLEN(config); i++)
1439 {
1440 configfile_update_entry(SETTINGS_FILENAME, config[i].name,
1441 *(config[i].int_p));
1442 }
1443
1444 /* If this was a new resume entry then update the total resume count */
1445 if (configfile_update_entry(SETTINGS_FILENAME, settings.resume_filename,
1446 settings.resume_time) == 0)
1447 {
1448 configfile_update_entry(SETTINGS_FILENAME, "Resume count",
1449 ++settings.resume_count);
1450 }
1451
1452 /* Restore audio options */
1453 sync_audio_settings(true);
1454}