static bool add_dir(char* dirname, int len, int fd) { bool abort = false; DIRCACHED* dir; /* check for user abort */ if (action_userabort(TIMEOUT_NOBLOCK)) return true; dir = opendir_cached(dirname); if(!dir) return true; while (true) { struct dircache_entry *entry; entry = readdir_cached(dir); if (!entry) break; if (entry->attribute & ATTR_DIRECTORY) { int dirlen = strlen(dirname); bool result; if (!strcmp((char *)entry->d_name, ".") || !strcmp((char *)entry->d_name, "..")) continue; if (dirname[1]) snprintf(dirname+dirlen, len-dirlen, "/%s", entry->d_name); else snprintf(dirname, len, "/%s", entry->d_name); result = add_dir(dirname, len, fd); dirname[dirlen] = '\0'; if (result) { abort = true; break; } } else { int x = strlen((char *)entry->d_name); unsigned int i; char *cp = strrchr((char *)entry->d_name,'.'); if (cp) { cp++; /* add all supported audio files to playlists */ for (i=0; i < sizeof(filetypes)/sizeof(struct filetype); i++) { if (filetypes[i].tree_attr == TREE_ATTR_MPA) { if (!strcasecmp(cp, filetypes[i].extension)) { char buf[8]; int i; write(fd, dirname, strlen(dirname)); write(fd, "/", 1); write(fd, entry->d_name, x); write(fd, "\n", 1); plsize++; if(TIME_AFTER(current_tick, pltick+HZ/4)) { pltick = current_tick; snprintf(buf, sizeof buf, "%d", plsize); #ifdef HAVE_LCD_BITMAP FOR_NB_SCREENS(i) { screens[i].puts(0, 4, (unsigned char *)buf); gui_textarea_update(&screens[i]); } #else x = 10; if (plsize > 999) x=7; else { if (plsize > 99) x=8; else { if (plsize > 9) x=9; } } FOR_NB_SCREENS(i) { screens[i].puts(x,0,buf); } #endif } break; } } } } } } closedir_cached(dir);