summaryrefslogtreecommitdiff
path: root/apps/tree.c
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 /apps/tree.c
parent38bc30b0d62eadb904c320f7c0f5f2086b170ccc (diff)
downloadrockbox-efb165f65c860356d91b67e26ac1a5b8d4a2bd4d.zip
rockbox-efb165f65c860356d91b67e26ac1a5b8d4a2bd4d.tar.gz
rockbox-efb165f65c860356d91b67e26ac1a5b8d4a2bd4d.tar.bz2
rockbox-efb165f65c860356d91b67e26ac1a5b8d4a2bd4d.tar.xz
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
Diffstat (limited to 'apps/tree.c')
-rw-r--r--apps/tree.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/apps/tree.c b/apps/tree.c
index 4923b97..d408e65 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -1419,3 +1419,104 @@ bool dirbrowse(char *root)
return false;
}
+
+static int plsize = 0;
+static bool add_dir(char* dirname, int fd)
+{
+ bool abort = false;
+ char buf[MAX_PATH/2]; /* saving a little stack... */
+
+ DEBUGF("add_dir(%s)\n",dirname);
+
+ /* check for user abort */
+#ifdef HAVE_PLAYER_KEYPAD
+ if (button_get(false) == BUTTON_STOP)
+#else
+ if (button_get(false) == BUTTON_OFF)
+#endif
+ return true;
+
+ DIR* dir = opendir(dirname);
+ if(!dir)
+ return true;
+
+ while (true) {
+ struct dirent *entry;
+
+ entry = readdir(dir);
+ if (!entry)
+ break;
+ if (entry->attribute & ATTR_DIRECTORY) {
+ if (!strcmp(entry->d_name, ".") ||
+ !strcmp(entry->d_name, ".."))
+ continue;
+ snprintf(buf, sizeof buf, "%s/%s", dirname, entry->d_name);
+ if (add_dir(buf,fd)) {
+ abort = true;
+ break;
+ }
+ }
+ else {
+ int x = strlen(entry->d_name);
+ if ((!strcasecmp(&entry->d_name[x-4], ".mp3")) ||
+ (!strcasecmp(&entry->d_name[x-4], ".mp2")) ||
+ (!strcasecmp(&entry->d_name[x-4], ".mpa")))
+ {
+ DEBUGF("adding %s\n",entry->d_name);
+ write(fd, dirname, strlen(dirname));
+ write(fd, "/", 1);
+ write(fd, entry->d_name, x);
+ write(fd, "\n", 1);
+
+ plsize++;
+ snprintf(buf, sizeof buf, "%d", plsize);
+#ifdef HAVE_LCD_BITMAP
+ lcd_puts(0,4,buf);
+ lcd_update();
+#else
+ x = 10;
+ if (plsize > 999)
+ x=7;
+ else {
+ if (plsize > 99)
+ x=8;
+ else {
+ if (plsize > 9)
+ x=9;
+ }
+ }
+ lcd_puts(x,0,buf);
+#endif
+ }
+ }
+ }
+ closedir(dir);
+
+ return abort;
+}
+
+bool create_playlist(void)
+{
+ int fd;
+ char filename[MAX_PATH];
+
+ snprintf(filename, sizeof filename, "%s.m3u",
+ currdir[1] ? currdir : "/root");
+
+ lcd_clear_display();
+ lcd_puts(0,0,str(LANG_CREATING));
+ lcd_puts_scroll(0,1,filename);
+ lcd_update();
+
+ fd = creat(filename,0);
+ if (!fd)
+ return false;
+
+ plsize = 0;
+ add_dir(currdir[1] ? currdir : "/", fd);
+ close(fd);
+ sleep(HZ);
+
+ return false;
+}
+