summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/fileop.c344
-rw-r--r--apps/fileop.h19
-rw-r--r--apps/lang/italiano.lang1091
-rw-r--r--apps/onplay.c245
-rw-r--r--apps/onplay.h2
-rw-r--r--bootloader/xduoox3.c19
-rw-r--r--docs/MAINTAINERS34
-rw-r--r--firmware/SOURCES2
-rw-r--r--firmware/export/config/xduoox3.h4
-rw-r--r--firmware/target/hosted/lcd-linuxfb.c24
-rw-r--r--firmware/target/mips/ingenic_jz47xx/app.lds8
-rw-r--r--firmware/target/mips/ingenic_jz47xx/crt0.S2
-rwxr-xr-xtools/configure5
-rwxr-xr-xtools/release/voices.pl13
-rwxr-xr-xtools/xduoox3-updatebl.sh5
15 files changed, 674 insertions, 1143 deletions
diff --git a/apps/fileop.c b/apps/fileop.c
index 0d2dc774b9..35bd9f2241 100644
--- a/apps/fileop.c
+++ b/apps/fileop.c
@@ -1,10 +1,10 @@
1/*************************************************************************** 1/***************************************************************************
2 * __________ __ ___. 2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/ 7 * \/ \/ \/ \/ \/
8 * $Id$ 8 * $Id$
9 * 9 *
10 * Copyright (C) 2002 Björn Stenberg 10 * Copyright (C) 2002 Björn Stenberg
@@ -50,6 +50,17 @@ struct file_op_params
50 size_t append; /* Append position in 'path' for stack push */ 50 size_t append; /* Append position in 'path' for stack push */
51}; 51};
52 52
53static int prompt_name(char* buf, size_t bufsz)
54{
55 if (kbd_input(buf, bufsz, NULL) < 0)
56 return FORC_CANCELLED;
57 /* at least prevent escapes out of the base directory from keyboard-
58 entered filenames; the file code should reject other invalidities */
59 if (*buf != '\0' && !strchr(buf, PATH_SEPCH) && !is_dotdir_name(buf))
60 return FORC_SUCCESS;
61 return FORC_UNKNOWN_FAILURE;
62}
63
53static bool poll_cancel_action(const char *path, int operation, int current, int total) 64static bool poll_cancel_action(const char *path, int operation, int current, int total)
54{ 65{
55 const char *op_str = ""; 66 const char *op_str = "";
@@ -75,7 +86,7 @@ static bool poll_cancel_action(const char *path, int operation, int current, int
75 return ACTION_STD_CANCEL == get_action(CONTEXT_STD, TIMEOUT_NOBLOCK); 86 return ACTION_STD_CANCEL == get_action(CONTEXT_STD, TIMEOUT_NOBLOCK);
76} 87}
77 88
78static struct file_op_params* init_file_op(struct file_op_params *param, 89static void init_file_op(struct file_op_params *param,
79 const char *basename, 90 const char *basename,
80 const char *selected_file) 91 const char *selected_file)
81{ 92{
@@ -90,8 +101,6 @@ static struct file_op_params* init_file_op(struct file_op_params *param,
90 param->is_dir = dir_exists(param->path); 101 param->is_dir = dir_exists(param->path);
91 param->objects = 0; /* how many files and subdirectories*/ 102 param->objects = 0; /* how many files and subdirectories*/
92 param->processed = 0; 103 param->processed = 0;
93
94 return param;
95} 104}
96 105
97/* counts file objects, deletes file objects */ 106/* counts file objects, deletes file objects */
@@ -144,7 +153,7 @@ static int directory_fileop(struct file_op_params *param, enum file_op_current f
144 153
145 if (info.attribute & ATTR_DIRECTORY) { 154 if (info.attribute & ATTR_DIRECTORY) {
146 /* remove a subdirectory */ 155 /* remove a subdirectory */
147 rc = directory_fileop(param, fileop); 156 rc = directory_fileop(param, fileop); /* recursion */
148 } else { 157 } else {
149 /* remove a file */ 158 /* remove a file */
150 if (poll_cancel_action(param->path, FOC_DELETE, param->processed, param->objects)) 159 if (poll_cancel_action(param->path, FOC_DELETE, param->processed, param->objects))
@@ -165,8 +174,8 @@ static int directory_fileop(struct file_op_params *param, enum file_op_current f
165 } 174 }
166 175
167 if (info.attribute & ATTR_DIRECTORY) { 176 if (info.attribute & ATTR_DIRECTORY) {
168 /* remove a subdirectory */ 177 /* enter subdirectory */
169 rc = directory_fileop(param, FOC_COUNT); 178 rc = directory_fileop(param, FOC_COUNT); /* recursion */
170 } else { 179 } else {
171 if (poll_cancel_action(param->path, FOC_COUNT, param->objects, 0)) 180 if (poll_cancel_action(param->path, FOC_COUNT, param->objects, 0))
172 { 181 {
@@ -195,150 +204,42 @@ static int directory_fileop(struct file_op_params *param, enum file_op_current f
195 return rc; 204 return rc;
196} 205}
197 206
207/* Walk a directory tree and count the number of objects (dirs & files)
208 * also check that enough resources exist to do an operation */
198static int check_count_fileobjects(struct file_op_params *param) 209static int check_count_fileobjects(struct file_op_params *param)
199{ 210{
211 cpu_boost(true);
200 int rc = directory_fileop(param, FOC_COUNT); 212 int rc = directory_fileop(param, FOC_COUNT);
213 cpu_boost(false);
201 DEBUGF("%s res:(%d) objects %d \n", __func__, rc, param->objects); 214 DEBUGF("%s res:(%d) objects %d \n", __func__, rc, param->objects);
202 return rc; 215 return rc;
203} 216}
204 217
205static bool check_new_name(const char *basename) 218/* Attempt to just rename a file or directory */
206{
207 /* at least prevent escapes out of the base directory from keyboard-
208 entered filenames; the file code should reject other invalidities */
209 return *basename != '\0' && !strchr(basename, PATH_SEPCH) &&
210 !is_dotdir_name(basename);
211}
212
213int create_dir(void)
214{
215 int rc = FORC_UNKNOWN_FAILURE;
216 char dirname[MAX_PATH];
217 size_t pathlen = path_append(dirname, getcwd(NULL, 0), PA_SEP_HARD,
218 sizeof (dirname));
219 char *basename = dirname + pathlen;
220
221 if (pathlen >= sizeof (dirname)) {
222 /* Too long */
223 } else if (kbd_input(basename, sizeof (dirname) - pathlen, NULL) < 0) {
224 rc = FORC_CANCELLED;
225 } else if (check_new_name(basename)) {
226 rc = mkdir(dirname);
227 }
228
229 return rc;
230}
231
232/************************************************************************************/
233/* share code for file and directory deletion, saves space */
234static int delete_file_dir(struct file_op_params *param)
235{
236 /* Note: delete_file_dir() will happily delete whatever
237 * path is passed (after confirmation) */
238 if (confirm_delete_yesno(param->path) != YESNO_YES) {
239 return FORC_CANCELLED;
240 }
241
242 clear_screen_buffer(true);
243 poll_cancel_action(param->path, FOC_DELETE, param->processed, param->objects);
244
245 int rc = FORC_UNKNOWN_FAILURE;
246
247 if (param->is_dir) { /* if directory */
248 cpu_boost(true);
249 rc = directory_fileop(param, FOC_DELETE);
250 cpu_boost(false);
251 } else {
252 rc = remove(param->path);
253 }
254
255 return rc;
256}
257
258int delete_fileobject(const char *selected_file)
259{
260 struct file_op_params param;
261 if (init_file_op(&param, selected_file, NULL)->is_dir == true)
262 {
263 int rc = check_count_fileobjects(&param);
264 DEBUGF("%s res: %d, ct: %d, %s", __func__, rc, param.objects, param.path);
265 if (rc != FORC_SUCCESS)
266 return rc;
267 }
268
269 return delete_file_dir(&param);
270}
271
272int rename_file(const char *selected_file)
273{
274 int rc = FORC_UNKNOWN_FAILURE;
275 char newname[MAX_PATH];
276 const char *oldbase, *selection = selected_file;
277
278 path_basename(selection, &oldbase);
279 size_t pathlen = oldbase - selection;
280 char *newbase = newname + pathlen;
281
282 if (strmemccpy(newname, selection, sizeof (newname)) == NULL) {
283 /* Too long */
284 } else if (kbd_input(newbase, sizeof (newname) - pathlen, NULL) < 0) {
285 rc = FORC_CANCELLED;
286 } else if (!strcmp(oldbase, newbase)) {
287 rc = FORC_NOOP; /* No change at all */
288 } else if (check_new_name(newbase)) {
289 switch (relate(selection, newname))
290 {
291 case RELATE_DIFFERENT:
292 if (file_exists(newname)) {
293 break; /* don't overwrite */
294 }
295 /* Fall-through */
296 case RELATE_SAME:
297 rc = rename(selection, newname);
298 break;
299 case RELATE_PREFIX:
300 default:
301 break;
302 }
303 }
304
305 return rc;
306}
307
308static int move_by_rename(const char *src_path, 219static int move_by_rename(const char *src_path,
309 const char *dst_path, 220 const char *dst_path,
310 unsigned int *pflags) 221 unsigned int *pflags)
311{ 222{
312 unsigned int flags = *pflags; 223 unsigned int flags = *pflags;
313 int rc = FORC_UNKNOWN_FAILURE; 224 int rc = FORC_UNKNOWN_FAILURE;
314 while (!(flags & (PASTE_COPY | PASTE_EXDEV))) { 225 if (!(flags & (PASTE_COPY | PASTE_EXDEV))) {
315 if ((flags & PASTE_OVERWRITE) || !file_exists(dst_path)) { 226 if ((flags & PASTE_OVERWRITE) || !file_exists(dst_path)) {
316 /* Just try to move the directory / file */ 227 /* Just try to move the directory / file */
317 if (poll_cancel_action(src_path, FOC_MOVE, 0 , 0)) { 228 if (poll_cancel_action(src_path, FOC_MOVE, 0 , 0)) {
318 rc = FORC_CANCELLED; 229 rc = FORC_CANCELLED;
319 } else { 230 } else {
320 rc = rename(src_path, dst_path); 231 rc = rename(src_path, dst_path);
321 } 232#ifdef HAVE_MULTIVOLUME
322 233 if (rc < FORC_SUCCESS && errno == EXDEV) {
323 if (rc < 0) { 234 /* Failed because cross volume rename doesn't work */
324 int errnum = errno; 235 *pflags |= PASTE_EXDEV; /* force a move instead */
325 if (errnum == ENOTEMPTY && (flags & PASTE_OVERWRITE)) {
326 /* Directory is not empty thus rename() will not do a quick
327 overwrite */
328 break;
329 } 236 }
330 #ifdef HAVE_MULTIVOLUME 237#endif /* HAVE_MULTIVOLUME */
331 else if (errnum == EXDEV) { 238 /* if (errno == ENOTEMPTY && (flags & PASTE_OVERWRITE)) {
332 /* Failed because cross volume rename doesn't work; force 239 * Directory is not empty thus rename() will not do a quick overwrite */
333 a move instead */
334 *pflags |= PASTE_EXDEV;
335 break;
336 }
337 #endif /* HAVE_MULTIVOLUME */
338 } 240 }
339 } 241 }
340 242
341 break;
342 } 243 }
343 return rc; 244 return rc;
344} 245}
@@ -365,8 +266,7 @@ static int copy_move_file(const char *src_path, const char *dst_path, unsigned i
365 return FORC_NO_BUFFER_AVAIL; 266 return FORC_NO_BUFFER_AVAIL;
366 } 267 }
367 268
368 buffersize &= ~0x1ff; /* Round buffer size to multiple of sector 269 buffersize &= ~0x1ff; /* Round buffer size to multiple of sector size */
369 size */
370 270
371 int src_fd = open(src_path, O_RDONLY); 271 int src_fd = open(src_path, O_RDONLY);
372 if (src_fd >= 0) { 272 if (src_fd >= 0) {
@@ -423,9 +323,12 @@ static int copy_move_file(const char *src_path, const char *dst_path, unsigned i
423 } 323 }
424 324
425 if (rc == FORC_SUCCESS) { 325 if (rc == FORC_SUCCESS) {
426 /* If overwriting, set the correct length if original was 326 if (total_size != src_sz)
427 longer */ 327 rc = FORC_UNKNOWN_FAILURE;
428 rc = ftruncate(dst_fd, total_size) * 10; 328 else {
329 /* If overwriting, set the correct length if original was longer */
330 rc = ftruncate(dst_fd, total_size) * 10;
331 }
429 } 332 }
430 333
431 close(dst_fd); 334 close(dst_fd);
@@ -449,20 +352,19 @@ static int copy_move_file(const char *src_path, const char *dst_path, unsigned i
449 352
450/* Paste a directory */ 353/* Paste a directory */
451static int copy_move_directory(struct file_op_params *src, 354static int copy_move_directory(struct file_op_params *src,
452 struct file_op_params *dst, 355 struct file_op_params *dst,
453 unsigned int flags) 356 unsigned int flags)
454{ 357{
455 int rc = FORC_UNKNOWN_FAILURE;
456
457 DIR *srcdir = opendir(src->path); 358 DIR *srcdir = opendir(src->path);
458 359
459 if (srcdir) { 360 if (!srcdir)
460 /* Make a directory to copy things to */ 361 return FORC_PATH_NOT_EXIST;
461 rc = mkdir(dst->path) * 10; 362
462 if (rc < 0 && errno == EEXIST && (flags & PASTE_OVERWRITE)) { 363 /* Make a directory to copy things to */
463 /* Exists and overwrite was approved */ 364 int rc = mkdir(dst->path) * 10;
464 rc = FORC_SUCCESS; 365 if (rc < 0 && errno == EEXIST && (flags & PASTE_OVERWRITE)) {
465 } 366 /* Exists and overwrite was approved */
367 rc = FORC_SUCCESS;
466 } 368 }
467 369
468 size_t srcap = src->append, dstap = dst->append; 370 size_t srcap = src->append, dstap = dst->append;
@@ -488,7 +390,7 @@ static int copy_move_directory(struct file_op_params *src,
488 /* Append names to current directories */ 390 /* Append names to current directories */
489 src->append = srcap + 391 src->append = srcap +
490 path_append(&src->path[srcap], PA_SEP_HARD, entry->d_name, 392 path_append(&src->path[srcap], PA_SEP_HARD, entry->d_name,
491 sizeof(src->path) - srcap); 393 sizeof (src->path) - srcap);
492 394
493 dst->append = dstap + 395 dst->append = dstap +
494 path_append(&dst->path[dstap], PA_SEP_HARD, entry->d_name, 396 path_append(&dst->path[dstap], PA_SEP_HARD, entry->d_name,
@@ -538,13 +440,16 @@ static int copy_move_directory(struct file_op_params *src,
538 return rc; 440 return rc;
539} 441}
540 442
443/************************************************************************************/
444/* PUBLIC FUNCTIONS */
445/************************************************************************************/
446
447/* Copy or move a file or directory see: file_op_flags */
541int copy_move_fileobject(const char *src_path, const char *dst_path, unsigned int flags) 448int copy_move_fileobject(const char *src_path, const char *dst_path, unsigned int flags)
542{ 449{
543 if (!src_path[0]) 450 if (!src_path[0])
544 return FORC_NOOP; 451 return FORC_NOOP;
545 452
546 int rc = FORC_UNKNOWN_FAILURE;
547
548 struct file_op_params src, dst; 453 struct file_op_params src, dst;
549 454
550 /* Figure out the name of the selection */ 455 /* Figure out the name of the selection */
@@ -553,40 +458,37 @@ int copy_move_fileobject(const char *src_path, const char *dst_path, unsigned in
553 458
554 /* Final target is current directory plus name of selection */ 459 /* Final target is current directory plus name of selection */
555 init_file_op(&dst, dst_path, nameptr); 460 init_file_op(&dst, dst_path, nameptr);
461 if (dst.append >= sizeof (dst.path))
462 return FORC_PATH_TOO_LONG;
556 463
557 switch (dst.append < sizeof (dst.path) ? 464 int rel = relate(src_path, dst.path);
558 relate(src_path, dst.path) : FORC_PATH_TOO_LONG) 465 if (rel == RELATE_SAME)
559 { 466 return FORC_NOOP;
560 case RELATE_SAME:
561 rc = FORC_NOOP;
562 break;
563 467
564 case RELATE_DIFFERENT: 468 if (rel == RELATE_DIFFERENT) {
469 int rc;
565 if (file_exists(dst.path)) { 470 if (file_exists(dst.path)) {
566 /* If user chooses not to overwrite, cancel */ 471 /* If user chooses not to overwrite, cancel */
567 if (confirm_overwrite_yesno() == YESNO_NO) { 472 if (confirm_overwrite_yesno() == YESNO_NO) {
568 rc = FORC_NOOVERWRT; 473 return FORC_NOOVERWRT;
569 break;
570 } 474 }
571 475
572 flags |= PASTE_OVERWRITE; 476 flags |= PASTE_OVERWRITE;
573 } 477 }
574 478
479 init_file_op(&src, src_path, NULL);
480 if (src.append >= sizeof (src.path))
481 return FORC_PATH_TOO_LONG;
575 /* Now figure out what we're doing */ 482 /* Now figure out what we're doing */
576 cpu_boost(true); 483 cpu_boost(true);
577
578 init_file_op(&src, src_path, NULL);
579
580 if (src.is_dir) { 484 if (src.is_dir) {
581 /* Copy or move a subdirectory */ 485 /* Copy or move a subdirectory */
582 486 /* Try renaming first */
583 if (src.append < sizeof (src.path)) { 487 rc = move_by_rename(src.path, dst.path, &flags);
584 /* Try renaming first */ 488 if (rc < FORC_SUCCESS) {
585 rc = move_by_rename(src.path, dst.path, &flags); 489 rc = check_count_fileobjects(&src);
586 if (rc != FORC_SUCCESS && rc != FORC_CANCELLED) { 490 if (rc == FORC_SUCCESS) {
587 if (check_count_fileobjects(&src) == FORC_SUCCESS) { 491 rc = copy_move_directory(&src, &dst, flags);
588 rc = copy_move_directory(&src, &dst, flags);
589 }
590 } 492 }
591 } 493 }
592 } else { 494 } else {
@@ -595,12 +497,102 @@ int copy_move_fileobject(const char *src_path, const char *dst_path, unsigned in
595 } 497 }
596 498
597 cpu_boost(false); 499 cpu_boost(false);
598 break; 500 DEBUGF("%s res: %d, ct: %d/%d %s\n",
501 __func__, rc, src.objects, src.processed, src.path);
502 return rc;
503 }
504
505 /* Else Some other relation / failure */
506 DEBUGF("%s res: %d, rel: %d\n", __func__, FORC_UNKNOWN_FAILURE, rel);
507 return FORC_UNKNOWN_FAILURE;
508}
509
510int create_dir(void)
511{
512 int rc;
513 char dirname[MAX_PATH];
514 size_t pathlen = path_append(dirname, getcwd(NULL, 0), PA_SEP_HARD,
515 sizeof (dirname));
516 char *basename = dirname + pathlen;
517
518 if (pathlen >= sizeof (dirname))
519 return FORC_PATH_TOO_LONG;
520
521 rc = prompt_name(basename, sizeof (dirname) - pathlen);
522 if (rc == FORC_SUCCESS)
523 rc = mkdir(dirname) * 10;
524 return rc;
525}
599 526
600 case RELATE_PREFIX: 527/* share code for file and directory deletion, saves space */
601 default: /* Some other relation / failure */ 528int delete_fileobject(const char *selected_file)
602 break; 529{
530 int rc;
531 struct file_op_params param;
532 init_file_op(&param, selected_file, NULL);
533 if (param.append >= sizeof (param.path))
534 return FORC_PATH_TOO_LONG;
535
536 if (param.is_dir) {
537 int rc = check_count_fileobjects(&param);
538 DEBUGF("%s res: %d, ct: %d, %s", __func__, rc, param.objects, param.path);
539 if (rc != FORC_SUCCESS)
540 return rc;
541 }
542
543 /* Note: delete_fileobject() will happily delete whatever
544 * path is passed (after confirmation) */
545 if (confirm_delete_yesno(param.path) != YESNO_YES) {
546 return FORC_CANCELLED;
547 }
548
549 clear_screen_buffer(true);
550 if (poll_cancel_action(param.path, FOC_DELETE, param.processed, param.objects))
551 return FORC_CANCELLED;
552
553 if (param.is_dir) { /* if directory */
554 cpu_boost(true);
555 rc = directory_fileop(&param, FOC_DELETE);
556 cpu_boost(false);
557 } else {
558 rc = remove(param.path) * 10;
603 } 559 }
604 560
605 return rc; 561 return rc;
606} 562}
563
564int rename_file(const char *selected_file)
565{
566 int rc;
567 char newname[MAX_PATH];
568 const char *oldbase, *selection = selected_file;
569
570 path_basename(selection, &oldbase);
571 size_t pathlen = oldbase - selection;
572 char *newbase = newname + pathlen;
573
574 if (strmemccpy(newname, selection, sizeof (newname)) == NULL)
575 return FORC_PATH_TOO_LONG;
576
577 rc = prompt_name(newbase, sizeof (newname) - pathlen);
578
579 if (rc != FORC_SUCCESS)
580 return rc;
581
582 if (!strcmp(oldbase, newbase))
583 return FORC_NOOP; /* No change at all */
584
585 int rel = relate(selection, newname);
586 if (rel == RELATE_DIFFERENT)
587 {
588 if (file_exists(newname)) { /* don't overwrite */
589 return FORC_PATH_EXISTS;
590 }
591 return rename(selection, newname) * 10;
592 }
593 if (rel == RELATE_SAME)
594 return rename(selection, newname) * 10;
595
596 /* Else Some other relation / failure */
597 return FORC_UNKNOWN_FAILURE;
598}
diff --git a/apps/fileop.h b/apps/fileop.h
index f8237dc64f..f477549977 100644
--- a/apps/fileop.h
+++ b/apps/fileop.h
@@ -1,10 +1,10 @@
1/*************************************************************************** 1/***************************************************************************
2 * __________ __ ___. 2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/ 7 * \/ \/ \/ \/ \/
8 * $Id$ 8 * $Id$
9 * 9 *
10 * Copyright (C) 2002 Björn Stenberg 10 * Copyright (C) 2002 Björn Stenberg
@@ -26,6 +26,7 @@
26/* result codes of various file operations */ 26/* result codes of various file operations */
27enum fileop_result_code 27enum fileop_result_code
28{ 28{
29 FORC_PATH_EXISTS = -8,
29 FORC_READ_FAILURE = -7, 30 FORC_READ_FAILURE = -7,
30 FORC_WRITE_FAILURE = -6, 31 FORC_WRITE_FAILURE = -6,
31 FORC_NO_BUFFER_AVAIL = -5, 32 FORC_NO_BUFFER_AVAIL = -5,
@@ -55,7 +56,6 @@ enum file_op_current
55 FOC_MOVE, 56 FOC_MOVE,
56 FOC_COPY, 57 FOC_COPY,
57 FOC_DELETE, 58 FOC_DELETE,
58 FOC_CREATE,
59}; 59};
60 60
61int create_dir(void); 61int create_dir(void);
@@ -64,7 +64,8 @@ int rename_file(const char *selected_file);
64 64
65int delete_fileobject(const char *selected_file); 65int delete_fileobject(const char *selected_file);
66 66
67int copy_move_fileobject(const char *src_path, const char *dst_path, 67int copy_move_fileobject(const char *src_path,
68 unsigned int flags); 68 const char *dst_path,
69 unsigned int flags);
69 70
70#endif /* FILEOP_H */ 71#endif /* FILEOP_H */
diff --git a/apps/lang/italiano.lang b/apps/lang/italiano.lang
index 946850750f..a7d1eaa9a7 100644
--- a/apps/lang/italiano.lang
+++ b/apps/lang/italiano.lang
@@ -40,10 +40,10 @@
40 *: "No" 40 *: "No"
41 </source> 41 </source>
42 <dest> 42 <dest>
43 *: "No" 43 *: "~No"
44 </dest> 44 </dest>
45 <voice> 45 <voice>
46 *: "No" 46 *: "~No"
47 </voice> 47 </voice>
48</phrase> 48</phrase>
49<phrase> 49<phrase>
@@ -330,10 +330,10 @@
330 *: "Database" 330 *: "Database"
331 </source> 331 </source>
332 <dest> 332 <dest>
333 *: "Database" 333 *: "~Database"
334 </dest> 334 </dest>
335 <voice> 335 <voice>
336 *: "Database" 336 *: "~Database"
337 </voice> 337 </voice>
338</phrase> 338</phrase>
339<phrase> 339<phrase>
@@ -539,20 +539,6 @@
539 </voice> 539 </voice>
540</phrase> 540</phrase>
541<phrase> 541<phrase>
542 id: LANG_BOOKMARK_CONTEXT_DELETE
543 desc: bookmark context menu, delete this bookmark
544 user: core
545 <source>
546 *: "Delete"
547 </source>
548 <dest>
549 *: "Cancella"
550 </dest>
551 <voice>
552 *: "Cancella"
553 </voice>
554</phrase>
555<phrase>
556 id: LANG_AUTO_BOOKMARK_QUERY 542 id: LANG_AUTO_BOOKMARK_QUERY
557 desc: prompt for user to decide to create an bookmark 543 desc: prompt for user to decide to create an bookmark
558 user: core 544 user: core
@@ -630,10 +616,10 @@
630 *: "Volume" 616 *: "Volume"
631 </source> 617 </source>
632 <dest> 618 <dest>
633 *: "Volume" 619 *: "~Volume"
634 </dest> 620 </dest>
635 <voice> 621 <voice>
636 *: "Volume" 622 *: "~Volume"
637 </voice> 623 </voice>
638</phrase> 624</phrase>
639<phrase> 625<phrase>
@@ -694,30 +680,30 @@
694</phrase> 680</phrase>
695<phrase> 681<phrase>
696 id: LANG_CHANNEL_STEREO 682 id: LANG_CHANNEL_STEREO
697 desc: in sound_settings 683 desc: in sound_settings and radio screen
698 user: core 684 user: core
699 <source> 685 <source>
700 *: "Stereo" 686 *: "Stereo"
701 </source> 687 </source>
702 <dest> 688 <dest>
703 *: "Stereo" 689 *: "~Stereo"
704 </dest> 690 </dest>
705 <voice> 691 <voice>
706 *: "Stereo" 692 *: "~Stereo"
707 </voice> 693 </voice>
708</phrase> 694</phrase>
709<phrase> 695<phrase>
710 id: LANG_CHANNEL_MONO 696 id: LANG_CHANNEL_MONO
711 desc: in sound_settings 697 desc: in sound_settings and radio screen
712 user: core 698 user: core
713 <source> 699 <source>
714 *: "Mono" 700 *: "Mono"
715 </source> 701 </source>
716 <dest> 702 <dest>
717 *: "Mono" 703 *: "~Mono"
718 </dest> 704 </dest>
719 <voice> 705 <voice>
720 *: "Mono" 706 *: "~Mono"
721 </voice> 707 </voice>
722</phrase> 708</phrase>
723<phrase> 709<phrase>
@@ -787,10 +773,10 @@
787 *: "Karaoke" 773 *: "Karaoke"
788 </source> 774 </source>
789 <dest> 775 <dest>
790 *: "Karaoke" 776 *: "~Karaoke"
791 </dest> 777 </dest>
792 <voice> 778 <voice>
793 *: "Karaoke" 779 *: "~Karaoke"
794 </voice> 780 </voice>
795</phrase> 781</phrase>
796<phrase> 782<phrase>
@@ -815,7 +801,7 @@
815 *: "Crossfeed" 801 *: "Crossfeed"
816 </source> 802 </source>
817 <dest> 803 <dest>
818 *: "Crossfeed" 804 *: "~Crossfeed"
819 </dest> 805 </dest>
820 <voice> 806 <voice>
821 *: "Crossfid" 807 *: "Crossfid"
@@ -990,20 +976,6 @@
990 </voice> 976 </voice>
991</phrase> 977</phrase>
992<phrase> 978<phrase>
993 id: LANG_EQUALIZER_EDIT_MODE
994 desc: in the equalizer settings menu
995 user: core
996 <source>
997 *: "Edit mode: %s"
998 </source>
999 <dest>
1000 *: "Modo editing: %s"
1001 </dest>
1002 <voice>
1003 *: ""
1004 </voice>
1005</phrase>
1006<phrase>
1007 id: LANG_EQUALIZER_GAIN_ITEM 979 id: LANG_EQUALIZER_GAIN_ITEM
1008 desc: in the equalizer settings menu 980 desc: in the equalizer settings menu
1009 user: core 981 user: core
@@ -1109,10 +1081,10 @@
1109 *: "Dithering" 1081 *: "Dithering"
1110 </source> 1082 </source>
1111 <dest> 1083 <dest>
1112 *: "Dithering" 1084 *: "~Dithering"
1113 </dest> 1085 </dest>
1114 <voice> 1086 <voice>
1115 *: "Dithering" 1087 *: "~Dithering"
1116 </voice> 1088 </voice>
1117</phrase> 1089</phrase>
1118<phrase> 1090<phrase>
@@ -1324,11 +1296,11 @@
1324 </source> 1296 </source>
1325 <dest> 1297 <dest>
1326 *: none 1298 *: none
1327 crossfade: "Crossfade" 1299 crossfade: "~Crossfade"
1328 </dest> 1300 </dest>
1329 <voice> 1301 <voice>
1330 *: none 1302 *: none
1331 crossfade: "Crossfade" 1303 crossfade: "~Crossfade"
1332 </voice> 1304 </voice>
1333</phrase> 1305</phrase>
1334<phrase> 1306<phrase>
@@ -1477,11 +1449,11 @@
1477 </source> 1449 </source>
1478 <dest> 1450 <dest>
1479 *: none 1451 *: none
1480 crossfade: "Mix" 1452 crossfade: "~Mix"
1481 </dest> 1453 </dest>
1482 <voice> 1454 <voice>
1483 *: none 1455 *: none
1484 crossfade: "Mix" 1456 crossfade: "~Mix"
1485 </voice> 1457 </voice>
1486</phrase> 1458</phrase>
1487<phrase> 1459<phrase>
@@ -1492,10 +1464,10 @@
1492 *: "Replaygain" 1464 *: "Replaygain"
1493 </source> 1465 </source>
1494 <dest> 1466 <dest>
1495 *: "Replaygain" 1467 *: "~Replaygain"
1496 </dest> 1468 </dest>
1497 <voice> 1469 <voice>
1498 *: "Replaygain" 1470 *: "~Replaygain"
1499 </voice> 1471 </voice>
1500</phrase> 1472</phrase>
1501<phrase> 1473<phrase>
@@ -2159,10 +2131,10 @@
2159 *: "Display" 2131 *: "Display"
2160 </source> 2132 </source>
2161 <dest> 2133 <dest>
2162 *: "Display" 2134 *: "~Display"
2163 </dest> 2135 </dest>
2164 <voice> 2136 <voice>
2165 *: "Display" 2137 *: "~Display"
2166 </voice> 2138 </voice>
2167</phrase> 2139</phrase>
2168<phrase> 2140<phrase>
@@ -2264,11 +2236,11 @@
2264 hold_button: "Backlight on Hold" 2236 hold_button: "Backlight on Hold"
2265 </source> 2237 </source>
2266 <dest> 2238 <dest>
2267 *: "Backlight on Lock" 2239 *: "Retroilluminazione su Blocco"
2268 hold_button: "Retroilluminazione Sul tasto di blocco" 2240 hold_button: "Retroilluminazione Sul tasto di blocco"
2269 </dest> 2241 </dest>
2270 <voice> 2242 <voice>
2271 *: "Backlight on Lock" 2243 *: "Retroilluminazione su Blocco"
2272 hold_button: "RetroIlluminazione sul tasto di blocco" 2244 hold_button: "RetroIlluminazione sul tasto di blocco"
2273 </voice> 2245 </voice>
2274</phrase> 2246</phrase>
@@ -3090,10 +3062,10 @@
3090 *: "Latin1 (ISO-8859-1)" 3062 *: "Latin1 (ISO-8859-1)"
3091 </source> 3063 </source>
3092 <dest> 3064 <dest>
3093 *: "Latin1 (ISO-8859-1)" 3065 *: "~Latin1 (ISO-8859-1)"
3094 </dest> 3066 </dest>
3095 <voice> 3067 <voice>
3096 *: "Latin1" 3068 *: "~Latin 1"
3097 </voice> 3069 </voice>
3098</phrase> 3070</phrase>
3099<phrase> 3071<phrase>
@@ -3146,10 +3118,10 @@
3146 *: "Thai (ISO-8859-11)" 3118 *: "Thai (ISO-8859-11)"
3147 </source> 3119 </source>
3148 <dest> 3120 <dest>
3149 *: "Thai (ISO-8859-11)" 3121 *: "~Thai (ISO-8859-11)"
3150 </dest> 3122 </dest>
3151 <voice> 3123 <voice>
3152 *: "Thai" 3124 *: "~Thai"
3153 </voice> 3125 </voice>
3154</phrase> 3126</phrase>
3155<phrase> 3127<phrase>
@@ -3258,10 +3230,10 @@
3258 *: "Unicode (UTF-8)" 3230 *: "Unicode (UTF-8)"
3259 </source> 3231 </source>
3260 <dest> 3232 <dest>
3261 *: "Unicode (UTF-8)" 3233 *: "~Unicode (UTF-8)"
3262 </dest> 3234 </dest>
3263 <voice> 3235 <voice>
3264 *: "Unicode" 3236 *: "~Unicode"
3265 </voice> 3237 </voice>
3266</phrase> 3238</phrase>
3267<phrase> 3239<phrase>
@@ -3759,7 +3731,7 @@
3759 *: "Feb" 3731 *: "Feb"
3760 </source> 3732 </source>
3761 <dest> 3733 <dest>
3762 *: "Feb" 3734 *: "~Feb"
3763 </dest> 3735 </dest>
3764 <voice> 3736 <voice>
3765 *: "Febbraio" 3737 *: "Febbraio"
@@ -3773,7 +3745,7 @@
3773 *: "Mar" 3745 *: "Mar"
3774 </source> 3746 </source>
3775 <dest> 3747 <dest>
3776 *: "Mar" 3748 *: "~Mar"
3777 </dest> 3749 </dest>
3778 <voice> 3750 <voice>
3779 *: "Marzo" 3751 *: "Marzo"
@@ -3787,7 +3759,7 @@
3787 *: "Apr" 3759 *: "Apr"
3788 </source> 3760 </source>
3789 <dest> 3761 <dest>
3790 *: "Apr" 3762 *: "~Apr"
3791 </dest> 3763 </dest>
3792 <voice> 3764 <voice>
3793 *: "Aprile" 3765 *: "Aprile"
@@ -3885,7 +3857,7 @@
3885 *: "Nov" 3857 *: "Nov"
3886 </source> 3858 </source>
3887 <dest> 3859 <dest>
3888 *: "Nov" 3860 *: "~Nov"
3889 </dest> 3861 </dest>
3890 <voice> 3862 <voice>
3891 *: "Novembre" 3863 *: "Novembre"
@@ -4061,23 +4033,6 @@
4061 </voice> 4033 </voice>
4062</phrase> 4034</phrase>
4063<phrase> 4035<phrase>
4064 id: LANG_ALARM_MOD_SHUTDOWN
4065 desc: The text that tells the user that the alarm time is ok and the device shuts off (for the RTC alarm mod).
4066 user: core
4067 <source>
4068 *: none
4069 alarm: "Alarm Set"
4070 </source>
4071 <dest>
4072 *: none
4073 alarm: "Imposta Allarme"
4074 </dest>
4075 <voice>
4076 *: none
4077 alarm: "Imposta Allarme"
4078 </voice>
4079</phrase>
4080<phrase>
4081 id: LANG_ALARM_MOD_ERROR 4036 id: LANG_ALARM_MOD_ERROR
4082 desc: The text that tells that the time is incorrect (for the RTC alarm mod). 4037 desc: The text that tells that the time is incorrect (for the RTC alarm mod).
4083 user: core 4038 user: core
@@ -4095,20 +4050,6 @@
4095 </voice> 4050 </voice>
4096</phrase> 4051</phrase>
4097<phrase> 4052<phrase>
4098 id: LANG_ALARM_MOD_KEYS
4099 desc: deprecated
4100 user: core
4101 <source>
4102 *: ""
4103 </source>
4104 <dest>
4105 *: ""
4106 </dest>
4107 <voice>
4108 *: ""
4109 </voice>
4110</phrase>
4111<phrase>
4112 id: LANG_ALARM_MOD_DISABLE 4053 id: LANG_ALARM_MOD_DISABLE
4113 desc: Announce that the RTC alarm has been turned off 4054 desc: Announce that the RTC alarm has been turned off
4114 user: core 4055 user: core
@@ -5040,11 +4981,11 @@
5040 </source> 4981 </source>
5041 <dest> 4982 <dest>
5042 *: none 4983 *: none
5043 recording: "Bitrate" 4984 recording: "~Bitrate"
5044 </dest> 4985 </dest>
5045 <voice> 4986 <voice>
5046 *: none 4987 *: none
5047 recording: "Bitrate" 4988 recording: "~Bitrate"
5048 </voice> 4989 </voice>
5049</phrase> 4990</phrase>
5050<phrase> 4991<phrase>
@@ -5306,38 +5247,6 @@
5306 </voice> 5247 </voice>
5307</phrase> 5248</phrase>
5308<phrase> 5249<phrase>
5309 id: LANG_RECORD_DIRECTORY
5310 desc: in recording settings_menu
5311 user: core
5312 <source>
5313 *: none
5314 recording: "Directory"
5315 </source>
5316 <dest>
5317 *: none
5318 recording: "Cartella"
5319 </dest>
5320 <voice>
5321 *: none
5322 recording: "Cartella"
5323 </voice>
5324</phrase>
5325<phrase>
5326 id: LANG_SET_AS_REC_DIR
5327 desc: deprecated
5328 user: core
5329 <source>
5330 *: none
5331 recording: ""
5332 </source>
5333 <dest>
5334 *: ""
5335 </dest>
5336 <voice>
5337 *: ""
5338 </voice>
5339</phrase>
5340<phrase>
5341 id: LANG_CLEAR_REC_DIR 5250 id: LANG_CLEAR_REC_DIR
5342 desc: 5251 desc:
5343 user: core 5252 user: core
@@ -5517,11 +5426,11 @@
5517 </source> 5426 </source>
5518 <dest> 5427 <dest>
5519 *: none 5428 *: none
5520 recording: "Stop" 5429 recording: "~Stop"
5521 </dest> 5430 </dest>
5522 <voice> 5431 <voice>
5523 *: none 5432 *: none
5524 recording: "Stop" 5433 recording: "~Stop"
5525 </voice> 5434 </voice>
5526</phrase> 5435</phrase>
5527<phrase> 5436<phrase>
@@ -5946,10 +5855,10 @@
5946 *: "Rockbox Info" 5855 *: "Rockbox Info"
5947 </source> 5856 </source>
5948 <dest> 5857 <dest>
5949 *: "Rockbox Info" 5858 *: "~Rockbox Info"
5950 </dest> 5859 </dest>
5951 <voice> 5860 <voice>
5952 *: "Rockbox Info" 5861 *: "~Rockbox Info"
5953 </voice> 5862 </voice>
5954</phrase> 5863</phrase>
5955<phrase> 5864<phrase>
@@ -5960,7 +5869,7 @@
5960 *: "Buffer:" 5869 *: "Buffer:"
5961 </source> 5870 </source>
5962 <dest> 5871 <dest>
5963 *: "Buffer:" 5872 *: "~Buffer:"
5964 </dest> 5873 </dest>
5965 <voice> 5874 <voice>
5966 *: "Dimensione buffer" 5875 *: "Dimensione buffer"
@@ -5976,7 +5885,7 @@
5976 </source> 5885 </source>
5977 <dest> 5886 <dest>
5978 *: "Batteria: %d%% %dh %dm" 5887 *: "Batteria: %d%% %dh %dm"
5979 ipodmini1g,ipodmini2g,iriverh10: "Batt: %d%% %dh %dm" 5888 ipodmini1g,ipodmini2g,iriverh10: "~Batt: %d%% %dh %dm"
5980 </dest> 5889 </dest>
5981 <voice> 5890 <voice>
5982 *: "Livello Batteria" 5891 *: "Livello Batteria"
@@ -6020,14 +5929,14 @@
6020 xduoox3: "mSD1:" 5929 xduoox3: "mSD1:"
6021 </source> 5930 </source>
6022 <dest> 5931 <dest>
6023 *: "Int:" 5932 *: "~Int:"
6024 hibylinux: "mSD:" 5933 hibylinux: "~mSD:"
6025 xduoox3: "MSD1:" 5934 xduoox3: "~mSD1:"
6026 </dest> 5935 </dest>
6027 <voice> 5936 <voice>
6028 *: "Interno" 5937 *: "Interno"
6029 hibylinux: "micro S D" 5938 hibylinux: "~micro S D"
6030 xduoox3: "Micro SD 1" 5939 xduoox3: "~Micro S D 1"
6031 </voice> 5940 </voice>
6032</phrase> 5941</phrase>
6033<phrase> 5942<phrase>
@@ -6043,17 +5952,17 @@
6043 </source> 5952 </source>
6044 <dest> 5953 <dest>
6045 *: none 5954 *: none
6046 hibylinux: "USB:" 5955 hibylinux: "~USB:"
6047 multivolume: "HD1" 5956 multivolume: "~HD1"
6048 sansac200*,sansaclipplus,sansae200*,sansafuze*: "MSD:" 5957 sansac200*,sansaclipplus,sansae200*,sansafuze*: "~mSD:"
6049 xduoox3: "MSD2:" 5958 xduoox3: "~mSD2:"
6050 </dest> 5959 </dest>
6051 <voice> 5960 <voice>
6052 *: none 5961 *: none
6053 hibylinux: "U S B" 5962 hibylinux: "~U S B"
6054 multivolume: "HD 1" 5963 multivolume: "~H D 1"
6055 sansac200*,sansaclipplus,sansae200*,sansafuze*: "Micro S D" 5964 sansac200*,sansaclipplus,sansae200*,sansafuze*: "~micro S D"
6056 xduoox3: "Micro SD 2" 5965 xduoox3: "~micro SD 2"
6057 </voice> 5966 </voice>
6058</phrase> 5967</phrase>
6059<phrase> 5968<phrase>
@@ -6134,66 +6043,10 @@
6134 *: "Playlist" 6043 *: "Playlist"
6135 </source> 6044 </source>
6136 <dest> 6045 <dest>
6137 *: "Playlist" 6046 *: "~Playlist"
6138 </dest>
6139 <voice>
6140 *: "Playlist"
6141 </voice>
6142</phrase>
6143<phrase>
6144 id: LANG_INSERT
6145 desc: deprecated
6146 user: core
6147 <source>
6148 *: ""
6149 </source>
6150 <dest>
6151 *: ""
6152 </dest>
6153 <voice>
6154 *: ""
6155 </voice>
6156</phrase>
6157<phrase>
6158 id: LANG_INSERT_FIRST
6159 desc: deprecated
6160 user: core
6161 <source>
6162 *: ""
6163 </source>
6164 <dest>
6165 *: ""
6166 </dest> 6047 </dest>
6167 <voice> 6048 <voice>
6168 *: "" 6049 *: "~Playlist"
6169 </voice>
6170</phrase>
6171<phrase>
6172 id: LANG_INSERT_LAST
6173 desc: deprecated
6174 user: core
6175 <source>
6176 *: ""
6177 </source>
6178 <dest>
6179 *: ""
6180 </dest>
6181 <voice>
6182 *: ""
6183 </voice>
6184</phrase>
6185<phrase>
6186 id: LANG_INSERT_SHUFFLED
6187 desc: deprecated
6188 user: core
6189 <source>
6190 *: ""
6191 </source>
6192 <dest>
6193 *: ""
6194 </dest>
6195 <voice>
6196 *: ""
6197 </voice> 6050 </voice>
6198</phrase> 6051</phrase>
6199<phrase> 6052<phrase>
@@ -6253,20 +6106,6 @@
6253 </voice> 6106 </voice>
6254</phrase> 6107</phrase>
6255<phrase> 6108<phrase>
6256 id: LANG_REPLACE
6257 desc: deprecated
6258 user: core
6259 <source>
6260 *: ""
6261 </source>
6262 <dest>
6263 *: ""
6264 </dest>
6265 <voice>
6266 *: ""
6267 </voice>
6268</phrase>
6269<phrase>
6270 id: LANG_PLAYLIST_INSERT_COUNT 6109 id: LANG_PLAYLIST_INSERT_COUNT
6271 desc: splash number of tracks inserted 6110 desc: splash number of tracks inserted
6272 user: core 6111 user: core
@@ -6351,34 +6190,6 @@
6351 </voice> 6190 </voice>
6352</phrase> 6191</phrase>
6353<phrase> 6192<phrase>
6354 id: LANG_CATALOG_VIEW
6355 desc: in onplay playlist catalogue submenu
6356 user: core
6357 <source>
6358 *: "View Catalogue"
6359 </source>
6360 <dest>
6361 *: "Visualizza catalogo"
6362 </dest>
6363 <voice>
6364 *: "Visualizza catalogo"
6365 </voice>
6366</phrase>
6367<phrase>
6368 id: LANG_CATALOG_ADD_TO
6369 desc: deprecated
6370 user: core
6371 <source>
6372 *: ""
6373 </source>
6374 <dest>
6375 *: ""
6376 </dest>
6377 <voice>
6378 *: ""
6379 </voice>
6380</phrase>
6381<phrase>
6382 id: LANG_CATALOG_ADD_TO_NEW 6193 id: LANG_CATALOG_ADD_TO_NEW
6383 desc: in onplay playlist catalogue submenu 6194 desc: in onplay playlist catalogue submenu
6384 user: core 6195 user: core
@@ -6554,10 +6365,10 @@
6554 *: "Album" 6365 *: "Album"
6555 </source> 6366 </source>
6556 <dest> 6367 <dest>
6557 *: "Album" 6368 *: "~Album"
6558 </dest> 6369 </dest>
6559 <voice> 6370 <voice>
6560 *: "Album" 6371 *: "~Album"
6561 </voice> 6372 </voice>
6562</phrase> 6373</phrase>
6563<phrase> 6374<phrase>
@@ -6624,10 +6435,10 @@
6624 *: "Playlist" 6435 *: "Playlist"
6625 </source> 6436 </source>
6626 <dest> 6437 <dest>
6627 *: "Playlist" 6438 *: "~Playlist"
6628 </dest> 6439 </dest>
6629 <voice> 6440 <voice>
6630 *: "Playlist" 6441 *: "~Playlist"
6631 </voice> 6442 </voice>
6632</phrase> 6443</phrase>
6633<phrase> 6444<phrase>
@@ -6638,10 +6449,10 @@
6638 *: "Bitrate" 6449 *: "Bitrate"
6639 </source> 6450 </source>
6640 <dest> 6451 <dest>
6641 *: "Bitrate" 6452 *: "~Bitrate"
6642 </dest> 6453 </dest>
6643 <voice> 6454 <voice>
6644 *: "Bitrate" 6455 *: "~Bit rate"
6645 </voice> 6456 </voice>
6646</phrase> 6457</phrase>
6647<phrase> 6458<phrase>
@@ -6666,7 +6477,7 @@
6666 *: "Discnum" 6477 *: "Discnum"
6667 </source> 6478 </source>
6668 <dest> 6479 <dest>
6669 *: "Discnum" 6480 *: "Numdisco"
6670 </dest> 6481 </dest>
6671 <voice> 6482 <voice>
6672 *: "Numero disco" 6483 *: "Numero disco"
@@ -6729,20 +6540,6 @@
6729 </voice> 6540 </voice>
6730</phrase> 6541</phrase>
6731<phrase> 6542<phrase>
6732 id: LANG_ID3_ALBUM_GAIN
6733 desc: in tag viewer
6734 user: core
6735 <source>
6736 *: "Album Gain"
6737 </source>
6738 <dest>
6739 *: "Guadagno Album"
6740 </dest>
6741 <voice>
6742 *: "Guadagno Album"
6743 </voice>
6744</phrase>
6745<phrase>
6746 id: LANG_ID3_PATH 6543 id: LANG_ID3_PATH
6747 desc: in tag viewer 6544 desc: in tag viewer
6748 user: core 6545 user: core
@@ -7153,20 +6950,6 @@
7153 </voice> 6950 </voice>
7154</phrase> 6951</phrase>
7155<phrase> 6952<phrase>
7156 id: LANG_PLAYLIST_CONTROL_UPDATE_ERROR
7157 desc: Playlist error
7158 user: core
7159 <source>
7160 *: "Error updating playlist control file"
7161 </source>
7162 <dest>
7163 *: "Errore di aggiornamento file controllo playlist"
7164 </dest>
7165 <voice>
7166 *: "Errore di aggiornamento file controllo playlist"
7167 </voice>
7168</phrase>
7169<phrase>
7170 id: LANG_PLAYLIST_ACCESS_ERROR 6953 id: LANG_PLAYLIST_ACCESS_ERROR
7171 desc: Playlist error 6954 desc: Playlist error
7172 user: core 6955 user: core
@@ -7352,23 +7135,6 @@
7352 </voice> 7135 </voice>
7353</phrase> 7136</phrase>
7354<phrase> 7137<phrase>
7355 id: LANG_DB_INF
7356 desc: -inf db for values below measurement
7357 user: core
7358 <source>
7359 *: none
7360 recording: "-inf"
7361 </source>
7362 <dest>
7363 *: none
7364 recording: "-inf"
7365 </dest>
7366 <voice>
7367 *: none
7368 recording: "meno infinito"
7369 </voice>
7370</phrase>
7371<phrase>
7372 id: LANG_BOOT_CHANGED 7138 id: LANG_BOOT_CHANGED
7373 desc: File browser discovered the boot file was changed 7139 desc: File browser discovered the boot file was changed
7374 user: core 7140 user: core
@@ -7594,23 +7360,6 @@
7594 </voice> 7360 </voice>
7595</phrase> 7361</phrase>
7596<phrase> 7362<phrase>
7597 id: LANG_BATTERY_TRICKLE_CHARGE
7598 desc: in info display, shows that trickle charge is running
7599 user: core
7600 <source>
7601 *: none
7602 charging: "Battery: Trickle Chg"
7603 </source>
7604 <dest>
7605 *: none
7606 charging: "Batteria: Mantenimento carica"
7607 </dest>
7608 <voice>
7609 *: none
7610 charging: "Mantenimento carica"
7611 </voice>
7612</phrase>
7613<phrase>
7614 id: LANG_WARNING_BATTERY_LOW 7363 id: LANG_WARNING_BATTERY_LOW
7615 desc: general warning 7364 desc: general warning
7616 user: core 7365 user: core
@@ -8265,7 +8014,7 @@
8265 *: "" 8014 *: ""
8266 </dest> 8015 </dest>
8267 <voice> 8016 <voice>
8268 *: "decibel" 8017 *: "~decibel"
8269 </voice> 8018 </voice>
8270</phrase> 8019</phrase>
8271<phrase> 8020<phrase>
@@ -8307,7 +8056,7 @@
8307 *: "" 8056 *: ""
8308 </dest> 8057 </dest>
8309 <voice> 8058 <voice>
8310 *: "pixel" 8059 *: "~pixel"
8311 </voice> 8060 </voice>
8312</phrase> 8061</phrase>
8313<phrase> 8062<phrase>
@@ -8335,7 +8084,7 @@
8335 *: "" 8084 *: ""
8336 </dest> 8085 </dest>
8337 <voice> 8086 <voice>
8338 *: "hertz" 8087 *: "~hertz"
8339 </voice> 8088 </voice>
8340</phrase> 8089</phrase>
8341<phrase> 8090<phrase>
@@ -8559,7 +8308,7 @@
8559 *: "" 8308 *: ""
8560 </dest> 8309 </dest>
8561 <voice> 8310 <voice>
8562 *: ".....Oh" 8311 *: "~O"
8563 </voice> 8312 </voice>
8564</phrase> 8313</phrase>
8565<phrase> 8314<phrase>
@@ -8573,7 +8322,7 @@
8573 *: "" 8322 *: ""
8574 </dest> 8323 </dest>
8575 <voice> 8324 <voice>
8576 *: ".....PI" 8325 *: "~P"
8577 </voice> 8326 </voice>
8578</phrase> 8327</phrase>
8579<phrase> 8328<phrase>
@@ -8587,7 +8336,7 @@
8587 *: "" 8336 *: ""
8588 </dest> 8337 </dest>
8589 <voice> 8338 <voice>
8590 *: ".....KU" 8339 *: "~Q"
8591 </voice> 8340 </voice>
8592</phrase> 8341</phrase>
8593<phrase> 8342<phrase>
@@ -8629,7 +8378,7 @@
8629 *: "" 8378 *: ""
8630 </dest> 8379 </dest>
8631 <voice> 8380 <voice>
8632 *: ".....TI" 8381 *: "~T"
8633 </voice> 8382 </voice>
8634</phrase> 8383</phrase>
8635<phrase> 8384<phrase>
@@ -8755,7 +8504,7 @@
8755 *: "" 8504 *: ""
8756 </dest> 8505 </dest>
8757 <voice> 8506 <voice>
8758 *: "file" 8507 *: "fail"
8759 </voice> 8508 </voice>
8760</phrase> 8509</phrase>
8761<phrase> 8510<phrase>
@@ -8783,7 +8532,7 @@
8783 *: "" 8532 *: ""
8784 </dest> 8533 </dest>
8785 <voice> 8534 <voice>
8786 *: "audio" 8535 *: "~audio"
8787 </voice> 8536 </voice>
8788</phrase> 8537</phrase>
8789<phrase> 8538<phrase>
@@ -8825,7 +8574,7 @@
8825 *: "" 8574 *: ""
8826 </dest> 8575 </dest>
8827 <voice> 8576 <voice>
8828 *: "plugin" 8577 *: "~plugin"
8829 </voice> 8578 </voice>
8830</phrase> 8579</phrase>
8831<phrase> 8580<phrase>
@@ -8867,7 +8616,7 @@
8867 *: "" 8616 *: ""
8868 </dest> 8617 </dest>
8869 <voice> 8618 <voice>
8870 *: "firmware" 8619 *: "~firmware"
8871 </voice> 8620 </voice>
8872</phrase> 8621</phrase>
8873<phrase> 8622<phrase>
@@ -8912,7 +8661,7 @@
8912 *: "" 8661 *: ""
8913 </dest> 8662 </dest>
8914 <voice> 8663 <voice>
8915 *: "cuesheet" 8664 *: "~cuesheet"
8916 </voice> 8665 </voice>
8917</phrase> 8666</phrase>
8918<phrase> 8667<phrase>
@@ -9139,7 +8888,7 @@
9139 *: "" 8888 *: ""
9140 </dest> 8889 </dest>
9141 <voice> 8890 <voice>
9142 *: "P M" 8891 *: "~P M"
9143 </voice> 8892 </voice>
9144</phrase> 8893</phrase>
9145<phrase> 8894<phrase>
@@ -9153,7 +8902,7 @@
9153 *: "" 8902 *: ""
9154 </dest> 8903 </dest>
9155 <voice> 8904 <voice>
9156 *: "A M" 8905 *: "~A M"
9157 </voice> 8906 </voice>
9158</phrase> 8907</phrase>
9159<phrase> 8908<phrase>
@@ -9567,7 +9316,7 @@
9567 *: "" 9316 *: ""
9568 </dest> 9317 </dest>
9569 <voice> 9318 <voice>
9570 *: "OK" 9319 *: "~OK"
9571 </voice> 9320 </voice>
9572</phrase> 9321</phrase>
9573<phrase> 9322<phrase>
@@ -9648,7 +9397,7 @@
9648 </source> 9397 </source>
9649 <dest> 9398 <dest>
9650 *: none 9399 *: none
9651 serial_port: "Auto" 9400 serial_port: "~Auto"
9652 </dest> 9401 </dest>
9653 <voice> 9402 <voice>
9654 *: none 9403 *: none
@@ -9865,7 +9614,7 @@
9865 </source> 9614 </source>
9866 <dest> 9615 <dest>
9867 *: none 9616 *: none
9868 agc: "AGC" 9617 agc: "~AGC"
9869 </dest> 9618 </dest>
9870 <voice> 9619 <voice>
9871 *: none 9620 *: none
@@ -9933,7 +9682,7 @@
9933 </source> 9682 </source>
9934 <dest> 9683 <dest>
9935 *: none 9684 *: none
9936 recording: "CLIP:" 9685 recording: "~CLIP:"
9937 </dest> 9686 </dest>
9938 <voice> 9687 <voice>
9939 *: none 9688 *: none
@@ -10244,10 +9993,10 @@
10244 *: "Timestretch" 9993 *: "Timestretch"
10245 </source> 9994 </source>
10246 <dest> 9995 <dest>
10247 *: "Timestretch" 9996 *: "~Timestretch"
10248 </dest> 9997 </dest>
10249 <voice> 9998 <voice>
10250 *: "Timestretch" 9999 *: "~Time stretch"
10251 </voice> 10000 </voice>
10252</phrase> 10001</phrase>
10253<phrase> 10002<phrase>
@@ -10404,11 +10153,11 @@
10404 </source> 10153 </source>
10405 <dest> 10154 <dest>
10406 *: none 10155 *: none
10407 pitchscreen: "Rate" 10156 pitchscreen: "~Rate"
10408 </dest> 10157 </dest>
10409 <voice> 10158 <voice>
10410 *: none 10159 *: none
10411 pitchscreen: "Rate" 10160 pitchscreen: "~Rate"
10412 </voice> 10161 </voice>
10413</phrase> 10162</phrase>
10414<phrase> 10163<phrase>
@@ -10438,11 +10187,11 @@
10438 </source> 10187 </source>
10439 <dest> 10188 <dest>
10440 *: none 10189 *: none
10441 usb_hid: "Multimedia" 10190 usb_hid: "~Multimedia"
10442 </dest> 10191 </dest>
10443 <voice> 10192 <voice>
10444 *: none 10193 *: none
10445 usb_hid: "Multimedia" 10194 usb_hid: "~Multimedia"
10446 </voice> 10195 </voice>
10447</phrase> 10196</phrase>
10448<phrase> 10197<phrase>
@@ -10489,11 +10238,11 @@
10489 </source> 10238 </source>
10490 <dest> 10239 <dest>
10491 *: none 10240 *: none
10492 usb_hid: "Mouse" 10241 usb_hid: "~Mouse"
10493 </dest> 10242 </dest>
10494 <voice> 10243 <voice>
10495 *: none 10244 *: none
10496 usb_hid: "Mouse" 10245 usb_hid: "~Mouse"
10497 </voice> 10246 </voice>
10498</phrase> 10247</phrase>
10499<phrase> 10248<phrase>
@@ -10511,20 +10260,6 @@
10511 </voice> 10260 </voice>
10512</phrase> 10261</phrase>
10513<phrase> 10262<phrase>
10514 id: LANG_SCROLLBAR_POSITION
10515 desc: in Settings -> General -> Display -> Status-/Scrollbar
10516 user: core
10517 <source>
10518 *: "Scroll Bar Position"
10519 </source>
10520 <dest>
10521 *: "Posizione Barra di Scorrimento"
10522 </dest>
10523 <voice>
10524 *: "Posizione Barra di Scorrimento"
10525 </voice>
10526</phrase>
10527<phrase>
10528 id: LANG_COMPRESSOR 10263 id: LANG_COMPRESSOR
10529 desc: in sound settings 10264 desc: in sound settings
10530 user: core 10265 user: core
@@ -10709,10 +10444,10 @@
10709 *: "Auto" 10444 *: "Auto"
10710 </source> 10445 </source>
10711 <dest> 10446 <dest>
10712 *: "Auto" 10447 *: "~Auto"
10713 </dest> 10448 </dest>
10714 <voice> 10449 <voice>
10715 *: "Auto" 10450 *: "~Auto"
10716 </voice> 10451 </voice>
10717</phrase> 10452</phrase>
10718<phrase> 10453<phrase>
@@ -10723,10 +10458,10 @@
10723 *: "Knee" 10458 *: "Knee"
10724 </source> 10459 </source>
10725 <dest> 10460 <dest>
10726 *: "Knee" 10461 *: "~Knee"
10727 </dest> 10462 </dest>
10728 <voice> 10463 <voice>
10729 *: "Knee" 10464 *: "~Knee"
10730 </voice> 10465 </voice>
10731</phrase> 10466</phrase>
10732<phrase> 10467<phrase>
@@ -10737,10 +10472,10 @@
10737 *: "Hard Knee" 10472 *: "Hard Knee"
10738 </source> 10473 </source>
10739 <dest> 10474 <dest>
10740 *: "Hard Knee" 10475 *: "Knee Hard"
10741 </dest> 10476 </dest>
10742 <voice> 10477 <voice>
10743 *: "Hard Knee" 10478 *: "Knee Hard"
10744 </voice> 10479 </voice>
10745</phrase> 10480</phrase>
10746<phrase> 10481<phrase>
@@ -10751,10 +10486,10 @@
10751 *: "Soft Knee" 10486 *: "Soft Knee"
10752 </source> 10487 </source>
10753 <dest> 10488 <dest>
10754 *: "Soft Knee" 10489 *: "Knee Soft"
10755 </dest> 10490 </dest>
10756 <voice> 10491 <voice>
10757 *: "Soft Knee" 10492 *: "Knee Soft"
10758 </voice> 10493 </voice>
10759</phrase> 10494</phrase>
10760<phrase> 10495<phrase>
@@ -10786,20 +10521,6 @@
10786 </voice> 10521 </voice>
10787</phrase> 10522</phrase>
10788<phrase> 10523<phrase>
10789 id: LANG_STATUSBAR_CUSTOM
10790 desc: if this translation is compatible with LANG_CHANNEL_CUSTOM, then please use the same translation. it can be combined later then
10791 user: core
10792 <source>
10793 *: "Custom"
10794 </source>
10795 <dest>
10796 *: "Personalizzata"
10797 </dest>
10798 <voice>
10799 *: "Personalizzata"
10800 </voice>
10801</phrase>
10802<phrase>
10803 id: VOICE_EXT_SBS 10524 id: VOICE_EXT_SBS
10804 desc: spoken only, for file extension 10525 desc: spoken only, for file extension
10805 user: core 10526 user: core
@@ -10848,20 +10569,6 @@
10848 </voice> 10569 </voice>
10849</phrase> 10570</phrase>
10850<phrase> 10571<phrase>
10851 id: LANG_INSERT_LAST_SHUFFLED
10852 desc: deprecated
10853 user: core
10854 <source>
10855 *: ""
10856 </source>
10857 <dest>
10858 *: ""
10859 </dest>
10860 <voice>
10861 *: ""
10862 </voice>
10863</phrase>
10864<phrase>
10865 id: LANG_QUEUE_LAST_SHUFFLED 10572 id: LANG_QUEUE_LAST_SHUFFLED
10866 desc: in onplay menu. queue a playlist randomly at end of dynamic playlist 10573 desc: in onplay menu. queue a playlist randomly at end of dynamic playlist
10867 user: core 10574 user: core
@@ -11383,7 +11090,7 @@
11383 *: "PictureFlow" 11090 *: "PictureFlow"
11384 </source> 11091 </source>
11385 <dest> 11092 <dest>
11386 *: "PictureFlow" 11093 *: "~PictureFlow"
11387 </dest> 11094 </dest>
11388 <voice> 11095 <voice>
11389 *: "Apri Picture Flow" 11096 *: "Apri Picture Flow"
@@ -11399,11 +11106,11 @@
11399 </source> 11106 </source>
11400 <dest> 11107 <dest>
11401 *: none 11108 *: none
11402 touchscreen: "OK" 11109 touchscreen: "~OK"
11403 </dest> 11110 </dest>
11404 <voice> 11111 <voice>
11405 *: none 11112 *: none
11406 touchscreen: "OK" 11113 touchscreen: "~OK"
11407 </voice> 11114 </voice>
11408</phrase> 11115</phrase>
11409<phrase> 11116<phrase>
@@ -11455,20 +11162,6 @@
11455 </voice> 11162 </voice>
11456</phrase> 11163</phrase>
11457<phrase> 11164<phrase>
11458 id: LANG_SET_AS_START_DIR
11459 desc: deprecated
11460 user: core
11461 <source>
11462 *: ""
11463 </source>
11464 <dest>
11465 *: ""
11466 </dest>
11467 <voice>
11468 *: ""
11469 </voice>
11470</phrase>
11471<phrase>
11472 id: LANG_RESET_START_DIR 11165 id: LANG_RESET_START_DIR
11473 desc: reset the browser start directory 11166 desc: reset the browser start directory
11474 user: core 11167 user: core
@@ -11570,20 +11263,6 @@
11570 </voice> 11263 </voice>
11571</phrase> 11264</phrase>
11572<phrase> 11265<phrase>
11573 id: LANG_SET_AS_PLAYLISTCAT_DIR
11574 desc: deprecated
11575 user: core
11576 <source>
11577 *: ""
11578 </source>
11579 <dest>
11580 *: ""
11581 </dest>
11582 <voice>
11583 *: ""
11584 </voice>
11585</phrase>
11586<phrase>
11587 id: LANG_RESET_PLAYLISTCAT_DIR 11266 id: LANG_RESET_PLAYLISTCAT_DIR
11588 desc: 11267 desc:
11589 user: core 11268 user: core
@@ -11660,20 +11339,6 @@
11660 </voice> 11339 </voice>
11661</phrase> 11340</phrase>
11662<phrase> 11341<phrase>
11663 id: LANG_AUTOMATIC
11664 desc: deprecated
11665 user: core
11666 <source>
11667 *: ""
11668 </source>
11669 <dest>
11670 *: ""
11671 </dest>
11672 <voice>
11673 *: ""
11674 </voice>
11675</phrase>
11676<phrase>
11677 id: LANG_SLEEP_TIMER_DURATION 11342 id: LANG_SLEEP_TIMER_DURATION
11678 desc: default sleep timer duration in minutes 11343 desc: default sleep timer duration in minutes
11679 user: core 11344 user: core
@@ -12248,10 +11913,10 @@
12248 *: "Android Debug Bridge" 11913 *: "Android Debug Bridge"
12249 </source> 11914 </source>
12250 <dest> 11915 <dest>
12251 *: "Android Debug Bridge" 11916 *: "~Android Debug Bridge"
12252 </dest> 11917 </dest>
12253 <voice> 11918 <voice>
12254 *: "Android Debug Bridge" 11919 *: "~Android Debug Bridge"
12255 </voice> 11920 </voice>
12256</phrase> 11921</phrase>
12257<phrase> 11922<phrase>
@@ -12363,10 +12028,10 @@
12363 *: "Haas Surround" 12028 *: "Haas Surround"
12364 </source> 12029 </source>
12365 <dest> 12030 <dest>
12366 *: "Haas Surround" 12031 *: "~Haas Surround"
12367 </dest> 12032 </dest>
12368 <voice> 12033 <voice>
12369 *: "Haas Surround" 12034 *: "~Haas Surround"
12370 </voice> 12035 </voice>
12371</phrase> 12036</phrase>
12372<phrase> 12037<phrase>
@@ -12391,10 +12056,10 @@
12391 *: "Dry / Wet Mix" 12056 *: "Dry / Wet Mix"
12392 </source> 12057 </source>
12393 <dest> 12058 <dest>
12394 *: "Dry / Wet Mix" 12059 *: "Mix Dry / Wet"
12395 </dest> 12060 </dest>
12396 <voice> 12061 <voice>
12397 *: "Dry / Wet Mix" 12062 *: "Mix Dry / Wet"
12398 </voice> 12063 </voice>
12399</phrase> 12064</phrase>
12400<phrase> 12065<phrase>
@@ -12542,10 +12207,10 @@
12542 desc: playing time screen 12207 desc: playing time screen
12543 user: core 12208 user: core
12544 <source> 12209 <source>
12545 *: "Average bitrate: %ld kbps" 12210 *: "Average bitrate:"
12546 </source> 12211 </source>
12547 <dest> 12212 <dest>
12548 *: "Bitrate medio: %ld kbps" 12213 *: "Bitrate medio:"
12549 </dest> 12214 </dest>
12550 <voice> 12215 <voice>
12551 *: "Bitrate medio" 12216 *: "Bitrate medio"
@@ -12702,10 +12367,10 @@
12702 *: "Zoom" 12367 *: "Zoom"
12703 </source> 12368 </source>
12704 <dest> 12369 <dest>
12705 *: "Zoom" 12370 *: "~Zoom"
12706 </dest> 12371 </dest>
12707 <voice> 12372 <voice>
12708 *: "Zoom" 12373 *: "~Zoom"
12709 </voice> 12374 </voice>
12710</phrase> 12375</phrase>
12711<phrase> 12376<phrase>
@@ -12864,20 +12529,6 @@
12864 </voice> 12529 </voice>
12865</phrase> 12530</phrase>
12866<phrase> 12531<phrase>
12867 id: LANG_NO_VIEWERS
12868 desc: text for splash to indicate that no viewers are available
12869 user: core
12870 <source>
12871 *: "No viewers found"
12872 </source>
12873 <dest>
12874 *: "Nessun visualizzatore trovato"
12875 </dest>
12876 <voice>
12877 *: "Nessun visualizzatore trovato"
12878 </voice>
12879</phrase>
12880<phrase>
12881 id: LANG_NO_REM_CONTROL 12532 id: LANG_NO_REM_CONTROL
12882 desc: Item for menus 12533 desc: Item for menus
12883 user: core 12534 user: core
@@ -12909,20 +12560,6 @@
12909 </voice> 12560 </voice>
12910</phrase> 12561</phrase>
12911<phrase> 12562<phrase>
12912 id: LANG_ADDED_TO_PLAYLIST
12913 desc: in the pictureflow splash messages
12914 user: core
12915 <source>
12916 *: "Added to playlist"
12917 </source>
12918 <dest>
12919 *: "Aggiunto alla playlist"
12920 </dest>
12921 <voice>
12922 *: "Aggiunto alla playlist"
12923 </voice>
12924</phrase>
12925<phrase>
12926 id: LANG_SWAP_CHANNELS 12563 id: LANG_SWAP_CHANNELS
12927 desc: in sound_settings 12564 desc: in sound_settings
12928 user: core 12565 user: core
@@ -12946,11 +12583,11 @@
12946 </source> 12583 </source>
12947 <dest> 12584 <dest>
12948 *: none 12585 *: none
12949 es9018: "Bypass" 12586 es9018: "~Bypass"
12950 </dest> 12587 </dest>
12951 <voice> 12588 <voice>
12952 *: none 12589 *: none
12953 es9018: "Bypass" 12590 es9018: "~Bypass"
12954 </voice> 12591 </voice>
12955</phrase> 12592</phrase>
12956<phrase> 12593<phrase>
@@ -13069,20 +12706,6 @@
13069 </voice> 12706 </voice>
13070</phrase> 12707</phrase>
13071<phrase> 12708<phrase>
13072 id: LANG_PROPERTIES_ALBUM
13073 desc: deprecated
13074 user: core
13075 <source>
13076 *: ""
13077 </source>
13078 <dest>
13079 *: ""
13080 </dest>
13081 <voice>
13082 *: ""
13083 </voice>
13084</phrase>
13085<phrase>
13086 id: LANG_PROPERTIES_TIME 12709 id: LANG_PROPERTIES_TIME
13087 desc: in properties plugin 12710 desc: in properties plugin
13088 user: core 12711 user: core
@@ -13198,20 +12821,6 @@
13198 </voice> 12821 </voice>
13199</phrase> 12822</phrase>
13200<phrase> 12823<phrase>
13201 id: LANG_PROPERTIES_ARTIST
13202 desc: deprecated
13203 user: core
13204 <source>
13205 *: ""
13206 </source>
13207 <dest>
13208 *: ""
13209 </dest>
13210 <voice>
13211 *: ""
13212 </voice>
13213</phrase>
13214<phrase>
13215 id: LANG_REVERBERATION 12824 id: LANG_REVERBERATION
13216 desc: in mikmod settings menu 12825 desc: in mikmod settings menu
13217 user: core 12826 user: core
@@ -13233,10 +12842,10 @@
13233 desc: playing time screen 12842 desc: playing time screen
13234 user: core 12843 user: core
13235 <source> 12844 <source>
13236 *: "Track %d / %d %d%%" 12845 *: "Track:"
13237 </source> 12846 </source>
13238 <dest> 12847 <dest>
13239 *: "Traccia %d / %d %d%%" 12848 *: "Traccia:"
13240 </dest> 12849 </dest>
13241 <voice> 12850 <voice>
13242 *: "Traccia" 12851 *: "Traccia"
@@ -13257,20 +12866,6 @@
13257 </voice> 12866 </voice>
13258</phrase> 12867</phrase>
13259<phrase> 12868<phrase>
13260 id: LANG_PROPERTIES_TITLE
13261 desc: deprecated
13262 user: core
13263 <source>
13264 *: ""
13265 </source>
13266 <dest>
13267 *: ""
13268 </dest>
13269 <voice>
13270 *: ""
13271 </voice>
13272</phrase>
13273<phrase>
13274 id: LANG_REMOTE_CONTROL 12869 id: LANG_REMOTE_CONTROL
13275 desc: Item for menus 12870 desc: Item for menus
13276 user: core 12871 user: core
@@ -13425,11 +13020,11 @@
13425 lowmem: none 13020 lowmem: none
13426 </source> 13021 </source>
13427 <dest> 13022 <dest>
13428 *: "Surround" 13023 *: "~Surround"
13429 lowmem: none 13024 lowmem: none
13430 </dest> 13025 </dest>
13431 <voice> 13026 <voice>
13432 *: "Surround" 13027 *: "~Surround"
13433 lowmem: none 13028 lowmem: none
13434 </voice> 13029 </voice>
13435</phrase> 13030</phrase>
@@ -13532,20 +13127,6 @@
13532 </voice> 13127 </voice>
13533</phrase> 13128</phrase>
13534<phrase> 13129<phrase>
13535 id: LANG_PROPERTIES_DURATION
13536 desc: deprecated
13537 user: core
13538 <source>
13539 *: ""
13540 </source>
13541 <dest>
13542 *: ""
13543 </dest>
13544 <voice>
13545 *: ""
13546 </voice>
13547</phrase>
13548<phrase>
13549 id: LANG_BACKLIGHT_BRIGHTNESS 13130 id: LANG_BACKLIGHT_BRIGHTNESS
13550 desc: in the mpegplayer settings menu 13131 desc: in the mpegplayer settings menu
13551 user: core 13132 user: core
@@ -13901,10 +13482,10 @@
13901 desc: playing time screen 13482 desc: playing time screen
13902 user: core 13483 user: core
13903 <source> 13484 <source>
13904 *: "Average track size: %s" 13485 *: "Average track size:"
13905 </source> 13486 </source>
13906 <dest> 13487 <dest>
13907 *: "Dimensione media delle traccie: %s" 13488 *: "Dimensione media delle tracce:"
13908 </dest> 13489 </dest>
13909 <voice> 13490 <voice>
13910 *: "Dimensione media delle traccie" 13491 *: "Dimensione media delle traccie"
@@ -13999,10 +13580,10 @@
13999 desc: playing time screen 13580 desc: playing time screen
14000 user: core 13581 user: core
14001 <source> 13582 <source>
14002 *: "Playlist remaining: %s" 13583 *: "Playlist remaining:"
14003 </source> 13584 </source>
14004 <dest> 13585 <dest>
14005 *: "Playlist rimanente: %s" 13586 *: "Playlist rimanente:"
14006 </dest> 13587 </dest>
14007 <voice> 13588 <voice>
14008 *: "Playlist rimanente" 13589 *: "Playlist rimanente"
@@ -14111,10 +13692,10 @@
14111 desc: playing time screen 13692 desc: playing time screen
14112 user: core 13693 user: core
14113 <source> 13694 <source>
14114 *: "Track remaining: %s" 13695 *: "Track remaining:"
14115 </source> 13696 </source>
14116 <dest> 13697 <dest>
14117 *: "Traccia rimanente: %s" 13698 *: "Traccia rimanente:"
14118 </dest> 13699 </dest>
14119 <voice> 13700 <voice>
14120 *: "Traccia rimanente" 13701 *: "Traccia rimanente"
@@ -14329,20 +13910,6 @@
14329 </voice> 13910 </voice>
14330</phrase> 13911</phrase>
14331<phrase> 13912<phrase>
14332 id: LANG_PLAYLIST_CLEARED
14333 desc: in the pictureflow splash messages
14334 user: core
14335 <source>
14336 *: "Playlist Cleared"
14337 </source>
14338 <dest>
14339 *: "Playlist Svuotata"
14340 </dest>
14341 <voice>
14342 *: "Playlist Svuotata"
14343 </voice>
14344</phrase>
14345<phrase>
14346 id: LANG_FILTER_SHORT 13913 id: LANG_FILTER_SHORT
14347 desc: in sound settings 13914 desc: in sound settings
14348 user: core 13915 user: core
@@ -14589,10 +14156,10 @@
14589 desc: playing time screen 14156 desc: playing time screen
14590 user: core 14157 user: core
14591 <source> 14158 <source>
14592 *: "Track elapsed: %s / %s %ld%%" 14159 *: "Track elapsed:"
14593 </source> 14160 </source>
14594 <dest> 14161 <dest>
14595 *: "Traccia trascorsa: %s / %s %ld%%" 14162 *: "Traccia trascorsa:"
14596 </dest> 14163 </dest>
14597 <voice> 14164 <voice>
14598 *: "Traccia trascorsa" 14165 *: "Traccia trascorsa"
@@ -14603,10 +14170,10 @@
14603 desc: playing time screen 14170 desc: playing time screen
14604 user: core 14171 user: core
14605 <source> 14172 <source>
14606 *: "Storage: %s (done %s, remaining %s)" 14173 *: "Storage (Done / Remaining):"
14607 </source> 14174 </source>
14608 <dest> 14175 <dest>
14609 *: "Memoria: %s (fatto %s, restante %s)" 14176 *: "Memoria (Usata / Rimanente):"
14610 </dest> 14177 </dest>
14611 <voice> 14178 <voice>
14612 *: "Memoria" 14179 *: "Memoria"
@@ -14701,10 +14268,10 @@
14701 desc: playing time screen 14268 desc: playing time screen
14702 user: core 14269 user: core
14703 <source> 14270 <source>
14704 *: "Playlist elapsed: %s / %s %ld%%" 14271 *: "Playlist elapsed:"
14705 </source> 14272 </source>
14706 <dest> 14273 <dest>
14707 *: "Playlist trascorsa: %s / %s %ld%%" 14274 *: "Playlist trascorsa:"
14708 </dest> 14275 </dest>
14709 <voice> 14276 <voice>
14710 *: "Playlist trascorsa" 14277 *: "Playlist trascorsa"
@@ -14735,7 +14302,7 @@
14735 *: "Rifletto..." 14302 *: "Rifletto..."
14736 </dest> 14303 </dest>
14737 <voice> 14304 <voice>
14738 *: "" 14305 *: "Rifletto"
14739 </voice> 14306 </voice>
14740</phrase> 14307</phrase>
14741<phrase> 14308<phrase>
@@ -14879,20 +14446,6 @@
14879 </voice> 14446 </voice>
14880</phrase> 14447</phrase>
14881<phrase> 14448<phrase>
14882 id: LANG_CLEAR_PLAYLIST
14883 desc: deprecated
14884 user: core
14885 <source>
14886 *: ""
14887 </source>
14888 <dest>
14889 *: ""
14890 </dest>
14891 <voice>
14892 *: ""
14893 </voice>
14894</phrase>
14895<phrase>
14896 id: LANG_NOT_A_VBR_FILE 14449 id: LANG_NOT_A_VBR_FILE
14897 desc: in vbrfix plugin 14450 desc: in vbrfix plugin
14898 user: core 14451 user: core
@@ -15117,10 +14670,10 @@
15117 *: "Timeout" 14670 *: "Timeout"
15118 </source> 14671 </source>
15119 <dest> 14672 <dest>
15120 *: "Timeout" 14673 *: "~Timeout"
15121 </dest> 14674 </dest>
15122 <voice> 14675 <voice>
15123 *: "Timeout" 14676 *: "~Timeout"
15124 </voice> 14677 </voice>
15125</phrase> 14678</phrase>
15126<phrase> 14679<phrase>
@@ -15282,11 +14835,11 @@
15282 lowmem: none 14835 lowmem: none
15283 </source> 14836 </source>
15284 <dest> 14837 <dest>
15285 *: "Sample Rate" 14838 *: "~Sample Rate"
15286 lowmem: none 14839 lowmem: none
15287 </dest> 14840 </dest>
15288 <voice> 14841 <voice>
15289 *: "Sample Rate" 14842 *: "~Sample Rate"
15290 lowmem: none 14843 lowmem: none
15291 </voice> 14844 </voice>
15292</phrase> 14845</phrase>
@@ -15507,20 +15060,6 @@
15507 </voice> 15060 </voice>
15508</phrase> 15061</phrase>
15509<phrase> 15062<phrase>
15510 id: LANG_CLEAR_LIST_AND_PLAY_NEXT
15511 desc: deprecated
15512 user: core
15513 <source>
15514 *: ""
15515 </source>
15516 <dest>
15517 *: ""
15518 </dest>
15519 <voice>
15520 *: ""
15521 </voice>
15522</phrase>
15523<phrase>
15524 id: LANG_DAC_POWER_MODE 15063 id: LANG_DAC_POWER_MODE
15525 desc: in sound settings 15064 desc: in sound settings
15526 user: core 15065 user: core
@@ -15591,7 +15130,7 @@
15591 *: "Coda..." 15130 *: "Coda..."
15592 </dest> 15131 </dest>
15593 <voice> 15132 <voice>
15594 *: "Coda..." 15133 *: "Coda"
15595 </voice> 15134 </voice>
15596</phrase> 15135</phrase>
15597<phrase> 15136<phrase>
@@ -15637,20 +15176,6 @@
15637 </voice> 15176 </voice>
15638</phrase> 15177</phrase>
15639<phrase> 15178<phrase>
15640 id: LANG_CLEAR_LIST_AND_PLAY_SHUFFLED
15641 desc: deprecated
15642 user: core
15643 <source>
15644 *: ""
15645 </source>
15646 <dest>
15647 *: ""
15648 </dest>
15649 <voice>
15650 *: ""
15651 </voice>
15652</phrase>
15653<phrase>
15654 id: LANG_SOFTLOCK_DISABLE_ALL_NOTIFY 15179 id: LANG_SOFTLOCK_DISABLE_ALL_NOTIFY
15655 desc: disable all softlock notifications 15180 desc: disable all softlock notifications
15656 user: core 15181 user: core
@@ -15716,11 +15241,11 @@
15716 </source> 15241 </source>
15717 <dest> 15242 <dest>
15718 *: none 15243 *: none
15719 filter_roll_off: "Super Slow" 15244 filter_roll_off: "Super Lento"
15720 </dest> 15245 </dest>
15721 <voice> 15246 <voice>
15722 *: none 15247 *: none
15723 filter_roll_off: "Super Slow" 15248 filter_roll_off: "Super Lento"
15724 </voice> 15249 </voice>
15725</phrase> 15250</phrase>
15726<phrase> 15251<phrase>
@@ -15733,11 +15258,11 @@
15733 </source> 15258 </source>
15734 <dest> 15259 <dest>
15735 *: none 15260 *: none
15736 es9218: "Linear Fast" 15261 es9218: "Lineare Veloce"
15737 </dest> 15262 </dest>
15738 <voice> 15263 <voice>
15739 *: none 15264 *: none
15740 es9218: "Linear Fast" 15265 es9218: "Lineare Veloce"
15741 </voice> 15266 </voice>
15742</phrase> 15267</phrase>
15743<phrase> 15268<phrase>
@@ -15750,11 +15275,11 @@
15750 </source> 15275 </source>
15751 <dest> 15276 <dest>
15752 *: none 15277 *: none
15753 es9218: "Linear Slow" 15278 es9218: "Lineare Lento"
15754 </dest> 15279 </dest>
15755 <voice> 15280 <voice>
15756 *: none 15281 *: none
15757 es9218: "Linear Slow" 15282 es9218: "Lineare Lento"
15758 </voice> 15283 </voice>
15759</phrase> 15284</phrase>
15760<phrase> 15285<phrase>
@@ -15767,11 +15292,11 @@
15767 </source> 15292 </source>
15768 <dest> 15293 <dest>
15769 *: none 15294 *: none
15770 es9218: "Minimum Fast" 15295 es9218: "Minimo Veloce"
15771 </dest> 15296 </dest>
15772 <voice> 15297 <voice>
15773 *: none 15298 *: none
15774 es9218: "Minimum Fast" 15299 es9218: "Minimo Veloce"
15775 </voice> 15300 </voice>
15776</phrase> 15301</phrase>
15777<phrase> 15302<phrase>
@@ -15784,11 +15309,11 @@
15784 </source> 15309 </source>
15785 <dest> 15310 <dest>
15786 *: none 15311 *: none
15787 es9218: "Minimum Slow" 15312 es9218: "Minimo Lento"
15788 </dest> 15313 </dest>
15789 <voice> 15314 <voice>
15790 *: none 15315 *: none
15791 es9218: "Minimum Slow" 15316 es9218: "Minimo Lento"
15792 </voice> 15317 </voice>
15793</phrase> 15318</phrase>
15794<phrase> 15319<phrase>
@@ -15801,11 +15326,11 @@
15801 </source> 15326 </source>
15802 <dest> 15327 <dest>
15803 *: none 15328 *: none
15804 es9218: "Apodizing type 1" 15329 es9218: "Apodizing tipo 1"
15805 </dest> 15330 </dest>
15806 <voice> 15331 <voice>
15807 *: none 15332 *: none
15808 es9218: "Apodizing type 1" 15333 es9218: "Apodizing tipo 1"
15809 </voice> 15334 </voice>
15810</phrase> 15335</phrase>
15811<phrase> 15336<phrase>
@@ -15818,11 +15343,11 @@
15818 </source> 15343 </source>
15819 <dest> 15344 <dest>
15820 *: none 15345 *: none
15821 es9218: "Apodizing type 2" 15346 es9218: "Apodizing tipo 2"
15822 </dest> 15347 </dest>
15823 <voice> 15348 <voice>
15824 *: none 15349 *: none
15825 es9218: "Apodizing type 2" 15350 es9218: "Apodizing tipo 2"
15826 </voice> 15351 </voice>
15827</phrase> 15352</phrase>
15828<phrase> 15353<phrase>
@@ -15835,11 +15360,11 @@
15835 </source> 15360 </source>
15836 <dest> 15361 <dest>
15837 *: none 15362 *: none
15838 es9218: "Hybrid Fast" 15363 es9218: "Ibrido Veloce"
15839 </dest> 15364 </dest>
15840 <voice> 15365 <voice>
15841 *: none 15366 *: none
15842 es9218: "Hybrid Fast" 15367 es9218: "Ibrido Veloce"
15843 </voice> 15368 </voice>
15844</phrase> 15369</phrase>
15845<phrase> 15370<phrase>
@@ -15852,151 +15377,11 @@
15852 </source> 15377 </source>
15853 <dest> 15378 <dest>
15854 *: none 15379 *: none
15855 es9218: "Brick Wall" 15380 es9218: "~Brick Wall"
15856 </dest> 15381 </dest>
15857 <voice> 15382 <voice>
15858 *: none 15383 *: none
15859 es9218: "Brick Wall" 15384 es9218: "~Brick Wall"
15860 </voice>
15861</phrase>
15862<phrase>
15863 id: LANG_PLAYLIST_RELOAD_AFTER_SAVE
15864 desc: deprecated
15865 user: core
15866 <source>
15867 *: ""
15868 </source>
15869 <dest>
15870 *: ""
15871 </dest>
15872 <voice>
15873 *: ""
15874 </voice>
15875</phrase>
15876<phrase>
15877 id: LANG_PROPERTIES_ALBUMARTIST
15878 desc: deprecated
15879 user: core
15880 <source>
15881 *: ""
15882 </source>
15883 <dest>
15884 *: ""
15885 </dest>
15886 <voice>
15887 *: ""
15888 </voice>
15889</phrase>
15890<phrase>
15891 id: LANG_PROPERTIES_GENRE
15892 desc: deprecated
15893 user: core
15894 <source>
15895 *: ""
15896 </source>
15897 <dest>
15898 *: ""
15899 </dest>
15900 <voice>
15901 *: ""
15902 </voice>
15903</phrase>
15904<phrase>
15905 id: LANG_PROPERTIES_COMMENT
15906 desc: deprecated
15907 user: core
15908 <source>
15909 *: ""
15910 </source>
15911 <dest>
15912 *: ""
15913 </dest>
15914 <voice>
15915 *: ""
15916 </voice>
15917</phrase>
15918<phrase>
15919 id: LANG_PROPERTIES_COMPOSER
15920 desc: deprecated
15921 user: core
15922 <source>
15923 *: ""
15924 </source>
15925 <dest>
15926 *: ""
15927 </dest>
15928 <voice>
15929 *: ""
15930 </voice>
15931</phrase>
15932<phrase>
15933 id: LANG_PROPERTIES_YEAR
15934 desc: deprecated
15935 user: core
15936 <source>
15937 *: ""
15938 </source>
15939 <dest>
15940 *: ""
15941 </dest>
15942 <voice>
15943 *: ""
15944 </voice>
15945</phrase>
15946<phrase>
15947 id: LANG_PROPERTIES_TRACKNUM
15948 desc: deprecated
15949 user: core
15950 <source>
15951 *: ""
15952 </source>
15953 <dest>
15954 *: ""
15955 </dest>
15956 <voice>
15957 *: ""
15958 </voice>
15959</phrase>
15960<phrase>
15961 id: LANG_PROPERTIES_DISCNUM
15962 desc: deprecated
15963 user: core
15964 <source>
15965 *: ""
15966 </source>
15967 <dest>
15968 *: ""
15969 </dest>
15970 <voice>
15971 *: ""
15972 </voice>
15973</phrase>
15974<phrase>
15975 id: LANG_PROPERTIES_FREQUENCY
15976 desc: deprecated
15977 user: core
15978 <source>
15979 *: ""
15980 </source>
15981 <dest>
15982 *: ""
15983 </dest>
15984 <voice>
15985 *: ""
15986 </voice>
15987</phrase>
15988<phrase>
15989 id: LANG_PROPERTIES_BITRATE
15990 desc: deprecated
15991 user: core
15992 <source>
15993 *: ""
15994 </source>
15995 <dest>
15996 *: ""
15997 </dest>
15998 <voice>
15999 *: ""
16000 </voice> 15385 </voice>
16001</phrase> 15386</phrase>
16002<phrase> 15387<phrase>
@@ -16341,7 +15726,7 @@
16341 *: "Imposta Come..." 15726 *: "Imposta Come..."
16342 </dest> 15727 </dest>
16343 <voice> 15728 <voice>
16344 *: "Imposta Come..." 15729 *: "Imposta Come"
16345 </voice> 15730 </voice>
16346</phrase> 15731</phrase>
16347<phrase> 15732<phrase>
@@ -16400,7 +15785,7 @@
16400 *: "Aggiungi alla Playlist..." 15785 *: "Aggiungi alla Playlist..."
16401 </dest> 15786 </dest>
16402 <voice> 15787 <voice>
16403 *: "Aggiungi alla Playlist..." 15788 *: "Aggiungi alla Playlist"
16404 </voice> 15789 </voice>
16405</phrase> 15790</phrase>
16406<phrase> 15791<phrase>
@@ -16428,7 +15813,7 @@
16428 *: "Riproduzione Brano Successivo..." 15813 *: "Riproduzione Brano Successivo..."
16429 </dest> 15814 </dest>
16430 <voice> 15815 <voice>
16431 *: "Riproduzione Brano Successivo..." 15816 *: "Riproduzione Brano Successivo"
16432 </voice> 15817 </voice>
16433</phrase> 15818</phrase>
16434<phrase> 15819<phrase>
@@ -16770,10 +16155,10 @@
16770 *: "Generating maze..." 16155 *: "Generating maze..."
16771 </source> 16156 </source>
16772 <dest> 16157 <dest>
16773 *: "Generating maze..." 16158 *: "Generazione del labirinto..."
16774 </dest> 16159 </dest>
16775 <voice> 16160 <voice>
16776 *: "Generating maze..." 16161 *: "Generazione del labirinto"
16777 </voice> 16162 </voice>
16778</phrase> 16163</phrase>
16779<phrase> 16164<phrase>
@@ -16874,3 +16259,157 @@
16874 *: "Italiano" 16259 *: "Italiano"
16875 </voice> 16260 </voice>
16876</phrase> 16261</phrase>
16262<phrase>
16263 id: LANG_STEREOSW_MODE
16264 desc: Stereo Switch Mode
16265 user: core
16266 <source>
16267 *: "Stereo Switch Mode"
16268 </source>
16269 <dest>
16270 *: "Modalità di Commutazione Stereo"
16271 </dest>
16272 <voice>
16273 *: "Modalità di Commutazione Stereo"
16274 </voice>
16275</phrase>
16276<phrase>
16277 id: LANG_REVERSE
16278 desc: in settings_menu
16279 user: core
16280 <source>
16281 *: "Reverse"
16282 </source>
16283 <dest>
16284 *: "Inversione"
16285 </dest>
16286 <voice>
16287 *: "Inversione"
16288 </voice>
16289</phrase>
16290<phrase>
16291 id: LANG_ALWAYS_ZERO
16292 desc: in settings_menu
16293 user: core
16294 <source>
16295 *: "Always 0"
16296 </source>
16297 <dest>
16298 *: "Sempre 0"
16299 </dest>
16300 <voice>
16301 *: "Sempre 0"
16302 </voice>
16303</phrase>
16304<phrase>
16305 id: LANG_ALWAYS_ONE
16306 desc: in settings_menu
16307 user: core
16308 <source>
16309 *: "Always 1"
16310 </source>
16311 <dest>
16312 *: "Sempre 1"
16313 </dest>
16314 <voice>
16315 *: "Sempre 1"
16316 </voice>
16317</phrase>
16318<phrase>
16319 id: LANG_LEGAL_NOTICES
16320 desc: in system menu
16321 user: core
16322 <source>
16323 *: "Legal Notices"
16324 </source>
16325 <dest>
16326 *: "Note Legali"
16327 </dest>
16328 <voice>
16329 *: "Note Legali"
16330 </voice>
16331</phrase>
16332<phrase>
16333 id: LANG_ERROR_FORMATSTR
16334 desc: for general use
16335 user: core
16336 <source>
16337 *: "Error: %s"
16338 </source>
16339 <dest>
16340 *: "Errore: %s"
16341 </dest>
16342 <voice>
16343 *: "Errore"
16344 </voice>
16345</phrase>
16346<phrase>
16347 id: LANG_MIKMOD_SETTINGS
16348 desc: mikmod plugin
16349 user: core
16350 <source>
16351 *: "Mikmod Settings"
16352 </source>
16353 <dest>
16354 *: "Impostazioni Mikmod"
16355 </dest>
16356 <voice>
16357 *: "Impostazioni Mik mod"
16358 </voice>
16359</phrase>
16360<phrase>
16361 id: LANG_MIKMOD_MENU
16362 desc: mikmod plugin
16363 user: core
16364 <source>
16365 *: "Mikmod Menu"
16366 </source>
16367 <dest>
16368 *: "Menu Mikmod"
16369 </dest>
16370 <voice>
16371 *: "Menu Mik mod"
16372 </voice>
16373</phrase>
16374<phrase>
16375 id: LANG_CHESSBOX_MENU
16376 desc: chessbox plugin
16377 user: core
16378 <source>
16379 *: "Chessbox Menu"
16380 </source>
16381 <dest>
16382 *: "Menu Chessbox"
16383 </dest>
16384 <voice>
16385 *: "Menu Chess box"
16386 </voice>
16387</phrase>
16388<phrase>
16389 id: VOICE_INVALID_VOICE_FILE
16390 desc: played if the voice file fails to load
16391 user: core
16392 <source>
16393 *: ""
16394 </source>
16395 <dest>
16396 *: ""
16397 </dest>
16398 <voice>
16399 *: "Fail della voce non valido"
16400 </voice>
16401</phrase>
16402<phrase>
16403 id: LANG_PERCENT_FORMAT
16404 desc: percent formatting ( `10%` is default , for `10 %` use '%ld %%' , for `%10` use '%%%ld' and so on)
16405 user: core
16406 <source>
16407 *: "%ld%%"
16408 </source>
16409 <dest>
16410 *: "~%ld%%"
16411 </dest>
16412 <voice>
16413 *: none
16414 </voice>
16415</phrase>
diff --git a/apps/onplay.c b/apps/onplay.c
index 4880af58f3..d468c0a545 100644
--- a/apps/onplay.c
+++ b/apps/onplay.c
@@ -65,12 +65,9 @@
65#include "shortcuts.h" 65#include "shortcuts.h"
66#include "misc.h" 66#include "misc.h"
67 67
68static int context;
69static const char *selected_file = NULL;
70static char selected_file_path[MAX_PATH];
71static int selected_file_attr = 0;
72static int onplay_result = ONPLAY_OK; 68static int onplay_result = ONPLAY_OK;
73static bool in_queue_submenu = false; 69static bool in_queue_submenu = false;
70
74static bool (*ctx_current_playlist_insert)(int position, bool queue, bool create_new); 71static bool (*ctx_current_playlist_insert)(int position, bool queue, bool create_new);
75static int (*ctx_add_to_playlist)(const char* playlist, bool new_playlist); 72static int (*ctx_add_to_playlist)(const char* playlist, bool new_playlist);
76extern struct menu_item_ex file_menu; /* settings_menu.c */ 73extern struct menu_item_ex file_menu; /* settings_menu.c */
@@ -84,6 +81,14 @@ extern struct menu_item_ex file_menu; /* settings_menu.c */
84 MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \ 81 MENU_ITEM_COUNT(sizeof( name##_)/sizeof(*name##_)), \
85 { (void*)name##_},{.callback_and_desc = & name##__}}; 82 { (void*)name##_},{.callback_and_desc = & name##__}};
86 83
84static struct selected_file
85{
86 char buf[MAX_PATH];
87 const char *path;
88 int attr;
89 int context;
90} selected_file;
91
87static struct clipboard 92static struct clipboard
88{ 93{
89 char path[MAX_PATH]; /* Clipped file's path */ 94 char path[MAX_PATH]; /* Clipped file's path */
@@ -91,6 +96,14 @@ static struct clipboard
91 unsigned int flags; /* Operation type flags */ 96 unsigned int flags; /* Operation type flags */
92} clipboard; 97} clipboard;
93 98
99/* set selected file (doesn't touch buffer) */
100static void selected_file_set(int context, const char *path, int attr)
101{
102 selected_file.path = path;
103 selected_file.attr = attr;
104 selected_file.context = context;
105}
106
94/* Empty the clipboard */ 107/* Empty the clipboard */
95static void clipboard_clear_selection(struct clipboard *clip) 108static void clipboard_clear_selection(struct clipboard *clip)
96{ 109{
@@ -149,20 +162,18 @@ static int bookmark_menu_callback(int action,
149 struct gui_synclist *this_list) 162 struct gui_synclist *this_list)
150{ 163{
151 (void) this_list; 164 (void) this_list;
152 switch (action) 165 if (action == ACTION_REQUEST_MENUITEM)
153 { 166 {
154 case ACTION_REQUEST_MENUITEM: 167 /* hide loading bookmarks menu if no bookmarks exist */
155 /* hide loading bookmarks menu if no bookmarks exist */ 168 if (this_item == &bookmark_load_menu_item)
156 if (this_item == &bookmark_load_menu_item) 169 {
157 { 170 if (!bookmark_exists())
158 if (!bookmark_exists()) 171 return ACTION_EXIT_MENUITEM;
159 return ACTION_EXIT_MENUITEM; 172 }
160 }
161 break;
162 case ACTION_EXIT_MENUITEM:
163 settings_save();
164 break;
165 } 173 }
174 else if (action == ACTION_EXIT_MENUITEM)
175 settings_save();
176
166 return action; 177 return action;
167} 178}
168 179
@@ -244,20 +255,20 @@ static struct add_to_pl_param addtopl_replace_shuffled = {PLAYLIST_INSERT_LAST_S
244static void op_playlist_insert_selected(int position, bool queue) 255static void op_playlist_insert_selected(int position, bool queue)
245{ 256{
246#ifdef HAVE_TAGCACHE 257#ifdef HAVE_TAGCACHE
247 if (context == CONTEXT_STD && ctx_current_playlist_insert != NULL) 258 if (selected_file.context == CONTEXT_STD && ctx_current_playlist_insert != NULL)
248 { 259 {
249 ctx_current_playlist_insert(position, queue, false); 260 ctx_current_playlist_insert(position, queue, false);
250 return; 261 return;
251 } 262 }
252#endif 263#endif
253 if ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_AUDIO) 264 if ((selected_file.attr & FILE_ATTR_MASK) == FILE_ATTR_AUDIO)
254 playlist_insert_track(NULL, selected_file, position, queue, true); 265 playlist_insert_track(NULL, selected_file.path, position, queue, true);
255 else if ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U) 266 else if ((selected_file.attr & FILE_ATTR_MASK) == FILE_ATTR_M3U)
256 playlist_insert_playlist(NULL, selected_file, position, queue); 267 playlist_insert_playlist(NULL, selected_file.path, position, queue);
257 else if (selected_file_attr & ATTR_DIRECTORY) 268 else if (selected_file.attr & ATTR_DIRECTORY)
258 { 269 {
259#ifdef HAVE_TAGCACHE 270#ifdef HAVE_TAGCACHE
260 if (context == CONTEXT_ID3DB) 271 if (selected_file.context == CONTEXT_ID3DB)
261 { 272 {
262 tagtree_current_playlist_insert(position, queue); 273 tagtree_current_playlist_insert(position, queue);
263 return; 274 return;
@@ -269,14 +280,14 @@ static void op_playlist_insert_selected(int position, bool queue)
269 280
270 const char *lines[] = { 281 const char *lines[] = {
271 ID2P(LANG_RECURSE_DIRECTORY_QUESTION), 282 ID2P(LANG_RECURSE_DIRECTORY_QUESTION),
272 selected_file 283 selected_file.path
273 }; 284 };
274 const struct text_message message={lines, 2}; 285 const struct text_message message={lines, 2};
275 /* Ask if user wants to recurse directory */ 286 /* Ask if user wants to recurse directory */
276 recurse = (gui_syncyesno_run(&message, NULL, NULL)==YESNO_YES); 287 recurse = (gui_syncyesno_run(&message, NULL, NULL)==YESNO_YES);
277 } 288 }
278 289
279 playlist_insert_directory(NULL, selected_file, position, queue, 290 playlist_insert_directory(NULL, selected_file.path, position, queue,
280 recurse == RECURSE_ON); 291 recurse == RECURSE_ON);
281 } 292 }
282} 293}
@@ -336,7 +347,7 @@ static bool view_playlist(void)
336{ 347{
337 bool result; 348 bool result;
338 349
339 result = playlist_viewer_ex(selected_file, NULL); 350 result = playlist_viewer_ex(selected_file.path, NULL);
340 351
341 if (result == PLAYLIST_VIEWER_OK && 352 if (result == PLAYLIST_VIEWER_OK &&
342 onplay_result == ONPLAY_OK) 353 onplay_result == ONPLAY_OK)
@@ -431,7 +442,7 @@ static int treeplaylist_callback(int action,
431 struct gui_synclist *this_list) 442 struct gui_synclist *this_list)
432{ 443{
433 (void)this_list; 444 (void)this_list;
434 int sel_file_attr = (selected_file_attr & FILE_ATTR_MASK); 445 int sel_file_attr = (selected_file.attr & FILE_ATTR_MASK);
435 446
436 switch (action) 447 switch (action)
437 { 448 {
@@ -440,7 +451,7 @@ static int treeplaylist_callback(int action,
440 { 451 {
441 if (sel_file_attr != FILE_ATTR_AUDIO && 452 if (sel_file_attr != FILE_ATTR_AUDIO &&
442 sel_file_attr != FILE_ATTR_M3U && 453 sel_file_attr != FILE_ATTR_M3U &&
443 (selected_file_attr & ATTR_DIRECTORY) == 0) 454 (selected_file.attr & ATTR_DIRECTORY) == 0)
444 return ACTION_EXIT_MENUITEM; 455 return ACTION_EXIT_MENUITEM;
445 } 456 }
446 else if (this_item == &queue_menu) 457 else if (this_item == &queue_menu)
@@ -471,7 +482,7 @@ static int treeplaylist_callback(int action,
471 return ACTION_EXIT_MENUITEM; 482 return ACTION_EXIT_MENUITEM;
472 483
473 if (sel_file_attr != FILE_ATTR_M3U && 484 if (sel_file_attr != FILE_ATTR_M3U &&
474 (selected_file_attr & ATTR_DIRECTORY) == 0) 485 (selected_file.attr & ATTR_DIRECTORY) == 0)
475 return ACTION_EXIT_MENUITEM; 486 return ACTION_EXIT_MENUITEM;
476 } 487 }
477 488
@@ -494,10 +505,8 @@ static int treeplaylist_callback(int action,
494 505
495void onplay_show_playlist_menu(const char* path, int attr, void (*playlist_insert_cb)) 506void onplay_show_playlist_menu(const char* path, int attr, void (*playlist_insert_cb))
496{ 507{
497 context = CONTEXT_STD;
498 ctx_current_playlist_insert = playlist_insert_cb; 508 ctx_current_playlist_insert = playlist_insert_cb;
499 selected_file = path; 509 selected_file_set(CONTEXT_STD, path, attr);
500 selected_file_attr = attr;
501 in_queue_submenu = false; 510 in_queue_submenu = false;
502 do_menu(&tree_playlist_menu, NULL, NULL, false); 511 do_menu(&tree_playlist_menu, NULL, NULL, false);
503} 512}
@@ -505,13 +514,13 @@ void onplay_show_playlist_menu(const char* path, int attr, void (*playlist_inser
505/* playlist catalog options */ 514/* playlist catalog options */
506static bool cat_add_to_a_playlist(void) 515static bool cat_add_to_a_playlist(void)
507{ 516{
508 return catalog_add_to_a_playlist(selected_file, selected_file_attr, 517 return catalog_add_to_a_playlist(selected_file.path, selected_file.attr,
509 false, NULL, ctx_add_to_playlist); 518 false, NULL, ctx_add_to_playlist);
510} 519}
511 520
512static bool cat_add_to_a_new_playlist(void) 521static bool cat_add_to_a_new_playlist(void)
513{ 522{
514 return catalog_add_to_a_playlist(selected_file, selected_file_attr, 523 return catalog_add_to_a_playlist(selected_file.path, selected_file.attr,
515 true, NULL, ctx_add_to_playlist); 524 true, NULL, ctx_add_to_playlist);
516} 525}
517 526
@@ -529,10 +538,8 @@ MAKE_ONPLAYMENU(cat_playlist_menu, ID2P(LANG_ADD_TO_PL),
529 538
530void onplay_show_playlist_cat_menu(const char* track_name, int attr, void (*add_to_pl_cb)) 539void onplay_show_playlist_cat_menu(const char* track_name, int attr, void (*add_to_pl_cb))
531{ 540{
532 context = CONTEXT_STD;
533 ctx_add_to_playlist = add_to_pl_cb; 541 ctx_add_to_playlist = add_to_pl_cb;
534 selected_file = track_name; 542 selected_file_set(CONTEXT_STD, track_name, attr);
535 selected_file_attr = attr;
536 do_menu(&cat_playlist_menu, NULL, NULL, false); 543 do_menu(&cat_playlist_menu, NULL, NULL, false);
537} 544}
538 545
@@ -542,24 +549,22 @@ static int cat_playlist_callback(int action,
542{ 549{
543 (void)this_item; 550 (void)this_item;
544 (void)this_list; 551 (void)this_list;
545 if (!selected_file || 552 if (!selected_file.path ||
546 (((selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) && 553 (((selected_file.attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) &&
547 ((selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_M3U) && 554 ((selected_file.attr & FILE_ATTR_MASK) != FILE_ATTR_M3U) &&
548 ((selected_file_attr & ATTR_DIRECTORY) == 0))) 555 ((selected_file.attr & ATTR_DIRECTORY) == 0)))
549 { 556 {
550 return ACTION_EXIT_MENUITEM; 557 return ACTION_EXIT_MENUITEM;
551 } 558 }
552 559
553 switch (action) 560 if (action == ACTION_REQUEST_MENUITEM)
554 { 561 {
555 case ACTION_REQUEST_MENUITEM: 562 if ((audio_status() & AUDIO_STATUS_PLAY)
556 if ((audio_status() & AUDIO_STATUS_PLAY) || context != CONTEXT_WPS) 563 || selected_file.context != CONTEXT_WPS)
557 { 564 {
558 return action; 565 return action;
559 } 566 }
560 else 567 return ACTION_EXIT_MENUITEM;
561 return ACTION_EXIT_MENUITEM;
562 break;
563 } 568 }
564 return action; 569 return action;
565} 570}
@@ -579,13 +584,13 @@ static void splash_failed(int lang_what, int err)
579 584
580static bool clipboard_cut(void) 585static bool clipboard_cut(void)
581{ 586{
582 return clipboard_clip(&clipboard, selected_file, selected_file_attr, 587 return clipboard_clip(&clipboard, selected_file.path, selected_file.attr,
583 PASTE_CUT); 588 PASTE_CUT);
584} 589}
585 590
586static bool clipboard_copy(void) 591static bool clipboard_copy(void)
587{ 592{
588 return clipboard_clip(&clipboard, selected_file, selected_file_attr, 593 return clipboard_clip(&clipboard, selected_file.path, selected_file.attr,
589 PASTE_COPY); 594 PASTE_COPY);
590} 595}
591 596
@@ -597,9 +602,6 @@ static int clipboard_paste(void)
597 602
598 int rc = copy_move_fileobject(clipboard.path, getcwd(NULL, 0), clipboard.flags); 603 int rc = copy_move_fileobject(clipboard.path, getcwd(NULL, 0), clipboard.flags);
599 604
600
601 clear_screen_buffer(true);
602
603 switch (rc) 605 switch (rc)
604 { 606 {
605 case FORC_CANCELLED: 607 case FORC_CANCELLED:
@@ -643,13 +645,10 @@ static int ratingitem_callback(int action,
643{ 645{
644 (void)this_item; 646 (void)this_item;
645 (void)this_list; 647 (void)this_list;
646 switch (action) 648 if (action == ACTION_REQUEST_MENUITEM)
647 { 649 {
648 case ACTION_REQUEST_MENUITEM: 650 if (!selected_file.path || !global_settings.runtimedb || !tagcache_is_usable())
649 if (!selected_file || !global_settings.runtimedb || 651 return ACTION_EXIT_MENUITEM;
650 !tagcache_is_usable())
651 return ACTION_EXIT_MENUITEM;
652 break;
653 } 652 }
654 return action; 653 return action;
655} 654}
@@ -676,13 +675,10 @@ static int view_cue_item_callback(int action,
676 (void)this_item; 675 (void)this_item;
677 (void)this_list; 676 (void)this_list;
678 struct mp3entry* id3 = audio_current_track(); 677 struct mp3entry* id3 = audio_current_track();
679 switch (action) 678 if (action == ACTION_REQUEST_MENUITEM)
680 { 679 {
681 case ACTION_REQUEST_MENUITEM: 680 if (!selected_file.path || !id3 || !id3->cuesheet)
682 if (!selected_file 681 return ACTION_EXIT_MENUITEM;
683 || !id3 || !id3->cuesheet)
684 return ACTION_EXIT_MENUITEM;
685 break;
686 } 682 }
687 return action; 683 return action;
688} 684}
@@ -712,7 +708,7 @@ MENUITEM_FUNCTION(pitch_screen_item, 0, ID2P(LANG_PITCH),
712 708
713static int clipboard_delete_selected_fileobject(void) 709static int clipboard_delete_selected_fileobject(void)
714{ 710{
715 int rc = delete_fileobject(selected_file); 711 int rc = delete_fileobject(selected_file.path);
716 if (rc < FORC_SUCCESS) { 712 if (rc < FORC_SUCCESS) {
717 splash_failed(LANG_DELETE, rc); 713 splash_failed(LANG_DELETE, rc);
718 } else if (rc == FORC_CANCELLED) { 714 } else if (rc == FORC_CANCELLED) {
@@ -747,7 +743,7 @@ static int clipboard_create_dir(void)
747 743
748static int clipboard_rename_selected_file(void) 744static int clipboard_rename_selected_file(void)
749{ 745{
750 int rc = rename_file(selected_file); 746 int rc = rename_file(selected_file.path);
751 747
752 show_result(rc, LANG_RENAME); 748 show_result(rc, LANG_RENAME);
753 749
@@ -777,7 +773,7 @@ MENUITEM_FUNCTION(create_dir_item, 0, ID2P(LANG_CREATE_DIR),
777/* other items */ 773/* other items */
778static bool list_viewers(void) 774static bool list_viewers(void)
779{ 775{
780 int ret = filetype_list_viewers(selected_file); 776 int ret = filetype_list_viewers(selected_file.path);
781 if (ret == PLUGIN_USB_CONNECTED) 777 if (ret == PLUGIN_USB_CONNECTED)
782 onplay_result = ONPLAY_RELOAD_DIR; 778 onplay_result = ONPLAY_RELOAD_DIR;
783 return false; 779 return false;
@@ -786,19 +782,19 @@ static bool list_viewers(void)
786#ifdef HAVE_TAGCACHE 782#ifdef HAVE_TAGCACHE
787static bool prepare_database_sel(void *param) 783static bool prepare_database_sel(void *param)
788{ 784{
789 if (context == CONTEXT_ID3DB && 785 if (selected_file.context == CONTEXT_ID3DB &&
790 (selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) 786 (selected_file.attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO)
791 { 787 {
792 if (!strcmp(param, "properties")) 788 if (!strcmp(param, "properties"))
793 strmemccpy(selected_file_path, MAKE_ACT_STR(ACTIVITY_DATABASEBROWSER), 789 strmemccpy(selected_file.buf, MAKE_ACT_STR(ACTIVITY_DATABASEBROWSER),
794 sizeof(selected_file_path)); 790 sizeof(selected_file.buf));
795 else if (!tagtree_get_subentry_filename(selected_file_path, MAX_PATH)) 791 else if (!tagtree_get_subentry_filename(selected_file.buf, MAX_PATH))
796 { 792 {
797 onplay_result = ONPLAY_RELOAD_DIR; 793 onplay_result = ONPLAY_RELOAD_DIR;
798 return false; 794 return false;
799 } 795 }
800 796
801 selected_file = selected_file_path; 797 selected_file.path = selected_file.buf;
802 } 798 }
803 return true; 799 return true;
804} 800}
@@ -810,7 +806,7 @@ static bool onplay_load_plugin(void *param)
810 if (!prepare_database_sel(param)) 806 if (!prepare_database_sel(param))
811 return false; 807 return false;
812#endif 808#endif
813 int ret = filetype_load_plugin((const char*)param, selected_file); 809 int ret = filetype_load_plugin((const char*)param, selected_file.path);
814 if (ret == PLUGIN_USB_CONNECTED) 810 if (ret == PLUGIN_USB_CONNECTED)
815 onplay_result = ONPLAY_RELOAD_DIR; 811 onplay_result = ONPLAY_RELOAD_DIR;
816 else if (ret == PLUGIN_GOTO_PLUGIN) 812 else if (ret == PLUGIN_GOTO_PLUGIN)
@@ -835,7 +831,7 @@ MENUITEM_FUNCTION_W_PARAM(pictureflow_item, 0, ID2P(LANG_ONPLAY_PICTUREFLOW),
835#endif 831#endif
836static bool onplay_add_to_shortcuts(void) 832static bool onplay_add_to_shortcuts(void)
837{ 833{
838 shortcuts_add(SHORTCUT_BROWSER, selected_file); 834 shortcuts_add(SHORTCUT_BROWSER, selected_file.path);
839 return false; 835 return false;
840} 836}
841MENUITEM_FUNCTION(add_to_faves_item, 0, ID2P(LANG_ADD_TO_FAVES), 837MENUITEM_FUNCTION(add_to_faves_item, 0, ID2P(LANG_ADD_TO_FAVES),
@@ -844,7 +840,7 @@ MENUITEM_FUNCTION(add_to_faves_item, 0, ID2P(LANG_ADD_TO_FAVES),
844 840
845static void set_dir_helper(char* dirnamebuf, size_t bufsz) 841static void set_dir_helper(char* dirnamebuf, size_t bufsz)
846{ 842{
847 path_append(dirnamebuf, selected_file, PA_SEP_HARD, bufsz); 843 path_append(dirnamebuf, selected_file.path, PA_SEP_HARD, bufsz);
848 settings_save(); 844 settings_save();
849} 845}
850 846
@@ -882,7 +878,7 @@ MENUITEM_FUNCTION(set_startdir_item, 0, ID2P(LANG_START_DIR),
882 878
883static bool set_catalogdir(void) 879static bool set_catalogdir(void)
884{ 880{
885 catalog_set_directory(selected_file); 881 catalog_set_directory(selected_file.path);
886 settings_save(); 882 settings_save();
887 return false; 883 return false;
888} 884}
@@ -893,7 +889,7 @@ MENUITEM_FUNCTION(set_catalogdir_item, 0, ID2P(LANG_PLAYLIST_DIR),
893static bool set_databasedir(void) 889static bool set_databasedir(void)
894{ 890{
895 struct tagcache_stat *tc_stat = tagcache_get_stat(); 891 struct tagcache_stat *tc_stat = tagcache_get_stat();
896 if (strcasecmp(selected_file, tc_stat->db_path)) 892 if (strcasecmp(selected_file.path, tc_stat->db_path))
897 { 893 {
898 splash(HZ, ID2P(LANG_PLEASE_REBOOT)); 894 splash(HZ, ID2P(LANG_PLEASE_REBOOT));
899 } 895 }
@@ -927,7 +923,7 @@ static int clipboard_callback(int action,
927 case ACTION_REQUEST_MENUITEM: 923 case ACTION_REQUEST_MENUITEM:
928#ifdef HAVE_MULTIVOLUME 924#ifdef HAVE_MULTIVOLUME
929 /* no rename+delete for volumes */ 925 /* no rename+delete for volumes */
930 if ((selected_file_attr & ATTR_VOLUME) && 926 if ((selected_file.attr & ATTR_VOLUME) &&
931 (this_item == &rename_file_item || 927 (this_item == &rename_file_item ||
932 this_item == &delete_dir_item || 928 this_item == &delete_dir_item ||
933 this_item == &clipboard_cut_item || 929 this_item == &clipboard_cut_item ||
@@ -935,7 +931,7 @@ static int clipboard_callback(int action,
935 return ACTION_EXIT_MENUITEM; 931 return ACTION_EXIT_MENUITEM;
936#endif 932#endif
937#ifdef HAVE_TAGCACHE 933#ifdef HAVE_TAGCACHE
938 if (context == CONTEXT_ID3DB) 934 if (selected_file.context == CONTEXT_ID3DB)
939 { 935 {
940 if (this_item == &track_info_item || 936 if (this_item == &track_info_item ||
941 this_item == &pictureflow_item) 937 this_item == &pictureflow_item)
@@ -953,21 +949,21 @@ static int clipboard_callback(int action,
953 { 949 {
954 return action; 950 return action;
955 } 951 }
956 else if (selected_file) 952 else if (selected_file.path)
957 { 953 {
958 /* requires an actual file */ 954 /* requires an actual file */
959 if (this_item == &rename_file_item || 955 if (this_item == &rename_file_item ||
960 this_item == &clipboard_cut_item || 956 this_item == &clipboard_cut_item ||
961 this_item == &clipboard_copy_item || 957 this_item == &clipboard_copy_item ||
962 (this_item == &track_info_item && 958 (this_item == &track_info_item &&
963 (selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_AUDIO) || 959 (selected_file.attr & FILE_ATTR_MASK) == FILE_ATTR_AUDIO) ||
964 (this_item == &properties_item && 960 (this_item == &properties_item &&
965 (selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) || 961 (selected_file.attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) ||
966 this_item == &add_to_faves_item) 962 this_item == &add_to_faves_item)
967 { 963 {
968 return action; 964 return action;
969 } 965 }
970 else if ((selected_file_attr & ATTR_DIRECTORY)) 966 else if ((selected_file.attr & ATTR_DIRECTORY))
971 { 967 {
972 /* only for directories */ 968 /* only for directories */
973 if (this_item == &delete_dir_item || 969 if (this_item == &delete_dir_item ||
@@ -992,7 +988,7 @@ static int clipboard_callback(int action,
992#if LCD_DEPTH > 1 988#if LCD_DEPTH > 1
993 else if (this_item == &set_backdrop_item) 989 else if (this_item == &set_backdrop_item)
994 { 990 {
995 char *suffix = strrchr(selected_file, '.'); 991 char *suffix = strrchr(selected_file.path, '.');
996 if (suffix) 992 if (suffix)
997 { 993 {
998 if (strcasecmp(suffix, ".bmp") == 0) 994 if (strcasecmp(suffix, ".bmp") == 0)
@@ -1066,8 +1062,8 @@ static int onplaymenu_callback(int action,
1066 case ACTION_REQUEST_MENUITEM: 1062 case ACTION_REQUEST_MENUITEM:
1067 if (this_item == &view_playlist_item) 1063 if (this_item == &view_playlist_item)
1068 { 1064 {
1069 if ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U && 1065 if ((selected_file.attr & FILE_ATTR_MASK) == FILE_ATTR_M3U &&
1070 context == CONTEXT_TREE) 1066 selected_file.context == CONTEXT_TREE)
1071 return action; 1067 return action;
1072 } 1068 }
1073 return ACTION_EXIT_MENUITEM; 1069 return ACTION_EXIT_MENUITEM;
@@ -1075,6 +1071,8 @@ static int onplaymenu_callback(int action,
1075 case ACTION_EXIT_MENUITEM: 1071 case ACTION_EXIT_MENUITEM:
1076 return ACTION_EXIT_AFTER_THIS_MENUITEM; 1072 return ACTION_EXIT_AFTER_THIS_MENUITEM;
1077 break; 1073 break;
1074 default:
1075 break;
1078 } 1076 }
1079 return action; 1077 return action;
1080} 1078}
@@ -1085,13 +1083,13 @@ static bool hotkey_delete_item(void)
1085{ 1083{
1086#ifdef HAVE_MULTIVOLUME 1084#ifdef HAVE_MULTIVOLUME
1087 /* no delete for volumes */ 1085 /* no delete for volumes */
1088 if (selected_file_attr & ATTR_VOLUME) 1086 if (selected_file.attr & ATTR_VOLUME)
1089 return false; 1087 return false;
1090#endif 1088#endif
1091 1089
1092#ifdef HAVE_TAGCACHE 1090#ifdef HAVE_TAGCACHE
1093 if (context == CONTEXT_ID3DB && 1091 if (selected_file.context == CONTEXT_ID3DB &&
1094 (selected_file_attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) 1092 (selected_file.attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO)
1095 return false; 1093 return false;
1096#endif 1094#endif
1097 1095
@@ -1101,10 +1099,10 @@ static bool hotkey_delete_item(void)
1101static bool hotkey_open_with(void) 1099static bool hotkey_open_with(void)
1102{ 1100{
1103 /* only open files */ 1101 /* only open files */
1104 if (selected_file_attr & ATTR_DIRECTORY) 1102 if (selected_file.attr & ATTR_DIRECTORY)
1105 return false; 1103 return false;
1106#ifdef HAVE_MULTIVOLUME 1104#ifdef HAVE_MULTIVOLUME
1107 if (selected_file_attr & ATTR_VOLUME) 1105 if (selected_file.attr & ATTR_VOLUME)
1108 return false; 1106 return false;
1109#endif 1107#endif
1110 return list_viewers(); 1108 return list_viewers();
@@ -1113,8 +1111,8 @@ static bool hotkey_open_with(void)
1113static int hotkey_tree_pl_insert_shuffled(void) 1111static int hotkey_tree_pl_insert_shuffled(void)
1114{ 1112{
1115 if ((audio_status() & AUDIO_STATUS_PLAY) || 1113 if ((audio_status() & AUDIO_STATUS_PLAY) ||
1116 (selected_file_attr & ATTR_DIRECTORY) || 1114 (selected_file.attr & ATTR_DIRECTORY) ||
1117 ((selected_file_attr & FILE_ATTR_MASK) == FILE_ATTR_M3U)) 1115 ((selected_file.attr & FILE_ATTR_MASK) == FILE_ATTR_M3U))
1118 { 1116 {
1119 add_to_playlist(&addtopl_insert_shuf); 1117 add_to_playlist(&addtopl_insert_shuf);
1120 } 1118 }
@@ -1127,7 +1125,7 @@ static int hotkey_tree_run_plugin(void *param)
1127 if (!prepare_database_sel(param)) 1125 if (!prepare_database_sel(param))
1128 return ONPLAY_RELOAD_DIR; 1126 return ONPLAY_RELOAD_DIR;
1129#endif 1127#endif
1130 if (filetype_load_plugin((const char*)param, selected_file) == PLUGIN_GOTO_WPS) 1128 if (filetype_load_plugin((const char*)param, selected_file.path) == PLUGIN_GOTO_WPS)
1131 return ONPLAY_START_PLAY; 1129 return ONPLAY_START_PLAY;
1132 1130
1133 return ONPLAY_RELOAD_DIR; 1131 return ONPLAY_RELOAD_DIR;
@@ -1253,15 +1251,15 @@ static int execute_hotkey(bool is_wps)
1253} 1251}
1254#endif /* HOTKEY */ 1252#endif /* HOTKEY */
1255 1253
1256int onplay(char* file, int attr, int from, bool hotkey) 1254int onplay(char* file, int attr, int from_context, bool hotkey)
1257{ 1255{
1258 const struct menu_item_ex *menu; 1256 const struct menu_item_ex *menu;
1259 onplay_result = ONPLAY_OK; 1257 onplay_result = ONPLAY_OK;
1260 context = from;
1261 ctx_current_playlist_insert = NULL; 1258 ctx_current_playlist_insert = NULL;
1262 selected_file = NULL; 1259 selected_file_set(from_context, NULL, attr);
1260
1263#ifdef HAVE_TAGCACHE 1261#ifdef HAVE_TAGCACHE
1264 if (context == CONTEXT_ID3DB && 1262 if (from_context == CONTEXT_ID3DB &&
1265 (attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO) 1263 (attr & FILE_ATTR_MASK) != FILE_ATTR_AUDIO)
1266 { 1264 {
1267 ctx_add_to_playlist = tagtree_add_to_playlist; 1265 ctx_add_to_playlist = tagtree_add_to_playlist;
@@ -1269,8 +1267,8 @@ int onplay(char* file, int attr, int from, bool hotkey)
1269 { 1267 {
1270 /* add a leading slash so that catalog_add_to_a_playlist 1268 /* add a leading slash so that catalog_add_to_a_playlist
1271 later prefills the name when creating a new playlist */ 1269 later prefills the name when creating a new playlist */
1272 snprintf(selected_file_path, MAX_PATH, "/%s", file); 1270 snprintf(selected_file.buf, MAX_PATH, "/%s", file);
1273 selected_file = selected_file_path; 1271 selected_file.path = selected_file.buf;
1274 } 1272 }
1275 } 1273 }
1276 else 1274 else
@@ -1279,22 +1277,22 @@ int onplay(char* file, int attr, int from, bool hotkey)
1279 ctx_add_to_playlist = NULL; 1277 ctx_add_to_playlist = NULL;
1280 if (file != NULL) 1278 if (file != NULL)
1281 { 1279 {
1282 strmemccpy(selected_file_path, file, MAX_PATH); 1280 strmemccpy(selected_file.buf, file, MAX_PATH);
1283 selected_file = selected_file_path; 1281 selected_file.path = selected_file.buf;
1284 } 1282 }
1285 1283
1286 } 1284 }
1287 selected_file_attr = attr;
1288 int menu_selection; 1285 int menu_selection;
1286
1289#ifdef HAVE_HOTKEY 1287#ifdef HAVE_HOTKEY
1290 if (hotkey) 1288 if (hotkey)
1291 return execute_hotkey(context == CONTEXT_WPS); 1289 return execute_hotkey(from_context == CONTEXT_WPS);
1292#else 1290#else
1293 (void)hotkey; 1291 (void)hotkey;
1294#endif 1292#endif
1295 1293
1296 push_current_activity(ACTIVITY_CONTEXTMENU); 1294 push_current_activity(ACTIVITY_CONTEXTMENU);
1297 if (context == CONTEXT_WPS) 1295 if (from_context == CONTEXT_WPS)
1298 menu = &wps_onplay_menu; 1296 menu = &wps_onplay_menu;
1299 else 1297 else
1300 menu = &tree_onplay_menu; 1298 menu = &tree_onplay_menu;
@@ -1303,23 +1301,22 @@ int onplay(char* file, int attr, int from, bool hotkey)
1303 if (get_current_activity() == ACTIVITY_CONTEXTMENU) /* Activity may have been */ 1301 if (get_current_activity() == ACTIVITY_CONTEXTMENU) /* Activity may have been */
1304 pop_current_activity(); /* popped already by menu item */ 1302 pop_current_activity(); /* popped already by menu item */
1305 1303
1306 switch (menu_selection) 1304
1307 { 1305 if (menu_selection == GO_TO_WPS)
1308 case GO_TO_WPS: 1306 return ONPLAY_START_PLAY;
1309 return ONPLAY_START_PLAY; 1307 if (menu_selection == GO_TO_ROOT)
1310 case GO_TO_ROOT: 1308 return ONPLAY_MAINMENU;
1311 case GO_TO_MAINMENU: 1309 if (menu_selection == GO_TO_MAINMENU)
1312 return ONPLAY_MAINMENU; 1310 return ONPLAY_MAINMENU;
1313 case GO_TO_PLAYLIST_VIEWER: 1311 if (menu_selection == GO_TO_PLAYLIST_VIEWER)
1314 return ONPLAY_PLAYLIST; 1312 return ONPLAY_PLAYLIST;
1315 case GO_TO_PLUGIN: 1313 if (menu_selection == GO_TO_PLUGIN)
1316 return ONPLAY_PLUGIN; 1314 return ONPLAY_PLUGIN;
1317 default: 1315
1318 return onplay_result; 1316 return onplay_result;
1319 }
1320} 1317}
1321 1318
1322int get_onplay_context(void) 1319int get_onplay_context(void)
1323{ 1320{
1324 return context; 1321 return selected_file.context;
1325} 1322}
diff --git a/apps/onplay.h b/apps/onplay.h
index ea1c2e6c38..74dc045db3 100644
--- a/apps/onplay.h
+++ b/apps/onplay.h
@@ -25,7 +25,7 @@
25#include "menu.h" 25#include "menu.h"
26#endif 26#endif
27 27
28int onplay(char* file, int attr, int from_screen, bool hotkey); 28int onplay(char* file, int attr, int from_context, bool hotkey);
29int get_onplay_context(void); 29int get_onplay_context(void);
30 30
31enum { 31enum {
diff --git a/bootloader/xduoox3.c b/bootloader/xduoox3.c
index ff6b81aa25..ac2d648e61 100644
--- a/bootloader/xduoox3.c
+++ b/bootloader/xduoox3.c
@@ -160,25 +160,6 @@ static int boot_rockbox(void)
160 } 160 }
161} 161}
162 162
163#if 0
164static void reset_configuration(void)
165{
166 int rc;
167
168 rc = disk_mount_all();
169 if (rc <= 0)
170 {
171 verbose = true;
172 error(EDISK,rc, true);
173 }
174
175 if(rename(ROCKBOX_DIR "/config.cfg", ROCKBOX_DIR "/config.old") == 0)
176 show_splash(HZ/2, "Configuration reset successfully!");
177 else
178 show_splash(HZ/2, "Couldn't reset configuration!");
179}
180#endif
181
182int main(void) 163int main(void)
183{ 164{
184 int rc; 165 int rc;
diff --git a/docs/MAINTAINERS b/docs/MAINTAINERS
index 07ab71c7bc..271fc4f86d 100644
--- a/docs/MAINTAINERS
+++ b/docs/MAINTAINERS
@@ -11,7 +11,7 @@ Rockbox Maintainers
11This file lists the people maintaining the different parts of the 11This file lists the people maintaining the different parts of the
12Rockbox project. 12Rockbox project.
13 13
14Note that there as of 2024-06, this file is pretty out of date. There 14Note that there as of 2024-07, this file is pretty out of date. There
15are only a handful of active contributors that try to maintain 15are only a handful of active contributors that try to maintain
16everything, and the best way to reach them is via the #rockbox IRC 16everything, and the best way to reach them is via the #rockbox IRC
17channel on libera.chat. 17channel on libera.chat.
@@ -27,11 +27,13 @@ NOTE: Port maintainers are simply developers who use a particular
27target on a daily basis and are therefore able to report issues 27target on a daily basis and are therefore able to report issues
28specific to that target. 28specific to that target.
29 29
30:AGPTek Rocker:Solomon Peachy 30:AGPTek Rocker: Solomon Peachy
31:Creative Zen Vision: 31:Creative Zen Vision:
32:Creative Zen Vision:M: Maurus Cuelenaere 32:Creative Zen Vision:M: Maurus Cuelenaere
33:Creative Zen Vision:M 60GB: 33:Creative Zen Vision:M 60GB:
34:Eros Q / K:Solomon Peachy 34:Eros Q / K (hosted): Solomon Peachy
35:Eros Q / K (native): Dana Conrad
36:FiiO M3K: Aidan MacDonald
35:Iriver H100/H115: Linus Nielsen Feltzing 37:Iriver H100/H115: Linus Nielsen Feltzing
36:Iriver H120/H140: Miika Pekkarinen, Linus Nielsen Feltzing 38:Iriver H120/H140: Miika Pekkarinen, Linus Nielsen Feltzing
37:Iriver H320/H340: Peter D'Hoye 39:Iriver H320/H340: Peter D'Hoye
@@ -41,6 +43,7 @@ specific to that target.
41:Ipod 4th Gen Grayscale: 43:Ipod 4th Gen Grayscale:
42:Ipod Color/Photo: Dave Chapman 44:Ipod Color/Photo: Dave Chapman
43:Ipod Video: 45:Ipod Video:
46:Ipod Classic:
44:Ipod Mini 1st Gen: 47:Ipod Mini 1st Gen:
45:Ipod Mini 2nd Gen: Jens Arnold 48:Ipod Mini 2nd Gen: Jens Arnold
46:Ipod Nano 1st Gen: Thom Johansen 49:Ipod Nano 1st Gen: Thom Johansen
@@ -51,6 +54,7 @@ specific to that target.
51:Iaudio M5: Marianne Arnold 54:Iaudio M5: Marianne Arnold
52:Iaudio M3: Jens Arnold 55:Iaudio M3: Jens Arnold
53:Onda VX747: Maurus Cuelenaere 56:Onda VX747: Maurus Cuelenaere
57:Shanling Q1: Aidan MacDonald
54:Sansa E200: Michael Sevakis, Barry Wardell 58:Sansa E200: Michael Sevakis, Barry Wardell
55:Sansa E200R: 59:Sansa E200R:
56:Sansa C200: 60:Sansa C200:
@@ -67,7 +71,7 @@ Core code (low-level)
67:LCD drivers: Michael Sevakis, Jens Arnold 71:LCD drivers: Michael Sevakis, Jens Arnold
68:Button drivers: Michael Sevakis 72:Button drivers: Michael Sevakis
69:Rolo: 73:Rolo:
70:ATA driver: Michael Sevakis 74:ATA driver: Solomon Peachy
71:MMC driver: Jens Arnold 75:MMC driver: Jens Arnold
72:SD driver: Barry Wardell 76:SD driver: Barry Wardell
73:FAT driver: Linus Nielsen Feltzing 77:FAT driver: Linus Nielsen Feltzing
@@ -90,7 +94,7 @@ Core code (Mid-level)
90:Profiling: 94:Profiling:
91:Screens API and GUI widgets: Kévin Ferrare 95:Screens API and GUI widgets: Kévin Ferrare
92:Settings API: Jonathan Gordon 96:Settings API: Jonathan Gordon
93:Language API: 97:Language API: Solomon Peachy
94:Menu API: Jonathan Gordon 98:Menu API: Jonathan Gordon
95:Button actions: Jonathan Gordon 99:Button actions: Jonathan Gordon
96 100
@@ -104,7 +108,7 @@ Core code (high-level)
104:Playlists: 108:Playlists:
105:Radio UI: 109:Radio UI:
106:Recording UI: Peter D'Hoye 110:Recording UI: Peter D'Hoye
107:Voice UI: Stéphane Doyon 111:Voice UI: Solomon Peachy
108:WPS: Nicolas Pennequin 112:WPS: Nicolas Pennequin
109:User interface: Jonathan Gordon 113:User interface: Jonathan Gordon
110 114
@@ -128,6 +132,7 @@ the person(s) named next to "General".
128 132
129:General: Solomon Peachy 133:General: Solomon Peachy
130:German: Wilfried Winkler 134:German: Wilfried Winkler
135:Italian: Alessio Lenzi
131:Polish: Adam Rak 136:Polish: Adam Rak
132 137
133Plugins 138Plugins
@@ -139,6 +144,7 @@ Plugins
139:XLCD library: 144:XLCD library:
140 145
141:alpine_cdc: 146:alpine_cdc:
147:amaze: Solomon Peachy
142:battery_bench: 148:battery_bench:
143:blackjack: 149:blackjack:
144:bounce: Daniel Stenberg 150:bounce: Daniel Stenberg
@@ -179,6 +185,7 @@ Plugins
179:metronome: 185:metronome:
180:midi2wav: Stepan Moskovchenko (though it's deprecated in favor of midiplay) 186:midi2wav: Stepan Moskovchenko (though it's deprecated in favor of midiplay)
181:midiplay: Stepan Moskovchenko 187:midiplay: Stepan Moskovchenko
188:mikmod: Solomon Peachy
182:minesweeper: Antoine Cellerier 189:minesweeper: Antoine Cellerier
183:mosaique: 190:mosaique:
184:mp3_encoder: 191:mp3_encoder:
@@ -196,6 +203,7 @@ Plugins
196:rockboy: 203:rockboy:
197:rocklife: Antoine Cellerier 204:rocklife: Antoine Cellerier
198:rockpaint: Antoine Cellerier 205:rockpaint: Antoine Cellerier
206:sdl: Franklin Wei
199:search: Linus Nielsen Feltzing 207:search: Linus Nielsen Feltzing
200:sliding_puzzle: 208:sliding_puzzle:
201:snake: 209:snake:
@@ -227,6 +235,7 @@ Plugins
227:wavview: Peter D'Hoye 235:wavview: Peter D'Hoye
228:wormlet: 236:wormlet:
229:xobox: Antoine Cellerier 237:xobox: Antoine Cellerier
238:xrick: Solomon Peachy
230:zxbox: 239:zxbox:
231 240
232 241
@@ -245,6 +254,7 @@ Codecs (Playback)
245:Musepack: Thom Johansen 254:Musepack: Thom Johansen
246:NSF: 255:NSF:
247:Ogg Vorbis: 256:Ogg Vorbis:
257:Opus:
248:Shorten: 258:Shorten:
249:SID: 259:SID:
250:SPC: Michael Sevakis 260:SPC: Michael Sevakis
@@ -267,12 +277,14 @@ Codecs (Recording)
267Bootloaders 277Bootloaders
268----------- 278-----------
269 279
280:HibyOS: Solomon Peachy
270:Iriver H1xx/H3xx: Miika Pekkarinen, Linus Nielsen Feltzing 281:Iriver H1xx/H3xx: Miika Pekkarinen, Linus Nielsen Feltzing
271:Iaudio X5/M5: Linus Nielsen Feltzing 282:Iaudio X5/M5: Linus Nielsen Feltzing
272:PortalPlayer (not ipod): Barry Wardell 283:PortalPlayer (not ipod): Barry Wardell
273:Ipod: Dave Chapman 284:Ipod: Dave Chapman
274:Gigabeat F/X: Barry Wardell 285:Gigabeat F/X: Barry Wardell
275 286:xDuoo X3: Solomon Peachy
287:x1000: Aidan MacDonald
276 288
277Build Tools 289Build Tools
278----------- 290-----------
@@ -288,12 +300,13 @@ Build Tools
288:codepages: 300:codepages:
289:uclpack: 301:uclpack:
290:wavtrim: Linus Nielsen Feltzing 302:wavtrim: Linus Nielsen Feltzing
291:voicefont: 303:voicefont: Solomon Peachy
292:scramble: Linus Nielsen Feltzing 304:scramble: Linus Nielsen Feltzing
293:descramble: Linus Nielsen Feltzing 305:descramble: Linus Nielsen Feltzing
294:mkinfo: Daniel Stenberg 306:mkinfo: Daniel Stenberg
295:voice.pl: Solomon Peachy 307:voice.pl: Solomon Peachy
296:genlang/updatelang: Solomon Peachy 308:genlang: Solomon Peachy
309:updatelang: Solomon Peachy
297 310
298Install Tools 311Install Tools
299------------- 312-------------
@@ -303,11 +316,10 @@ Install Tools
303:sansapatcher: Dave Chapman, Barry Wardell 316:sansapatcher: Dave Chapman, Barry Wardell
304:e200rpatcher: Dave Chapman 317:e200rpatcher: Dave Chapman
305 318
306
307Manual 319Manual
308------ 320------
309 321
310:Manual build system: 322:Manual build system: Solomon Peachy
311[What to put here - maintainers for chapters?] 323[What to put here - maintainers for chapters?]
312 324
313Utilities 325Utilities
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 75ea8b136e..4e6fcbf70c 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -1646,9 +1646,9 @@ target/mips/ingenic_jz47xx/kernel-jz4760.c
1646target/mips/ingenic_jz47xx/i2c-jz4760.c 1646target/mips/ingenic_jz47xx/i2c-jz4760.c
1647target/mips/ingenic_jz47xx/lcd-jz4760.c 1647target/mips/ingenic_jz47xx/lcd-jz4760.c
1648target/mips/ingenic_jz47xx/system-jz4760.c 1648target/mips/ingenic_jz47xx/system-jz4760.c
1649target/mips/ingenic_jz47xx/usb-jz4760.c
1650target/mips/ingenic_jz47xx/timer-jz4760.c 1649target/mips/ingenic_jz47xx/timer-jz4760.c
1651#ifndef BOOTLOADER 1650#ifndef BOOTLOADER
1651target/mips/ingenic_jz47xx/usb-jz4760.c
1652target/mips/ingenic_jz47xx/codec-jz4760.c 1652target/mips/ingenic_jz47xx/codec-jz4760.c
1653target/mips/ingenic_jz47xx/pcm-jz4760.c 1653target/mips/ingenic_jz47xx/pcm-jz4760.c
1654#endif /* BOOTLOADER */ 1654#endif /* BOOTLOADER */
diff --git a/firmware/export/config/xduoox3.h b/firmware/export/config/xduoox3.h
index 46e1a61712..0d413ad372 100644
--- a/firmware/export/config/xduoox3.h
+++ b/firmware/export/config/xduoox3.h
@@ -174,6 +174,7 @@
174/* Type of LCD */ 174/* Type of LCD */
175#define CONFIG_LCD LCD_XDUOOX3 175#define CONFIG_LCD LCD_XDUOOX3
176 176
177#ifndef BOOTLOADER
177/* USB On-the-go */ 178/* USB On-the-go */
178#define CONFIG_USBOTG USBOTG_JZ4760 179#define CONFIG_USBOTG USBOTG_JZ4760
179 180
@@ -189,6 +190,7 @@
189 190
190#define USB_NUM_ENDPOINTS 3 191#define USB_NUM_ENDPOINTS 3
191#define USB_DEVBSS_ATTR IBSS_ATTR 192#define USB_DEVBSS_ATTR IBSS_ATTR
193#endif /* !BOOTLOADER */
192 194
193#define BOOTFILE_EXT "x3" 195#define BOOTFILE_EXT "x3"
194#define BOOTFILE "rockbox." BOOTFILE_EXT 196#define BOOTFILE "rockbox." BOOTFILE_EXT
@@ -198,7 +200,7 @@
198 200
199#define ICODE_ATTR_TREMOR_NOT_MDCT 201#define ICODE_ATTR_TREMOR_NOT_MDCT
200 202
201#endif /* SIMULATOR */ 203#endif /* !SIMULATOR */
202 204
203/** Port-specific settings **/ 205/** Port-specific settings **/
204 206
diff --git a/firmware/target/hosted/lcd-linuxfb.c b/firmware/target/hosted/lcd-linuxfb.c
index 14c8c30f89..5dda5cf1cc 100644
--- a/firmware/target/hosted/lcd-linuxfb.c
+++ b/firmware/target/hosted/lcd-linuxfb.c
@@ -59,14 +59,21 @@ void lcd_init_device(void)
59 panicf("Cannot read framebuffer fixed information"); 59 panicf("Cannot read framebuffer fixed information");
60 } 60 }
61 61
62#if 0 62 if(ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) < 0)
63 /* check resolution and framebuffer size */
64 if(vinfo.xres != LCD_WIDTH || vinfo.yres != LCD_HEIGHT || vinfo.bits_per_pixel != LCD_DEPTH)
65 { 63 {
66 panicf("Unexpected framebuffer resolution: %dx%dx%d\n", vinfo.xres, 64 panicf("Cannot read framebuffer variable information");
67 vinfo.yres, vinfo.bits_per_pixel); 65 }
66
67 /* Make sure we match our desired bitdepth */
68 if (vinfo.bits_per_pixel != LCD_DEPTH || vinfo.xres != LCD_WIDTH || vinfo.yres != LCD_HEIGHT) {
69 vinfo.bits_per_pixel = LCD_DEPTH;
70 vinfo.xres = LCD_WIDTH;
71 vinfo.yres = LCD_HEIGHT;
72 if (ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo)) {
73 panicf("Cannot set framebuffer to %dx%dx%d",
74 vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);
75 }
68 } 76 }
69#endif
70 /* Note: we use a framebuffer size of width*height*bbp. We cannot trust the 77 /* Note: we use a framebuffer size of width*height*bbp. We cannot trust the
71 * values returned by the driver for line_length */ 78 * values returned by the driver for line_length */
72 79
@@ -77,11 +84,6 @@ void lcd_init_device(void)
77 panicf("Cannot map framebuffer"); 84 panicf("Cannot map framebuffer");
78 } 85 }
79 86
80 if(ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) < 0)
81 {
82 panicf("Cannot read framebuffer variable information");
83 }
84
85 memset(framebuffer, 0, finfo.smem_len); 87 memset(framebuffer, 0, finfo.smem_len);
86 88
87#ifdef HAVE_LCD_ENABLE 89#ifdef HAVE_LCD_ENABLE
diff --git a/firmware/target/mips/ingenic_jz47xx/app.lds b/firmware/target/mips/ingenic_jz47xx/app.lds
index 1d300fed82..29a973a0ca 100644
--- a/firmware/target/mips/ingenic_jz47xx/app.lds
+++ b/firmware/target/mips/ingenic_jz47xx/app.lds
@@ -37,15 +37,11 @@ SECTIONS
37{ 37{
38 . = DRAMORIG; 38 . = DRAMORIG;
39 39
40 .startup : 40 .text :
41 { 41 {
42 loadaddress = .; 42 loadaddress = .;
43 _loadaddress = .; 43 _loadaddress = .;
44 *(.startup.text); 44 *(.init.text);
45 } > DRAM
46
47 .text :
48 {
49 *(.text*); 45 *(.text*);
50#ifndef HAVE_INIT_ATTR 46#ifndef HAVE_INIT_ATTR
51 *(.init*); 47 *(.init*);
diff --git a/firmware/target/mips/ingenic_jz47xx/crt0.S b/firmware/target/mips/ingenic_jz47xx/crt0.S
index b73a43d8f2..ee203b3b4d 100644
--- a/firmware/target/mips/ingenic_jz47xx/crt0.S
+++ b/firmware/target/mips/ingenic_jz47xx/crt0.S
@@ -44,7 +44,7 @@
44 .extern main 44 .extern main
45 .global _start 45 .global _start
46 46
47 .section .startup.text,"ax",%progbits 47 .section .init.text
48 .set push 48 .set push
49 .set mips32 49 .set mips32
50 .set noreorder 50 .set noreorder
diff --git a/tools/configure b/tools/configure
index 35f4b6d107..04699cb3e4 100755
--- a/tools/configure
+++ b/tools/configure
@@ -435,6 +435,9 @@ simcc () {
435 else 435 else
436 echo "Your sdl-config does not know about static libs, falling back to shared library" 436 echo "Your sdl-config does not know about static libs, falling back to shared library"
437 sdlldopts=$($sdl --libs) 437 sdlldopts=$($sdl --libs)
438# if [ "$win32crosscompile" = "yes" ] ; then
439 LDOPTS=`echo $LDOPTS | sed -e s/-static//`
440# fi
438 fi 441 fi
439 GCCOPTS="$GCCOPTS ${sdlccopts}" 442 GCCOPTS="$GCCOPTS ${sdlccopts}"
440 LDOPTS="$LDOPTS ${sdlldopts}" 443 LDOPTS="$LDOPTS ${sdlldopts}"
@@ -4735,7 +4738,7 @@ cmdline=`echo $cmdline | sed -e s,--target=[a-zA-Z_0-9]\*,,g \
4735 -e s,--ram=[0-9]\*,,g \ 4738 -e s,--ram=[0-9]\*,,g \
4736 -e s,--rbdir=[./a-zA-Z0-9]\*,,g \ 4739 -e s,--rbdir=[./a-zA-Z0-9]\*,,g \
4737 -e s,--voice=[-_./a-zA-Z0-9]\*,,g \ 4740 -e s,--voice=[-_./a-zA-Z0-9]\*,,g \
4738 -e s,--type=[a-zA-Z]\*,,g` 4741 -e s,--type=[a-zA-Z0-9]\*,,g`
4739cmdline="$cmdline --target=\$(MODELNAME) --ram=\$(MEMORYSIZE) --rbdir=\$(RBDIR) --type=$btype$advopts" 4742cmdline="$cmdline --target=\$(MODELNAME) --ram=\$(MEMORYSIZE) --rbdir=\$(RBDIR) --type=$btype$advopts"
4740 4743
4741### end of cmdline 4744### end of cmdline
diff --git a/tools/release/voices.pl b/tools/release/voices.pl
index 42bf533118..1b08123673 100755
--- a/tools/release/voices.pl
+++ b/tools/release/voices.pl
@@ -68,12 +68,13 @@ sub buildit {
68# run make in tools first to make sure they're up-to-date 68# run make in tools first to make sure they're up-to-date
69`(cd tools && make ) >/dev/null 2>&1`; 69`(cd tools && make ) >/dev/null 2>&1`;
70 70
71my $home=$ENV{'HOME'}; 71if (!defined($ENV{'POOL'}) {
72 72 my $home=$ENV{'HOME'};
73my $pool="$home/tmp/rockbox-voices-$version/voice-pool"; 73 my $pool="$home/tmp/rockbox-voices-$version/voice-pool";
74`mkdir -p $pool`; 74 `mkdir -p $pool`;
75`rm -f $pool/*`; 75 $ENV{'POOL'}="$pool";
76$ENV{'POOL'}="$pool"; 76}
77# `rm -f $pool/*`;
77 78
78`mkdir -p $outdir`; 79`mkdir -p $outdir`;
79 80
diff --git a/tools/xduoox3-updatebl.sh b/tools/xduoox3-updatebl.sh
new file mode 100755
index 0000000000..efb52bff8c
--- /dev/null
+++ b/tools/xduoox3-updatebl.sh
@@ -0,0 +1,5 @@
1#!/bin/sh
2unzip $1 rockbox.bin
3dd if=bootloader-x3.bin of=rockbox.bin bs=2048 seek=4 conv=nocreat conv=notrunc
4zip -o $1 rockbox.bin rockbox-info.txt
5rm rockbox.bin