summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/dbtree.c75
-rw-r--r--apps/dbtree.h2
-rw-r--r--apps/playlist.c14
-rw-r--r--apps/tree.c40
4 files changed, 91 insertions, 40 deletions
diff --git a/apps/dbtree.c b/apps/dbtree.c
index 46acfff3d5..6925fd3f29 100644
--- a/apps/dbtree.c
+++ b/apps/dbtree.c
@@ -59,6 +59,8 @@ static int
59 albumlen, albumarraylen, 59 albumlen, albumarraylen,
60 artistlen, initialized = 0; 60 artistlen, initialized = 0;
61 61
62static int db_play_folder(struct tree_context* c);
63
62int db_init(void) 64int db_init(void)
63{ 65{
64 unsigned int version; 66 unsigned int version;
@@ -143,7 +145,7 @@ int db_load(struct tree_context* c)
143 return 0; 145 return 0;
144 } 146 }
145 147
146 c->dentry_size = 2 * sizeof(int); 148 c->dentry_size = 2;
147 c->dirfull = false; 149 c->dirfull = false;
148 150
149 DEBUGF("db_load(%d, %x, %d)\n", table, extra, c->firstpos); 151 DEBUGF("db_load(%d, %x, %d)\n", table, extra, c->firstpos);
@@ -157,9 +159,9 @@ int db_load(struct tree_context* c)
157 case root: { 159 case root: {
158 static const int tables[] = {allartists, allalbums, allsongs}; 160 static const int tables[] = {allartists, allalbums, allsongs};
159 char* nbuf = (char*)nptr; 161 char* nbuf = (char*)nptr;
160 char* labels[3] = { str(LANG_ID3DB_ARTISTS), 162 char* labels[] = { str(LANG_ID3DB_ARTISTS),
161 str(LANG_ID3DB_ALBUMS), 163 str(LANG_ID3DB_ALBUMS),
162 str(LANG_ID3DB_SONGS)}; 164 str(LANG_ID3DB_SONGS)};
163 165
164 for (i=0; i < 3; i++) { 166 for (i=0; i < 3; i++) {
165 strcpy(nbuf, labels[i]); 167 strcpy(nbuf, labels[i]);
@@ -176,6 +178,7 @@ int db_load(struct tree_context* c)
176 offset = songstart + c->firstpos * (songlen + 12); 178 offset = songstart + c->firstpos * (songlen + 12);
177 itemcount = songcount; 179 itemcount = songcount;
178 stringlen = songlen; 180 stringlen = songlen;
181 c->dentry_size = 3;
179 break; 182 break;
180 183
181 case allalbums: 184 case allalbums:
@@ -226,13 +229,14 @@ int db_load(struct tree_context* c)
226 offset = safeplace[0]; 229 offset = safeplace[0];
227 itemcount = songarraylen; 230 itemcount = songarraylen;
228 stringlen = songlen; 231 stringlen = songlen;
232 c->dentry_size = 3;
229 break; 233 break;
230 234
231 default: 235 default:
232 DEBUGF("Unsupported table %d\n", table); 236 DEBUGF("Unsupported table %d\n", table);
233 return -1; 237 return -1;
234 } 238 }
235 max_items = dcachesize / c->dentry_size; 239 max_items = dcachesize / (c->dentry_size * sizeof(int));
236 end_of_nbuf -= safeplacelen; 240 end_of_nbuf -= safeplacelen;
237 241
238 c->dirlength = itemcount; 242 c->dirlength = itemcount;
@@ -256,6 +260,7 @@ int db_load(struct tree_context* c)
256 260
257 for ( i=0; i < max_items; i++ ) { 261 for ( i=0; i < max_items; i++ ) {
258 int rc, skip=0; 262 int rc, skip=0;
263 int intbuf[4];
259 264
260 if (safeplace) { 265 if (safeplace) {
261 if (!safeplace[i]) { 266 if (!safeplace[i]) {
@@ -282,8 +287,15 @@ int db_load(struct tree_context* c)
282 case allsongs: 287 case allsongs:
283 case songs4album: 288 case songs4album:
284 /* save offset of this song */ 289 /* save offset of this song */
285 skip = 12;
286 dptr[1] = offset; 290 dptr[1] = offset;
291
292 rc = read(fd, intbuf, 12);
293 if (rc < 12) {
294 DEBUGF("%d read(%d) returned %d\n", i, 12, rc);
295 return -1;
296 }
297 /* save offset of filename */
298 dptr[2] = BE32(intbuf[2]);
287 break; 299 break;
288 300
289 case allalbums: 301 case allalbums:
@@ -309,7 +321,7 @@ int db_load(struct tree_context* c)
309 c->dirfull = true; 321 c->dirfull = true;
310 break; 322 break;
311 } 323 }
312 dptr = (void*)dptr + c->dentry_size; 324 dptr = (void*)dptr + c->dentry_size * sizeof(int);
313 325
314 if (!safeplace) 326 if (!safeplace)
315 offset += stringlen + skip; 327 offset += stringlen + skip;
@@ -320,8 +332,9 @@ int db_load(struct tree_context* c)
320 return i; 332 return i;
321} 333}
322 334
323void db_enter(struct tree_context* c) 335int db_enter(struct tree_context* c)
324{ 336{
337 int rc = 0;
325 int newextra = ((int*)c->dircache)[(c->dircursor + c->dirstart)*2 + 1]; 338 int newextra = ((int*)c->dircache)[(c->dircursor + c->dirstart)*2 + 1];
326 339
327 c->dirpos[c->dirlevel] = c->dirstart; 340 c->dirpos[c->dirlevel] = c->dirstart;
@@ -348,14 +361,11 @@ void db_enter(struct tree_context* c)
348 c->currextra = newextra; 361 c->currextra = newextra;
349 break; 362 break;
350 363
351 case songs4album:
352 case allsongs: 364 case allsongs:
353 splash(HZ,true,"No playing implemented yet"); 365 case songs4album:
354 c->dirlevel--; 366 c->dirlevel--;
355#if 0 367 if (db_play_folder(c) >= 0)
356 /* find filenames, build playlist, play */ 368 rc = 3;
357 playlist_create(NULL,NULL);
358#endif
359 break; 369 break;
360 370
361 default: 371 default:
@@ -363,6 +373,8 @@ void db_enter(struct tree_context* c)
363 } 373 }
364 374
365 c->dirstart = c->dircursor = c->firstpos = 0; 375 c->dirstart = c->dircursor = c->firstpos = 0;
376
377 return rc;
366} 378}
367 379
368void db_exit(struct tree_context* c) 380void db_exit(struct tree_context* c)
@@ -375,6 +387,41 @@ void db_exit(struct tree_context* c)
375 c->firstpos = c->pos_history[c->dirlevel]; 387 c->firstpos = c->pos_history[c->dirlevel];
376} 388}
377 389
390static int db_play_folder(struct tree_context* c)
391{
392 char buf[MAX_PATH];
393 int rc, i;
394 int filenum = c->dircursor + c->dirstart;
395
396 if (playlist_create(NULL, NULL) < 0) {
397 DEBUGF("Failed creating playlist\n");
398 return -1;
399 }
400
401 /* TODO: add support for very long tables */
402
403 for (i=0; i < c->filesindir; i++) {
404 int pathoffset = ((int*)c->dircache)[i * c->dentry_size + 2];
405 lseek(fd, pathoffset, SEEK_SET);
406 rc = read(fd, buf, sizeof(buf));
407 if (rc < songlen) {
408 DEBUGF("short path read(%d) = %d\n", sizeof(buf), rc);
409 return -2;
410 }
411
412 playlist_insert_track(NULL, buf, PLAYLIST_INSERT, false);
413 }
414
415 if (global_settings.playlist_shuffle)
416 filenum = playlist_shuffle(current_tick, filenum);
417 if (!global_settings.play_selected)
418 filenum = 0;
419
420 playlist_start(filenum,0);
421
422 return 0;
423}
424
378#ifdef HAVE_LCD_BITMAP 425#ifdef HAVE_LCD_BITMAP
379const char* db_get_icon(struct tree_context* c) 426const char* db_get_icon(struct tree_context* c)
380{ 427{
diff --git a/apps/dbtree.h b/apps/dbtree.h
index 43c903ccf3..b0c726881f 100644
--- a/apps/dbtree.h
+++ b/apps/dbtree.h
@@ -25,7 +25,7 @@ enum table { invalid, root, allsongs, allalbums, allartists,
25 albums4artist, songs4album }; 25 albums4artist, songs4album };
26 26
27int db_init(void); 27int db_init(void);
28void db_enter(struct tree_context* c); 28int db_enter(struct tree_context* c);
29void db_exit(struct tree_context* c); 29void db_exit(struct tree_context* c);
30int db_load(struct tree_context* c); 30int db_load(struct tree_context* c);
31#ifdef HAVE_LCD_BITMAP 31#ifdef HAVE_LCD_BITMAP
diff --git a/apps/playlist.c b/apps/playlist.c
index 651a5afeea..924b9041e8 100644
--- a/apps/playlist.c
+++ b/apps/playlist.c
@@ -244,7 +244,8 @@ static void new_playlist(struct playlist_info* playlist, const char *dir,
244 */ 244 */
245static void create_control(struct playlist_info* playlist) 245static void create_control(struct playlist_info* playlist)
246{ 246{
247 playlist->control_fd = creat(playlist->control_filename, 0000200); 247 playlist->control_fd = open(playlist->control_filename,
248 O_CREAT|O_RDWR|O_TRUNC);
248 if (playlist->control_fd < 0) 249 if (playlist->control_fd < 0)
249 { 250 {
250 if (check_rockboxdir()) 251 if (check_rockboxdir())
@@ -950,18 +951,19 @@ static int get_filename(struct playlist_info* playlist, int seek,
950 if (control_file) 951 if (control_file)
951 mutex_lock(&playlist->control_mutex); 952 mutex_lock(&playlist->control_mutex);
952 953
953 lseek(fd, seek, SEEK_SET); 954 if (lseek(fd, seek, SEEK_SET) != seek)
954 max = read(fd, tmp_buf, buf_length); 955 max = -1;
956 else
957 max = read(fd, tmp_buf, buf_length);
955 958
956 if (control_file) 959 if (control_file)
957 mutex_unlock(&playlist->control_mutex); 960 mutex_unlock(&playlist->control_mutex);
958 } 961 }
959 962
960 if (max < 0) 963 if (max < 0)
961 { 964 {
962 if (control_file) 965 if (control_file)
963 splash(HZ*2, true, 966 splash(HZ*2, true, str(LANG_PLAYLIST_CONTROL_ACCESS_ERROR));
964 str(LANG_PLAYLIST_CONTROL_ACCESS_ERROR));
965 else 967 else
966 splash(HZ*2, true, str(LANG_PLAYLIST_ACCESS_ERROR)); 968 splash(HZ*2, true, str(LANG_PLAYLIST_ACCESS_ERROR));
967 969
diff --git a/apps/tree.c b/apps/tree.c
index d0f4ab9d68..0809ecbfae 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -365,7 +365,7 @@ static int showdir(void)
365 int attr = 0; 365 int attr = 0;
366 366
367 if (id3db) { 367 if (id3db) {
368 name = ((char**)tc.dircache)[i * 2]; 368 name = ((char**)tc.dircache)[i * tc.dentry_size];
369 icon = db_get_icon(&tc); 369 icon = db_get_icon(&tc);
370 } 370 }
371 else { 371 else {
@@ -717,23 +717,23 @@ static bool dirbrowse(void)
717 break; 717 break;
718 718
719 if (id3db) 719 if (id3db)
720 db_enter(&tc); 720 i = db_enter(&tc);
721 else { 721 else
722 switch (ft_enter(&tc)) 722 i = ft_enter(&tc);
723 { 723
724 case 1: reload_dir = true; break; 724 switch (i)
725 case 2: reload_root = true; break; 725 {
726 case 3: start_wps = true; break; 726 case 1: reload_dir = true; break;
727 case 4: exit_func = true; break; 727 case 2: reload_root = true; break;
728 default: break; 728 case 3: start_wps = true; break;
729 } 729 case 4: exit_func = true; break;
730 default: break;
731 }
730 732
731#ifdef HAVE_LCD_BITMAP 733#ifdef HAVE_LCD_BITMAP
732 /* maybe we have a new font */ 734 /* maybe we have a new font */
733 tree_max_on_screen = recalc_screen_height(); 735 tree_max_on_screen = recalc_screen_height();
734#endif 736#endif
735 }
736
737 /* make sure cursor is on screen */ 737 /* make sure cursor is on screen */
738 while ( tc.dircursor > tree_max_on_screen ) 738 while ( tc.dircursor > tree_max_on_screen )
739 { 739 {
@@ -1013,6 +1013,7 @@ static bool dirbrowse(void)
1013#endif 1013#endif
1014 { 1014 {
1015 int onplay_result; 1015 int onplay_result;
1016 int attr = 0;
1016 1017
1017 if(!numentries) 1018 if(!numentries)
1018 onplay_result = onplay(NULL, 0); 1019 onplay_result = onplay(NULL, 0);
@@ -1023,8 +1024,9 @@ static bool dirbrowse(void)
1023 else 1024 else
1024 snprintf(buf, sizeof buf, "/%s", 1025 snprintf(buf, sizeof buf, "/%s",
1025 dircache[tc.dircursor+tc.dirstart].name); 1026 dircache[tc.dircursor+tc.dirstart].name);
1026 onplay_result = onplay(buf, 1027 if (!id3db)
1027 dircache[tc.dircursor+tc.dirstart].attr); 1028 attr = dircache[tc.dircursor+tc.dirstart].attr;
1029 onplay_result = onplay(buf, attr);
1028 } 1030 }
1029 1031
1030 switch (onplay_result) 1032 switch (onplay_result)
@@ -1166,7 +1168,7 @@ static bool dirbrowse(void)
1166 int attr = 0; 1168 int attr = 0;
1167 1169
1168 if (id3db) 1170 if (id3db)
1169 name = ((char**)tc.dircache)[lasti * 2]; 1171 name = ((char**)tc.dircache)[lasti * tc.dentry_size];
1170 else { 1172 else {
1171 struct entry* dc = tc.dircache; 1173 struct entry* dc = tc.dircache;
1172 struct entry* e = &dc[lasti]; 1174 struct entry* e = &dc[lasti];
@@ -1186,7 +1188,7 @@ static bool dirbrowse(void)
1186 thumbnail_time = -1; /* cancel whatever we were about to say */ 1188 thumbnail_time = -1; /* cancel whatever we were about to say */
1187 1189
1188 if (id3db) 1190 if (id3db)
1189 name = ((char**)tc.dircache)[lasti * 2]; 1191 name = ((char**)tc.dircache)[lasti * tc.dentry_size];
1190 else { 1192 else {
1191 struct entry* dc = tc.dircache; 1193 struct entry* dc = tc.dircache;
1192 struct entry* e = &dc[lasti]; 1194 struct entry* e = &dc[lasti];