summaryrefslogtreecommitdiff
path: root/apps/dbtree.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dbtree.c')
-rw-r--r--apps/dbtree.c67
1 files changed, 34 insertions, 33 deletions
diff --git a/apps/dbtree.c b/apps/dbtree.c
index e3704ac381..9ea0706245 100644
--- a/apps/dbtree.c
+++ b/apps/dbtree.c
@@ -43,6 +43,7 @@
43#include "lang.h" 43#include "lang.h"
44#include "keyboard.h" 44#include "keyboard.h"
45#include "autoconf.h" 45#include "autoconf.h"
46#include "list.h"
46 47
47static int db_play_folder(struct tree_context* c); 48static int db_play_folder(struct tree_context* c);
48static int db_search(struct tree_context* c, char* string); 49static int db_search(struct tree_context* c, char* string);
@@ -69,17 +70,18 @@ int db_load(struct tree_context* c)
69 c->filesindir = 0; 70 c->filesindir = 0;
70 return 0; 71 return 0;
71 } 72 }
72 73
73 c->dentry_size = 2; 74 c->dentry_size = 2;
74 c->dirfull = false; 75 c->dirfull = false;
75 76
76 DEBUGF("db_load() table: %d extra: 0x%x firstpos: %d\n", table, extra, c->firstpos); 77 DEBUGF("db_load() table: %d extra: 0x%x firstpos: %d\n", table, extra,
78 c->firstpos);
77 79
78 if (!table) { 80 if (!table) {
79 table = root; 81 table = root;
80 c->currtable = table; 82 c->currtable = table;
81 } 83 }
82 84
83 switch (table) { 85 switch (table) {
84 case root: { 86 case root: {
85 static const int tables[] = {allartists, allalbums, allsongs, 87 static const int tables[] = {allartists, allalbums, allsongs,
@@ -138,28 +140,28 @@ int db_load(struct tree_context* c)
138 return i; 140 return i;
139 141
140 case allsongs: 142 case allsongs:
141 DEBUGF("dbload table allsongs\n"); 143 DEBUGF("dbload table allsongs\n");
142 offset = tagdbheader.songstart + c->firstpos * SONGENTRY_SIZE; 144 offset = tagdbheader.songstart + c->firstpos * SONGENTRY_SIZE;
143 itemcount = tagdbheader.songcount; 145 itemcount = tagdbheader.songcount;
144 stringlen = tagdbheader.songlen; 146 stringlen = tagdbheader.songlen;
145 break; 147 break;
146 148
147 case allalbums: 149 case allalbums:
148 DEBUGF("dbload table allalbums\n"); 150 DEBUGF("dbload table allalbums\n");
149 offset = tagdbheader.albumstart + c->firstpos * ALBUMENTRY_SIZE; 151 offset = tagdbheader.albumstart + c->firstpos * ALBUMENTRY_SIZE;
150 itemcount = tagdbheader.albumcount; 152 itemcount = tagdbheader.albumcount;
151 stringlen = tagdbheader.albumlen; 153 stringlen = tagdbheader.albumlen;
152 break; 154 break;
153 155
154 case allartists: 156 case allartists:
155 DEBUGF("dbload table allartists\n"); 157 DEBUGF("dbload table allartists\n");
156 offset = tagdbheader.artiststart + c->firstpos * ARTISTENTRY_SIZE; 158 offset = tagdbheader.artiststart + c->firstpos * ARTISTENTRY_SIZE;
157 itemcount = tagdbheader.artistcount; 159 itemcount = tagdbheader.artistcount;
158 stringlen = tagdbheader.artistlen; 160 stringlen = tagdbheader.artistlen;
159 break; 161 break;
160 162
161 case albums4artist: 163 case albums4artist:
162 DEBUGF("dbload table albums4artist\n"); 164 DEBUGF("dbload table albums4artist\n");
163 /* 'extra' is offset to the artist */ 165 /* 'extra' is offset to the artist */
164 safeplacelen = tagdbheader.albumarraylen * 4; 166 safeplacelen = tagdbheader.albumarraylen * 4;
165 safeplace = (void*)(end_of_nbuf - safeplacelen); 167 safeplace = (void*)(end_of_nbuf - safeplacelen);
@@ -199,13 +201,13 @@ int db_load(struct tree_context* c)
199 break; 201 break;
200 202
201 case songs4artist: 203 case songs4artist:
202 DEBUGF("dbload table songs4artist\n"); 204 DEBUGF("dbload table songs4artist\n");
203 /* 'extra' is offset to the artist, used as filter */ 205 /* 'extra' is offset to the artist, used as filter */
204 offset = tagdbheader.songstart + c->firstpos * SONGENTRY_SIZE; 206 offset = tagdbheader.songstart + c->firstpos * SONGENTRY_SIZE;
205 itemcount = tagdbheader.songcount; 207 itemcount = tagdbheader.songcount;
206 stringlen = tagdbheader.songlen; 208 stringlen = tagdbheader.songlen;
207 break; 209 break;
208 210
209 default: 211 default:
210 DEBUGF("Unsupported table %d\n", table); 212 DEBUGF("Unsupported table %d\n", table);
211 return -1; 213 return -1;
@@ -248,7 +250,8 @@ int db_load(struct tree_context* c)
248 case songs4album: 250 case songs4album:
249 case songs4artist: 251 case songs4artist:
250 rc = read(tagdb_fd, intbuf, 12); 252 rc = read(tagdb_fd, intbuf, 12);
251 skip = SONGENTRY_SIZE-stringlen-12; /* skip the rest of the song info */ 253 /* skip the rest of the song info */
254 skip = SONGENTRY_SIZE-stringlen-12;
252 if (rc < 12) { 255 if (rc < 12) {
253 DEBUGF("%d read(%d) returned %d\n", i, 12, rc); 256 DEBUGF("%d read(%d) returned %d\n", i, 12, rc);
254 return -1; 257 return -1;
@@ -287,7 +290,7 @@ int db_load(struct tree_context* c)
287 290
288 if(table==songs4artist) 291 if(table==songs4artist)
289 c->dirlength=hits; 292 c->dirlength=hits;
290 293
291 /* next name is stored immediately after this */ 294 /* next name is stored immediately after this */
292 nptr = (void*)nptr + strlen((char*)nptr) + 1; 295 nptr = (void*)nptr + strlen((char*)nptr) + 1;
293 if ((void*)nptr + stringlen > (void*)end_of_nbuf) { 296 if ((void*)nptr + stringlen > (void*)end_of_nbuf) {
@@ -314,7 +317,7 @@ int db_load(struct tree_context* c)
314 dptr[1] = extra; /* offset to artist */ 317 dptr[1] = extra; /* offset to artist */
315 hits++; 318 hits++;
316 } 319 }
317 320
318 c->filesindir = hits; 321 c->filesindir = hits;
319 322
320 return hits; 323 return hits;
@@ -350,7 +353,7 @@ static int db_search(struct tree_context* c, char* string)
350 count = tagdbheader.songcount; 353 count = tagdbheader.songcount;
351 size = SONGENTRY_SIZE; 354 size = SONGENTRY_SIZE;
352 break; 355 break;
353 356
354 default: 357 default:
355 DEBUGF("Invalid table %d\n", c->currtable); 358 DEBUGF("Invalid table %d\n", c->currtable);
356 return 0; 359 return 0;
@@ -384,7 +387,7 @@ static int db_search(struct tree_context* c, char* string)
384 c->dirfull = true; 387 c->dirfull = true;
385 break; 388 break;
386 } 389 }
387 390
388 nptr += strlen(nptr) + 1; 391 nptr += strlen(nptr) + 1;
389 while ((unsigned long)nptr & 3) 392 while ((unsigned long)nptr & 3)
390 nptr++; 393 nptr++;
@@ -403,25 +406,24 @@ static int db_search(struct tree_context* c, char* string)
403int db_enter(struct tree_context* c) 406int db_enter(struct tree_context* c)
404{ 407{
405 int rc = 0; 408 int rc = 0;
406 int offset = (c->dircursor + c->dirstart) * c->dentry_size + 1; 409 int offset = (c->selected_item) * c->dentry_size + 1;
407 int newextra = ((int*)c->dircache)[offset]; 410 int newextra = ((int*)c->dircache)[offset];
408 411
409 if (c->dirlevel >= MAX_DIR_LEVELS) 412 if (c->dirlevel >= MAX_DIR_LEVELS)
410 return 0; 413 return 0;
411 414
412 c->dirpos[c->dirlevel] = c->dirstart; 415 c->selected_item_history[c->dirlevel]=c->selected_item;
413 c->cursorpos[c->dirlevel] = c->dircursor;
414 c->table_history[c->dirlevel] = c->currtable; 416 c->table_history[c->dirlevel] = c->currtable;
415 c->extra_history[c->dirlevel] = c->currextra; 417 c->extra_history[c->dirlevel] = c->currextra;
416 c->pos_history[c->dirlevel] = c->firstpos; 418 c->pos_history[c->dirlevel] = c->firstpos;
417 c->dirlevel++; 419 c->dirlevel++;
418 420
419 switch (c->currtable) { 421 switch (c->currtable) {
420 case root: 422 case root:
421 c->currtable = newextra; 423 c->currtable = newextra;
422 c->currextra = newextra; 424 c->currextra = newextra;
423 break; 425 break;
424 426
425 case allartists: 427 case allartists:
426 case searchartists: 428 case searchartists:
427 c->currtable = albums4artist; 429 c->currtable = albums4artist;
@@ -457,13 +459,13 @@ int db_enter(struct tree_context* c)
457 else 459 else
458 c->currtable = newextra; 460 c->currtable = newextra;
459 break; 461 break;
460 462
461 default: 463 default:
462 c->dirlevel--; 464 c->dirlevel--;
463 break; 465 break;
464 } 466 }
465 467 c->selected_item=0;
466 c->dirstart = c->dircursor = c->firstpos = 0; 468 gui_synclist_select_item(&tree_lists, c->selected_item);
467 469
468 return rc; 470 return rc;
469} 471}
@@ -471,8 +473,8 @@ int db_enter(struct tree_context* c)
471void db_exit(struct tree_context* c) 473void db_exit(struct tree_context* c)
472{ 474{
473 c->dirlevel--; 475 c->dirlevel--;
474 c->dirstart = c->dirpos[c->dirlevel]; 476 c->selected_item=c->selected_item_history[c->dirlevel];
475 c->dircursor = c->cursorpos[c->dirlevel]; 477 gui_synclist_select_item(&tree_lists, c->selected_item);
476 c->currtable = c->table_history[c->dirlevel]; 478 c->currtable = c->table_history[c->dirlevel];
477 c->currextra = c->extra_history[c->dirlevel]; 479 c->currextra = c->extra_history[c->dirlevel];
478 c->firstpos = c->pos_history[c->dirlevel]; 480 c->firstpos = c->pos_history[c->dirlevel];
@@ -481,9 +483,8 @@ void db_exit(struct tree_context* c)
481int db_get_filename(struct tree_context* c, char *buf, int buflen) 483int db_get_filename(struct tree_context* c, char *buf, int buflen)
482{ 484{
483 int rc; 485 int rc;
484 int filenum = c->dircursor + c->dirstart; 486 int pathoffset = ((int*)c->dircache)[c->selected_item * c->dentry_size + 1];
485 int pathoffset = ((int*)c->dircache)[filenum * c->dentry_size + 1]; 487
486
487 lseek(tagdb_fd, pathoffset, SEEK_SET); 488 lseek(tagdb_fd, pathoffset, SEEK_SET);
488 rc = read(tagdb_fd, buf, buflen); 489 rc = read(tagdb_fd, buf, buflen);
489 490
@@ -498,7 +499,6 @@ static int db_play_folder(struct tree_context* c)
498{ 499{
499 char buf[MAX_PATH]; 500 char buf[MAX_PATH];
500 int rc, i; 501 int rc, i;
501 int filenum = c->dircursor + c->dirstart;
502 502
503 if (playlist_create(NULL, NULL) < 0) { 503 if (playlist_create(NULL, NULL) < 0) {
504 DEBUGF("Failed creating playlist\n"); 504 DEBUGF("Failed creating playlist\n");
@@ -506,7 +506,7 @@ static int db_play_folder(struct tree_context* c)
506 } 506 }
507 507
508 /* TODO: add support for very long tables */ 508 /* TODO: add support for very long tables */
509 509
510 for (i=0; i < c->filesindir; i++) { 510 for (i=0; i < c->filesindir; i++) {
511 int pathoffset = ((int*)c->dircache)[i * c->dentry_size + 1]; 511 int pathoffset = ((int*)c->dircache)[i * c->dentry_size + 1];
512 lseek(tagdb_fd, pathoffset, SEEK_SET); 512 lseek(tagdb_fd, pathoffset, SEEK_SET);
@@ -520,11 +520,12 @@ static int db_play_folder(struct tree_context* c)
520 } 520 }
521 521
522 if (global_settings.playlist_shuffle) 522 if (global_settings.playlist_shuffle)
523 filenum = playlist_shuffle(current_tick, filenum); 523 c->selected_item = playlist_shuffle(current_tick, c->selected_item);
524 if (!global_settings.play_selected) 524 if (!global_settings.play_selected)
525 filenum = 0; 525 c->selected_item = 0;
526 gui_synclist_select_item(&tree_lists, c->selected_item);
526 527
527 playlist_start(filenum,0); 528 playlist_start(c->selected_item,0);
528 529
529 return 0; 530 return 0;
530} 531}