diff options
-rw-r--r-- | apps/dbtree.c | 75 | ||||
-rw-r--r-- | apps/dbtree.h | 2 | ||||
-rw-r--r-- | apps/playlist.c | 14 | ||||
-rw-r--r-- | apps/tree.c | 40 |
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 | ||
62 | static int db_play_folder(struct tree_context* c); | ||
63 | |||
62 | int db_init(void) | 64 | int 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 | ||
323 | void db_enter(struct tree_context* c) | 335 | int 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 | ||
368 | void db_exit(struct tree_context* c) | 380 | void 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 | ||
390 | static 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 |
379 | const char* db_get_icon(struct tree_context* c) | 426 | const 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 | ||
27 | int db_init(void); | 27 | int db_init(void); |
28 | void db_enter(struct tree_context* c); | 28 | int db_enter(struct tree_context* c); |
29 | void db_exit(struct tree_context* c); | 29 | void db_exit(struct tree_context* c); |
30 | int db_load(struct tree_context* c); | 30 | int 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 | */ |
245 | static void create_control(struct playlist_info* playlist) | 245 | static 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]; |