diff options
Diffstat (limited to 'apps/tree.c')
-rw-r--r-- | apps/tree.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/apps/tree.c b/apps/tree.c index 4923b970b8..d408e65eb8 100644 --- a/apps/tree.c +++ b/apps/tree.c | |||
@@ -1419,3 +1419,104 @@ bool dirbrowse(char *root) | |||
1419 | 1419 | ||
1420 | return false; | 1420 | return false; |
1421 | } | 1421 | } |
1422 | |||
1423 | static int plsize = 0; | ||
1424 | static bool add_dir(char* dirname, int fd) | ||
1425 | { | ||
1426 | bool abort = false; | ||
1427 | char buf[MAX_PATH/2]; /* saving a little stack... */ | ||
1428 | |||
1429 | DEBUGF("add_dir(%s)\n",dirname); | ||
1430 | |||
1431 | /* check for user abort */ | ||
1432 | #ifdef HAVE_PLAYER_KEYPAD | ||
1433 | if (button_get(false) == BUTTON_STOP) | ||
1434 | #else | ||
1435 | if (button_get(false) == BUTTON_OFF) | ||
1436 | #endif | ||
1437 | return true; | ||
1438 | |||
1439 | DIR* dir = opendir(dirname); | ||
1440 | if(!dir) | ||
1441 | return true; | ||
1442 | |||
1443 | while (true) { | ||
1444 | struct dirent *entry; | ||
1445 | |||
1446 | entry = readdir(dir); | ||
1447 | if (!entry) | ||
1448 | break; | ||
1449 | if (entry->attribute & ATTR_DIRECTORY) { | ||
1450 | if (!strcmp(entry->d_name, ".") || | ||
1451 | !strcmp(entry->d_name, "..")) | ||
1452 | continue; | ||
1453 | snprintf(buf, sizeof buf, "%s/%s", dirname, entry->d_name); | ||
1454 | if (add_dir(buf,fd)) { | ||
1455 | abort = true; | ||
1456 | break; | ||
1457 | } | ||
1458 | } | ||
1459 | else { | ||
1460 | int x = strlen(entry->d_name); | ||
1461 | if ((!strcasecmp(&entry->d_name[x-4], ".mp3")) || | ||
1462 | (!strcasecmp(&entry->d_name[x-4], ".mp2")) || | ||
1463 | (!strcasecmp(&entry->d_name[x-4], ".mpa"))) | ||
1464 | { | ||
1465 | DEBUGF("adding %s\n",entry->d_name); | ||
1466 | write(fd, dirname, strlen(dirname)); | ||
1467 | write(fd, "/", 1); | ||
1468 | write(fd, entry->d_name, x); | ||
1469 | write(fd, "\n", 1); | ||
1470 | |||
1471 | plsize++; | ||
1472 | snprintf(buf, sizeof buf, "%d", plsize); | ||
1473 | #ifdef HAVE_LCD_BITMAP | ||
1474 | lcd_puts(0,4,buf); | ||
1475 | lcd_update(); | ||
1476 | #else | ||
1477 | x = 10; | ||
1478 | if (plsize > 999) | ||
1479 | x=7; | ||
1480 | else { | ||
1481 | if (plsize > 99) | ||
1482 | x=8; | ||
1483 | else { | ||
1484 | if (plsize > 9) | ||
1485 | x=9; | ||
1486 | } | ||
1487 | } | ||
1488 | lcd_puts(x,0,buf); | ||
1489 | #endif | ||
1490 | } | ||
1491 | } | ||
1492 | } | ||
1493 | closedir(dir); | ||
1494 | |||
1495 | return abort; | ||
1496 | } | ||
1497 | |||
1498 | bool create_playlist(void) | ||
1499 | { | ||
1500 | int fd; | ||
1501 | char filename[MAX_PATH]; | ||
1502 | |||
1503 | snprintf(filename, sizeof filename, "%s.m3u", | ||
1504 | currdir[1] ? currdir : "/root"); | ||
1505 | |||
1506 | lcd_clear_display(); | ||
1507 | lcd_puts(0,0,str(LANG_CREATING)); | ||
1508 | lcd_puts_scroll(0,1,filename); | ||
1509 | lcd_update(); | ||
1510 | |||
1511 | fd = creat(filename,0); | ||
1512 | if (!fd) | ||
1513 | return false; | ||
1514 | |||
1515 | plsize = 0; | ||
1516 | add_dir(currdir[1] ? currdir : "/", fd); | ||
1517 | close(fd); | ||
1518 | sleep(HZ); | ||
1519 | |||
1520 | return false; | ||
1521 | } | ||
1522 | |||