diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2022-10-13 11:04:12 -0400 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2022-10-13 11:08:11 -0400 |
commit | 9d3d925295112a0080bc1d70fad170db9e1af2a9 (patch) | |
tree | f6fb6244519a9430aa97b303e417fba53799b2f0 /apps/plugins/mpegplayer/mpeg_settings.c | |
parent | 418169aff8faf2cf90124cd95dba0af821cea73d (diff) | |
download | rockbox-9d3d925295112a0080bc1d70fad170db9e1af2a9.tar.gz rockbox-9d3d925295112a0080bc1d70fad170db9e1af2a9.zip |
Revert "RFC: Get rid of mpegplayer plugin"
This reverts commit d25d24812e8120c0eb133a412287ac030eb185c9.
Change-Id: I1563223e343fb1e2eda72a45823b38350025ff93
Diffstat (limited to 'apps/plugins/mpegplayer/mpeg_settings.c')
-rw-r--r-- | apps/plugins/mpegplayer/mpeg_settings.c | 1454 |
1 files changed, 1454 insertions, 0 deletions
diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c new file mode 100644 index 0000000000..c904de466d --- /dev/null +++ b/apps/plugins/mpegplayer/mpeg_settings.c | |||
@@ -0,0 +1,1454 @@ | |||
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 | |||
8 | struct 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 | |||
391 | static 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 | |||
418 | static const struct opt_items noyes[2] = { | ||
419 | { STR(LANG_SET_BOOL_NO) }, | ||
420 | { STR(LANG_SET_BOOL_YES) }, | ||
421 | }; | ||
422 | |||
423 | static const struct opt_items singleall[2] = { | ||
424 | { STR(LANG_SINGLE) }, | ||
425 | { STR(LANG_ALL) }, | ||
426 | }; | ||
427 | |||
428 | static const struct opt_items globaloff[2] = { | ||
429 | { STR(LANG_OFF) }, | ||
430 | { STR(LANG_USE_SOUND_SETTING) }, | ||
431 | }; | ||
432 | |||
433 | static void mpeg_settings(void); | ||
434 | static 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 */ | ||
454 | static 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 | |||
473 | static 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 | |||
481 | void 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 | |||
494 | static void backlight_brightness_function(int value) | ||
495 | { | ||
496 | mpeg_backlight_update_brightness(value); | ||
497 | } | ||
498 | |||
499 | static 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 */ | ||
513 | static 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 */ | ||
569 | static 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 */ | ||
589 | static 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 | |||
630 | static 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 | |||
639 | static 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 | |||
700 | static 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 */ | ||
748 | static 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) | ||
771 | static 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 | |||
779 | static 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 | |||
1017 | static 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 */ | ||
1098 | int 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 | |||
1119 | int 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 | |||
1172 | static 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 | |||
1249 | static 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 | |||
1311 | static 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 | |||
1328 | static void clear_resume_count(void) | ||
1329 | { | ||
1330 | settings.resume_count = 0; | ||
1331 | configfile_save(SETTINGS_FILENAME, config, ARRAYLEN(config), | ||
1332 | SETTINGS_VERSION); | ||
1333 | } | ||
1334 | |||
1335 | static 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 | |||
1389 | void 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 | |||
1435 | void 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 | } | ||