summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2003-01-29 13:20:22 +0000
committerBjörn Stenberg <bjorn@haxx.se>2003-01-29 13:20:22 +0000
commitefb165f65c860356d91b67e26ac1a5b8d4a2bd4d (patch)
treed13e539fa4028bf99594d6e21530e47c23bb8797
parent38bc30b0d62eadb904c320f7c0f5f2086b170ccc (diff)
downloadrockbox-efb165f65c860356d91b67e26ac1a5b8d4a2bd4d.tar.gz
rockbox-efb165f65c860356d91b67e26ac1a5b8d4a2bd4d.zip
Added basic playlist creation. Creates <dirname>.m3u in the parent directory, containing all mp3/mp2/mpa files found recursively. The process can be aborted with OFF or STOP.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3185 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/lang/english.lang10
-rw-r--r--apps/main_menu.c9
-rw-r--r--apps/tree.c101
-rw-r--r--apps/tree.h1
4 files changed, 117 insertions, 4 deletions
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 9e80f95cd2..14e3172269 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -1316,3 +1316,13 @@ id: LANG_ALARM_MOD_KEYS
1316desc: Shown key functions in alarm menu (for the RTC alarm mod). 1316desc: Shown key functions in alarm menu (for the RTC alarm mod).
1317eng: "PLAY=Set OFF=Cancel" 1317eng: "PLAY=Set OFF=Cancel"
1318new: 1318new:
1319
1320id: LANG_CREATE_PLAYLIST
1321desc: Menu option for creating a playlist
1322eng: "Create Playlist"
1323new:
1324
1325id: LANG_CREATING
1326desc: Screen feedback during playlist creation
1327eng: "Creating"
1328new:
diff --git a/apps/main_menu.c b/apps/main_menu.c
index 03406b4e8c..0b71d1d98a 100644
--- a/apps/main_menu.c
+++ b/apps/main_menu.c
@@ -257,14 +257,15 @@ bool main_menu(void)
257 struct menu_items items[] = { 257 struct menu_items items[] = {
258 { str(LANG_SOUND_SETTINGS), sound_menu }, 258 { str(LANG_SOUND_SETTINGS), sound_menu },
259 { str(LANG_GENERAL_SETTINGS), settings_menu }, 259 { str(LANG_GENERAL_SETTINGS), settings_menu },
260#ifdef HAVE_MAS3587F
261 { str(LANG_RECORDING), recording_screen },
262 { str(LANG_RECORDING_SETTINGS), recording_menu },
263#endif
264 { str(LANG_CREATE_PLAYLIST), create_playlist },
260 { str(LANG_SLEEP_TIMER), sleeptimer_screen }, 265 { str(LANG_SLEEP_TIMER), sleeptimer_screen },
261#ifdef HAVE_ALARM_MOD 266#ifdef HAVE_ALARM_MOD
262 { str(LANG_ALARM_MOD_ALARM_MENU), alarm_screen }, 267 { str(LANG_ALARM_MOD_ALARM_MENU), alarm_screen },
263#endif 268#endif
264#ifdef HAVE_MAS3587F
265 { str(LANG_RECORDING_SETTINGS), recording_menu },
266 { str(LANG_RECORDING), recording_screen },
267#endif
268#ifdef HAVE_LCD_BITMAP 269#ifdef HAVE_LCD_BITMAP
269#ifdef USE_GAMES 270#ifdef USE_GAMES
270 { str(LANG_GAMES), games_menu }, 271 { str(LANG_GAMES), games_menu },
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
1423static int plsize = 0;
1424static 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
1498bool 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
diff --git a/apps/tree.h b/apps/tree.h
index 25e653914c..6b8879001f 100644
--- a/apps/tree.h
+++ b/apps/tree.h
@@ -24,5 +24,6 @@
24void browse_root(void); 24void browse_root(void);
25void set_current_file(char *path); 25void set_current_file(char *path);
26bool dirbrowse(char *root); 26bool dirbrowse(char *root);
27bool create_playlist(void);
27 28
28#endif 29#endif