summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/playlist_viewer.c145
1 files changed, 103 insertions, 42 deletions
diff --git a/apps/playlist_viewer.c b/apps/playlist_viewer.c
index a94e07643e..8403aea6b6 100644
--- a/apps/playlist_viewer.c
+++ b/apps/playlist_viewer.c
@@ -73,6 +73,15 @@ enum direction
73 BACKWARD 73 BACKWARD
74}; 74};
75 75
76enum pv_onplay_result {
77 PV_ONPLAY_USB,
78 PV_ONPLAY_USB_CLOSED,
79 PV_ONPLAY_CLOSED,
80 PV_ONPLAY_ITEM_REMOVED,
81 PV_ONPLAY_CHANGED,
82 PV_ONPLAY_UNCHANGED,
83};
84
76struct playlist_buffer 85struct playlist_buffer
77{ 86{
78 char *name_buffer; /* Buffer used to store track names */ 87 char *name_buffer; /* Buffer used to store track names */
@@ -108,6 +117,8 @@ static struct playlist_viewer viewer;
108/* Used when viewing playlists on disk */ 117/* Used when viewing playlists on disk */
109static struct playlist_info temp_playlist; 118static struct playlist_info temp_playlist;
110 119
120static bool dirty = false;
121
111static void playlist_buffer_init(struct playlist_buffer *pb, char *names_buffer, 122static void playlist_buffer_init(struct playlist_buffer *pb, char *names_buffer,
112 int names_buffer_size); 123 int names_buffer_size);
113static void playlist_buffer_load_entries(struct playlist_buffer * pb, int index, 124static void playlist_buffer_load_entries(struct playlist_buffer * pb, int index,
@@ -126,7 +137,9 @@ static void format_line(const struct playlist_entry* track, char* str,
126 int len); 137 int len);
127 138
128static bool update_playlist(bool force); 139static bool update_playlist(bool force);
129static int onplay_menu(int index); 140static enum pv_onplay_result onplay_menu(int index);
141
142static void close_playlist_viewer(void);
130 143
131static void playlist_buffer_init(struct playlist_buffer *pb, char *names_buffer, 144static void playlist_buffer_init(struct playlist_buffer *pb, char *names_buffer,
132 int names_buffer_size) 145 int names_buffer_size)
@@ -479,7 +492,7 @@ static bool update_playlist(bool force)
479 return true; 492 return true;
480} 493}
481 494
482static int show_track_info(struct playlist_entry *current_track) 495static enum pv_onplay_result show_track_info(const struct playlist_entry *current_track)
483{ 496{
484 struct mp3entry id3; 497 struct mp3entry id3;
485 bool id3_retrieval_successful = false; 498 bool id3_retrieval_successful = false;
@@ -494,15 +507,25 @@ static int show_track_info(struct playlist_entry *current_track)
494 507
495 return id3_retrieval_successful && 508 return id3_retrieval_successful &&
496 browse_id3(&id3, current_track->index + 1, 509 browse_id3(&id3, current_track->index + 1,
497 viewer.num_tracks) ? -1 : 0; 510 viewer.num_tracks) ? PV_ONPLAY_USB : PV_ONPLAY_UNCHANGED;
511}
512
513#ifdef HAVE_TAGCACHE
514static enum pv_onplay_result open_pictureflow(const struct playlist_entry *current_track)
515{
516 char selected_track[MAX_PATH];
517 close_playlist_viewer();
518 snprintf(selected_track, sizeof(selected_track), "%s", current_track->name);
519
520 return (filetype_load_plugin((void *)"pictureflow", selected_track) ==
521 PLUGIN_USB_CONNECTED ? PV_ONPLAY_USB_CLOSED : PV_ONPLAY_CLOSED);
498} 522}
523#endif
499 524
500/* Menu of playlist commands. Invoked via ON+PLAY on main viewer screen. 525/* Menu of playlist commands. Invoked via ON+PLAY on main viewer screen. */
501 Returns -1 if USB attached, 0 if no playlist change, 1 if playlist 526static enum pv_onplay_result onplay_menu(int index)
502 changed, 2 if a track was removed from the playlist */
503static int onplay_menu(int index)
504{ 527{
505 int result, ret = 0; 528 int result, ret = PV_ONPLAY_UNCHANGED;
506 struct playlist_entry * current_track = 529 struct playlist_entry * current_track =
507 playlist_buffer_get_track(&viewer.buffer, index); 530 playlist_buffer_get_track(&viewer.buffer, index);
508 MENUITEM_STRINGLIST(menu_items, ID2P(LANG_PLAYLIST), NULL, 531 MENUITEM_STRINGLIST(menu_items, ID2P(LANG_PLAYLIST), NULL,
@@ -510,13 +533,18 @@ static int onplay_menu(int index)
510 ID2P(LANG_REMOVE), ID2P(LANG_MOVE), ID2P(LANG_MENU_SHOW_ID3_INFO), 533 ID2P(LANG_REMOVE), ID2P(LANG_MOVE), ID2P(LANG_MENU_SHOW_ID3_INFO),
511 ID2P(LANG_SHUFFLE), 534 ID2P(LANG_SHUFFLE),
512 ID2P(LANG_SAVE), 535 ID2P(LANG_SAVE),
513 ID2P(LANG_PLAYLISTVIEWER_SETTINGS)); 536 ID2P(LANG_PLAYLISTVIEWER_SETTINGS)
537#ifdef HAVE_TAGCACHE
538 ,ID2P(LANG_ONPLAY_PICTUREFLOW)
539#endif
540 );
541
514 bool current = (current_track->index == viewer.current_playing_track); 542 bool current = (current_track->index == viewer.current_playing_track);
515 543
516 result = do_menu(&menu_items, NULL, NULL, false); 544 result = do_menu(&menu_items, NULL, NULL, false);
517 if (result == MENU_ATTACHED_USB) 545 if (result == MENU_ATTACHED_USB)
518 { 546 {
519 ret = -1; 547 ret = PV_ONPLAY_USB;
520 } 548 }
521 else if (result >= 0) 549 else if (result >= 0)
522 { 550 {
@@ -529,12 +557,12 @@ static int onplay_menu(int index)
529 case 0: 557 case 0:
530 /* playlist */ 558 /* playlist */
531 onplay_show_playlist_menu(current_track->name, NULL); 559 onplay_show_playlist_menu(current_track->name, NULL);
532 ret = 0; 560 ret = PV_ONPLAY_UNCHANGED;
533 break; 561 break;
534 case 1: 562 case 1:
535 /* add to catalog */ 563 /* add to catalog */
536 onplay_show_playlist_cat_menu(current_track->name); 564 onplay_show_playlist_cat_menu(current_track->name);
537 ret = 0; 565 ret = PV_ONPLAY_UNCHANGED;
538 break; 566 break;
539 case 2: 567 case 2:
540 /* delete track */ 568 /* delete track */
@@ -557,13 +585,13 @@ static int onplay_menu(int index)
557 } 585 }
558 } 586 }
559 } 587 }
560 ret = 2; 588 ret = PV_ONPLAY_ITEM_REMOVED;
561 break; 589 break;
562 case 3: 590 case 3:
563 /* move track */ 591 /* move track */
564 viewer.moving_track = index; 592 viewer.moving_track = index;
565 viewer.moving_playlist_index = current_track->index; 593 viewer.moving_playlist_index = current_track->index;
566 ret = 0; 594 ret = PV_ONPLAY_UNCHANGED;
567 break; 595 break;
568 case 4: 596 case 4:
569 ret = show_track_info(current_track); 597 ret = show_track_info(current_track);
@@ -571,18 +599,23 @@ static int onplay_menu(int index)
571 case 5: 599 case 5:
572 /* shuffle */ 600 /* shuffle */
573 playlist_randomise(viewer.playlist, current_tick, false); 601 playlist_randomise(viewer.playlist, current_tick, false);
574 ret = 1; 602 ret = PV_ONPLAY_CHANGED;
575 break; 603 break;
576 case 6: 604 case 6:
577 /* save playlist */ 605 /* save playlist */
578 save_playlist_screen(viewer.playlist); 606 save_playlist_screen(viewer.playlist);
579 ret = 0; 607 ret = PV_ONPLAY_UNCHANGED;
580 break; 608 break;
581 case 7: 609 case 7:
582 /* playlist viewer settings */ 610 /* playlist viewer settings */
583 result = do_menu(&viewer_settings_menu, NULL, NULL, false); 611 result = do_menu(&viewer_settings_menu, NULL, NULL, false);
584 ret = (result == MENU_ATTACHED_USB) ? -1 : 0; 612 ret = (result == MENU_ATTACHED_USB) ? PV_ONPLAY_USB : PV_ONPLAY_UNCHANGED;
613 break;
614#ifdef HAVE_TAGCACHE
615 case 8:
616 ret = open_pictureflow(current_track);
585 break; 617 break;
618#endif
586 } 619 }
587 } 620 }
588 return ret; 621 return ret;
@@ -691,6 +724,37 @@ static int playlist_callback_voice(int selected_item, void *data)
691 return 0; 724 return 0;
692} 725}
693 726
727static void prepare_lists(struct gui_synclist * playlist_lists)
728{
729 gui_synclist_init(playlist_lists, playlist_callback_name,
730 &viewer, false, 1, NULL);
731 gui_synclist_set_voice_callback(playlist_lists,
732 global_settings.talk_file ?
733 &playlist_callback_voice : NULL);
734 gui_synclist_set_icon_callback(playlist_lists,
735 global_settings.playlist_viewer_icons ?
736 &playlist_callback_icons : NULL);
737 gui_synclist_set_nb_items(playlist_lists, viewer.num_tracks);
738 gui_synclist_set_title(playlist_lists, str(LANG_PLAYLIST), Icon_Playlist);
739 gui_synclist_select_item(playlist_lists, viewer.selected_track);
740 gui_synclist_draw(playlist_lists);
741 gui_synclist_speak_item(playlist_lists);
742}
743
744static bool open_playlist_viewer(const char* filename,
745 struct gui_synclist *playlist_lists,
746 bool reload)
747{
748 push_current_activity(ACTIVITY_PLAYLISTVIEWER);
749
750 if (!playlist_viewer_init(&viewer, filename, reload))
751 return false;
752
753 prepare_lists(playlist_lists);
754
755 return true;
756}
757
694/* Main viewer function. Filename identifies playlist to be viewed. If NULL, 758/* Main viewer function. Filename identifies playlist to be viewed. If NULL,
695 view current playlist. */ 759 view current playlist. */
696enum playlist_viewer_result playlist_viewer_ex(const char* filename) 760enum playlist_viewer_result playlist_viewer_ex(const char* filename)
@@ -698,25 +762,11 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename)
698 enum playlist_viewer_result ret = PLAYLIST_VIEWER_OK; 762 enum playlist_viewer_result ret = PLAYLIST_VIEWER_OK;
699 bool exit = false; /* exit viewer */ 763 bool exit = false; /* exit viewer */
700 int button; 764 int button;
701 bool dirty = false;
702 struct gui_synclist playlist_lists; 765 struct gui_synclist playlist_lists;
703 if (!playlist_viewer_init(&viewer, filename, false)) 766
767 if (!open_playlist_viewer(filename, &playlist_lists, false))
704 goto exit; 768 goto exit;
705 769
706 push_current_activity(ACTIVITY_PLAYLISTVIEWER);
707 gui_synclist_init(&playlist_lists, playlist_callback_name,
708 &viewer, false, 1, NULL);
709 gui_synclist_set_voice_callback(&playlist_lists,
710 global_settings.talk_file?
711 &playlist_callback_voice:NULL);
712 gui_synclist_set_icon_callback(&playlist_lists,
713 global_settings.playlist_viewer_icons?
714 &playlist_callback_icons:NULL);
715 gui_synclist_set_nb_items(&playlist_lists, viewer.num_tracks);
716 gui_synclist_set_title(&playlist_lists, str(LANG_PLAYLIST), Icon_Playlist);
717 gui_synclist_select_item(&playlist_lists, viewer.selected_track);
718 gui_synclist_draw(&playlist_lists);
719 gui_synclist_speak_item(&playlist_lists);
720 while (!exit) 770 while (!exit)
721 { 771 {
722 int track; 772 int track;
@@ -842,20 +892,25 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename)
842 } 892 }
843 case ACTION_STD_CONTEXT: 893 case ACTION_STD_CONTEXT:
844 { 894 {
845 /* ON+PLAY menu */ 895 int pv_onplay_result = onplay_menu(viewer.selected_track);
846 int ret_val;
847
848 ret_val = onplay_menu(viewer.selected_track);
849 896
850 if (ret_val < 0) 897 if (pv_onplay_result == PV_ONPLAY_USB)
851 { 898 {
852 ret = PLAYLIST_VIEWER_USB; 899 ret = PLAYLIST_VIEWER_USB;
853 goto exit; 900 goto exit;
854 } 901 }
855 else if (ret_val > 0) 902 else if (pv_onplay_result == PV_ONPLAY_USB_CLOSED)
903 return PLAYLIST_VIEWER_USB;
904 else if (pv_onplay_result == PV_ONPLAY_CLOSED)
905 {
906 if (!open_playlist_viewer(filename, &playlist_lists, true))
907 goto exit;
908 break;
909 }
910 else if (pv_onplay_result == PV_ONPLAY_CHANGED ||
911 pv_onplay_result == PV_ONPLAY_ITEM_REMOVED)
856 { 912 {
857 /* Playlist changed */ 913 if (pv_onplay_result == PV_ONPLAY_ITEM_REMOVED)
858 if (ret_val == 2)
859 gui_synclist_del_item(&playlist_lists); 914 gui_synclist_del_item(&playlist_lists);
860 update_playlist(true); 915 update_playlist(true);
861 if (viewer.num_tracks <= 0) 916 if (viewer.num_tracks <= 0)
@@ -906,6 +961,12 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename)
906 } 961 }
907 962
908exit: 963exit:
964 close_playlist_viewer();
965 return ret;
966}
967
968static void close_playlist_viewer(void)
969{
909 talk_shutup(); 970 talk_shutup();
910 pop_current_activity(); 971 pop_current_activity();
911 if (viewer.playlist) 972 if (viewer.playlist)
@@ -914,7 +975,7 @@ exit:
914 save_playlist_screen(viewer.playlist); 975 save_playlist_screen(viewer.playlist);
915 playlist_close(viewer.playlist); 976 playlist_close(viewer.playlist);
916 } 977 }
917 return ret; 978 dirty = false;
918} 979}
919 980
920static const char* playlist_search_callback_name(int selected_item, void * data, 981static const char* playlist_search_callback_name(int selected_item, void * data,