summaryrefslogtreecommitdiff
path: root/apps/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/tree.c')
-rw-r--r--apps/tree.c129
1 files changed, 127 insertions, 2 deletions
diff --git a/apps/tree.c b/apps/tree.c
index d2660513a5..5312885f19 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -102,12 +102,14 @@ extern unsigned char bitmap_icons_6x8[LastIcon][6];
102#define TREE_EXIT BUTTON_LEFT 102#define TREE_EXIT BUTTON_LEFT
103#define TREE_ENTER BUTTON_RIGHT 103#define TREE_ENTER BUTTON_RIGHT
104#define TREE_MENU BUTTON_F1 104#define TREE_MENU BUTTON_F1
105#define RELEASE_MASK (BUTTON_OFF)
105#else 106#else
106#define TREE_NEXT BUTTON_RIGHT 107#define TREE_NEXT BUTTON_RIGHT
107#define TREE_PREV BUTTON_LEFT 108#define TREE_PREV BUTTON_LEFT
108#define TREE_EXIT BUTTON_STOP 109#define TREE_EXIT BUTTON_STOP
109#define TREE_ENTER BUTTON_PLAY 110#define TREE_ENTER BUTTON_PLAY
110#define TREE_MENU BUTTON_MENU 111#define TREE_MENU BUTTON_MENU
112#define RELEASE_MASK (BUTTON_STOP)
111#endif /* HAVE_RECORDER_KEYPAD */ 113#endif /* HAVE_RECORDER_KEYPAD */
112 114
113#define TREE_ATTR_M3U 0x80 /* unused by FAT attributes */ 115#define TREE_ATTR_M3U 0x80 /* unused by FAT attributes */
@@ -292,6 +294,98 @@ static int showdir(char *path, int start)
292 return filesindir; 294 return filesindir;
293} 295}
294 296
297bool ask_resume(void)
298{
299 lcd_clear_display();
300 lcd_puts(0,0,"Resume?");
301#ifdef HAVE_LCD_CHARCELLS
302 lcd_puts(0,1,"(Play/Stop)");
303#else
304 lcd_puts(0,1,"Play = Yes");
305 lcd_puts(0,2,"Any other = No");
306#endif
307 lcd_update();
308 if (button_get(true) == BUTTON_PLAY)
309 return true;
310 return false;
311}
312
313void start_resume(void)
314{
315 if ( global_settings.resume &&
316 global_settings.resume_index != -1 ) {
317 int len = strlen(global_settings.resume_file);
318
319 DEBUGF("Resume file %s\n",global_settings.resume_file);
320 DEBUGF("Resume index %X offset %X\n",
321 global_settings.resume_index,
322 global_settings.resume_offset);
323 DEBUGF("Resume shuffle %s seed %X\n",
324 global_settings.playlist_shuffle?"on":"off",
325 global_settings.resume_seed);
326
327 /* playlist? */
328 if (!strcasecmp(&global_settings.resume_file[len-4], ".m3u")) {
329 char* slash;
330
331 /* check that the file exists */
332 int fd = open(global_settings.resume_file, O_RDONLY);
333 if(fd<0)
334 return;
335 close(fd);
336
337 if (!ask_resume())
338 return;
339
340 slash = strrchr(global_settings.resume_file,'/');
341 if (slash) {
342 *slash=0;
343 play_list(global_settings.resume_file,
344 slash+1,
345 global_settings.resume_index,
346 global_settings.resume_offset,
347 global_settings.resume_seed );
348 *slash='/';
349 }
350 else {
351 /* check that the dir exists */
352 DIR* dir = opendir(global_settings.resume_file);
353 if(!dir)
354 return;
355 closedir(dir);
356
357 if (!ask_resume())
358 return;
359
360 play_list("/",
361 global_settings.resume_file,
362 global_settings.resume_index,
363 global_settings.resume_offset,
364 global_settings.resume_seed );
365 }
366 }
367 else {
368 int start_index;
369
370 if (!ask_resume())
371 return;
372
373 if (showdir(global_settings.resume_file, 0) < 0 )
374 return;
375 start_index = build_playlist(global_settings.resume_index);
376 play_list(global_settings.resume_file,
377 NULL,
378 start_index,
379 global_settings.resume_offset,
380 global_settings.resume_seed);
381 }
382
383 status_set_playmode(STATUS_PLAY);
384 status_draw();
385 wps_show();
386 }
387}
388
295bool dirbrowse(char *root) 389bool dirbrowse(char *root)
296{ 390{
297 int numentries=0; 391 int numentries=0;
@@ -317,6 +411,9 @@ bool dirbrowse(char *root)
317 tree_max_on_screen = TREE_MAX_ON_SCREEN; 411 tree_max_on_screen = TREE_MAX_ON_SCREEN;
318#endif 412#endif
319 413
414 start_resume();
415 button_set_release(RELEASE_MASK);
416
320 memcpy(currdir,root,sizeof(currdir)); 417 memcpy(currdir,root,sizeof(currdir));
321 numentries = showdir(root, start); 418 numentries = showdir(root, start);
322 if (numentries == -1) 419 if (numentries == -1)
@@ -350,6 +447,7 @@ bool dirbrowse(char *root)
350 restore = true; 447 restore = true;
351 } 448 }
352 break; 449 break;
450
353#ifdef HAVE_RECORDER_KEYPAD 451#ifdef HAVE_RECORDER_KEYPAD
354 case BUTTON_OFF: 452 case BUTTON_OFF:
355 mpeg_stop(); 453 mpeg_stop();
@@ -357,7 +455,15 @@ bool dirbrowse(char *root)
357 status_draw(); 455 status_draw();
358 restore = true; 456 restore = true;
359 break; 457 break;
458
459 case BUTTON_OFF | BUTTON_REL:
460#else
461 case BUTTON_STOP | BUTTON_REL:
360#endif 462#endif
463 global_settings.resume_index = -1;
464 settings_save();
465 break;
466
361 467
362 case TREE_ENTER: 468 case TREE_ENTER:
363#ifdef HAVE_RECORDER_KEYPAD 469#ifdef HAVE_RECORDER_KEYPAD
@@ -383,16 +489,34 @@ bool dirbrowse(char *root)
383 dircursor=0; 489 dircursor=0;
384 start=0; 490 start=0;
385 } else { 491 } else {
492 int seed = current_tick;
386 lcd_stop_scroll(); 493 lcd_stop_scroll();
387 if(dircache[dircursor+start].attr & TREE_ATTR_M3U ) 494 if(dircache[dircursor+start].attr & TREE_ATTR_M3U )
388 { 495 {
496 if ( global_settings.resume )
497 snprintf(global_settings.resume_file,
498 MAX_PATH, "%s/%s",
499 currdir,
500 dircache[dircursor+start].name);
389 play_list(currdir, 501 play_list(currdir,
390 dircache[dircursor+start].name, 0); 502 dircache[dircursor+start].name,
503 0, 0, seed );
391 } 504 }
392 else { 505 else {
506 if ( global_settings.resume )
507 strncpy(global_settings.resume_file,
508 currdir, MAX_PATH);
393 start_index = build_playlist(dircursor+start); 509 start_index = build_playlist(dircursor+start);
394 play_list(currdir, NULL, start_index); 510 play_list(currdir, NULL, start_index, 0, seed);
395 } 511 }
512
513 if ( global_settings.resume ) {
514 global_settings.resume_index = 0;
515 global_settings.resume_offset = 0;
516 global_settings.resume_seed = seed;
517 settings_save();
518 }
519
396 status_set_playmode(STATUS_PLAY); 520 status_set_playmode(STATUS_PLAY);
397 status_draw(); 521 status_draw();
398 lcd_stop_scroll(); 522 lcd_stop_scroll();
@@ -405,6 +529,7 @@ bool dirbrowse(char *root)
405 dirlevel = 0; 529 dirlevel = 0;
406 dircursor = 0; 530 dircursor = 0;
407 start = 0; 531 start = 0;
532 global_settings.resume_index = -1;
408 } 533 }
409 } 534 }
410 restore = true; 535 restore = true;