diff options
Diffstat (limited to 'apps/dbtree.c')
-rw-r--r-- | apps/dbtree.c | 67 |
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 | ||
47 | static int db_play_folder(struct tree_context* c); | 48 | static int db_play_folder(struct tree_context* c); |
48 | static int db_search(struct tree_context* c, char* string); | 49 | static 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) | |||
403 | int db_enter(struct tree_context* c) | 406 | int 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) | |||
471 | void db_exit(struct tree_context* c) | 473 | void 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) | |||
481 | int db_get_filename(struct tree_context* c, char *buf, int buflen) | 483 | int 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 | } |