summaryrefslogtreecommitdiff
path: root/apps/dbtree.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dbtree.c')
-rw-r--r--apps/dbtree.c75
1 files changed, 61 insertions, 14 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{