diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/onplay.c | 11 | ||||
-rw-r--r-- | apps/onplay.h | 2 | ||||
-rw-r--r-- | apps/playlist_viewer.c | 2 | ||||
-rw-r--r-- | apps/plugin.c | 1 | ||||
-rw-r--r-- | apps/plugin.h | 4 | ||||
-rw-r--r-- | apps/plugins/pictureflow/pictureflow.c | 216 | ||||
-rw-r--r-- | apps/shortcuts.c | 2 |
7 files changed, 141 insertions, 97 deletions
diff --git a/apps/onplay.c b/apps/onplay.c index 93c7c93624..61ef8acad5 100644 --- a/apps/onplay.c +++ b/apps/onplay.c | |||
@@ -69,6 +69,7 @@ static const char *selected_file = NULL; | |||
69 | static char selected_file_path[MAX_PATH]; | 69 | static char selected_file_path[MAX_PATH]; |
70 | static int selected_file_attr = 0; | 70 | static int selected_file_attr = 0; |
71 | static int onplay_result = ONPLAY_OK; | 71 | static int onplay_result = ONPLAY_OK; |
72 | static bool (*ctx_playlist_insert)(int position, bool queue, bool create_new); | ||
72 | extern struct menu_item_ex file_menu; /* settings_menu.c */ | 73 | extern struct menu_item_ex file_menu; /* settings_menu.c */ |
73 | 74 | ||
74 | /* redefine MAKE_MENU so the MENU_EXITAFTERTHISMENU flag can be added easily */ | 75 | /* redefine MAKE_MENU so the MENU_EXITAFTERTHISMENU flag can be added easily */ |
@@ -474,7 +475,7 @@ MAKE_ONPLAYMENU( wps_playlist_menu, ID2P(LANG_PLAYLIST), | |||
474 | &playlist_save_item, &reshuffle_item, &playing_time_item | 475 | &playlist_save_item, &reshuffle_item, &playing_time_item |
475 | ); | 476 | ); |
476 | 477 | ||
477 | /* CONTEXT_[TREE|ID3DB] playlist options */ | 478 | /* CONTEXT_[TREE|ID3DB|STD] playlist options */ |
478 | static bool add_to_playlist(int position, bool queue) | 479 | static bool add_to_playlist(int position, bool queue) |
479 | { | 480 | { |
480 | bool new_playlist = false; | 481 | bool new_playlist = false; |
@@ -510,6 +511,10 @@ static bool add_to_playlist(int position, bool queue) | |||
510 | { | 511 | { |
511 | tagtree_insert_selection_playlist(position, queue); | 512 | tagtree_insert_selection_playlist(position, queue); |
512 | } | 513 | } |
514 | else if (context == CONTEXT_STD && ctx_playlist_insert != NULL) | ||
515 | { | ||
516 | ctx_playlist_insert(position, queue, false); | ||
517 | } | ||
513 | else | 518 | else |
514 | #endif | 519 | #endif |
515 | { | 520 | { |
@@ -774,9 +779,10 @@ static int treeplaylist_callback(int action, | |||
774 | return action; | 779 | return action; |
775 | } | 780 | } |
776 | 781 | ||
777 | void onplay_show_playlist_menu(char* path) | 782 | void onplay_show_playlist_menu(const char* path, void (*playlist_insert_cb)) |
778 | { | 783 | { |
779 | context = CONTEXT_STD; | 784 | context = CONTEXT_STD; |
785 | ctx_playlist_insert = playlist_insert_cb; | ||
780 | selected_file = path; | 786 | selected_file = path; |
781 | if (dir_exists(path)) | 787 | if (dir_exists(path)) |
782 | selected_file_attr = ATTR_DIRECTORY; | 788 | selected_file_attr = ATTR_DIRECTORY; |
@@ -1939,6 +1945,7 @@ int onplay(char* file, int attr, int from, bool hotkey) | |||
1939 | const struct menu_item_ex *menu; | 1945 | const struct menu_item_ex *menu; |
1940 | onplay_result = ONPLAY_OK; | 1946 | onplay_result = ONPLAY_OK; |
1941 | context = from; | 1947 | context = from; |
1948 | ctx_playlist_insert = NULL; | ||
1942 | if (file == NULL) | 1949 | if (file == NULL) |
1943 | selected_file = NULL; | 1950 | selected_file = NULL; |
1944 | else | 1951 | else |
diff --git a/apps/onplay.h b/apps/onplay.h index 27f0436403..bff8dafff0 100644 --- a/apps/onplay.h +++ b/apps/onplay.h | |||
@@ -51,6 +51,6 @@ enum hotkey_action { | |||
51 | 51 | ||
52 | /* needed for the playlist viewer.. eventually clean this up */ | 52 | /* needed for the playlist viewer.. eventually clean this up */ |
53 | void onplay_show_playlist_cat_menu(char* track_name); | 53 | void onplay_show_playlist_cat_menu(char* track_name); |
54 | void onplay_show_playlist_menu(char* path); | 54 | void onplay_show_playlist_menu(const char* path, void (*playlist_insert_cb)); |
55 | 55 | ||
56 | #endif | 56 | #endif |
diff --git a/apps/playlist_viewer.c b/apps/playlist_viewer.c index 63d8697ee8..b0f30ea8a1 100644 --- a/apps/playlist_viewer.c +++ b/apps/playlist_viewer.c | |||
@@ -535,7 +535,7 @@ static int onplay_menu(int index) | |||
535 | { | 535 | { |
536 | case 0: | 536 | case 0: |
537 | /* playlist */ | 537 | /* playlist */ |
538 | onplay_show_playlist_menu(current_track->name); | 538 | onplay_show_playlist_menu(current_track->name, NULL); |
539 | ret = 0; | 539 | ret = 0; |
540 | break; | 540 | break; |
541 | case 1: | 541 | case 1: |
diff --git a/apps/plugin.c b/apps/plugin.c index bd7f74e65f..0168a26323 100644 --- a/apps/plugin.c +++ b/apps/plugin.c | |||
@@ -805,6 +805,7 @@ static const struct plugin_api rockbox_api = { | |||
805 | warn_on_pl_erase, | 805 | warn_on_pl_erase, |
806 | playlist_insert_playlist, | 806 | playlist_insert_playlist, |
807 | battery_current, | 807 | battery_current, |
808 | onplay_show_playlist_menu, | ||
808 | }; | 809 | }; |
809 | 810 | ||
810 | static int plugin_buffer_handle; | 811 | static int plugin_buffer_handle; |
diff --git a/apps/plugin.h b/apps/plugin.h index 38d44530b0..d4d86e50bd 100644 --- a/apps/plugin.h +++ b/apps/plugin.h | |||
@@ -110,6 +110,7 @@ int plugin_open(const char *plugin, const char *parameter); | |||
110 | #include "rbpaths.h" | 110 | #include "rbpaths.h" |
111 | #include "core_alloc.h" | 111 | #include "core_alloc.h" |
112 | #include "screen_access.h" | 112 | #include "screen_access.h" |
113 | #include "onplay.h" | ||
113 | 114 | ||
114 | #ifdef HAVE_ALBUMART | 115 | #ifdef HAVE_ALBUMART |
115 | #include "albumart.h" | 116 | #include "albumart.h" |
@@ -154,7 +155,7 @@ int plugin_open(const char *plugin, const char *parameter); | |||
154 | #define PLUGIN_MAGIC 0x526F634B /* RocK */ | 155 | #define PLUGIN_MAGIC 0x526F634B /* RocK */ |
155 | 156 | ||
156 | /* increase this every time the api struct changes */ | 157 | /* increase this every time the api struct changes */ |
157 | #define PLUGIN_API_VERSION 247 | 158 | #define PLUGIN_API_VERSION 248 |
158 | 159 | ||
159 | /* update this to latest version if a change to the api struct breaks | 160 | /* update this to latest version if a change to the api struct breaks |
160 | backwards compatibility (and please take the opportunity to sort in any | 161 | backwards compatibility (and please take the opportunity to sort in any |
@@ -931,6 +932,7 @@ struct plugin_api { | |||
931 | int (*playlist_insert_playlist)(struct playlist_info* playlist, | 932 | int (*playlist_insert_playlist)(struct playlist_info* playlist, |
932 | const char *filename, int position, bool queue); | 933 | const char *filename, int position, bool queue); |
933 | int (*battery_current)(void); | 934 | int (*battery_current)(void); |
935 | void (*onplay_show_playlist_menu)(const char* path, void (*playlist_insert_cb)); | ||
934 | }; | 936 | }; |
935 | 937 | ||
936 | /* plugin header */ | 938 | /* plugin header */ |
diff --git a/apps/plugins/pictureflow/pictureflow.c b/apps/plugins/pictureflow/pictureflow.c index 2217c15678..d2b9ae5190 100644 --- a/apps/plugins/pictureflow/pictureflow.c +++ b/apps/plugins/pictureflow/pictureflow.c | |||
@@ -557,6 +557,12 @@ enum pf_states { | |||
557 | 557 | ||
558 | static int pf_state; | 558 | static int pf_state; |
559 | 559 | ||
560 | #if PF_PLAYBACK_CAPABLE | ||
561 | static bool insert_whole_album; | ||
562 | static bool old_shuffle = false; | ||
563 | static int old_playlist = -1; | ||
564 | #endif | ||
565 | |||
560 | /** code */ | 566 | /** code */ |
561 | static bool free_slide_prio(int prio); | 567 | static bool free_slide_prio(int prio); |
562 | bool load_new_slide(void); | 568 | bool load_new_slide(void); |
@@ -3590,68 +3596,131 @@ static void select_prev_track(void) | |||
3590 | 3596 | ||
3591 | #if PF_PLAYBACK_CAPABLE | 3597 | #if PF_PLAYBACK_CAPABLE |
3592 | 3598 | ||
3593 | static bool pf_warn_on_pl_erase(void) | 3599 | static bool playlist_insert(int position, bool queue, bool create_new) |
3600 | { | ||
3601 | if (position == PLAYLIST_REPLACE) | ||
3602 | { | ||
3603 | if ((!create_new && rb->playlist_remove_all_tracks(NULL) == 0) || | ||
3604 | (create_new && rb->playlist_create(NULL, NULL) == 0)) | ||
3605 | position = PLAYLIST_INSERT_LAST; | ||
3606 | else | ||
3607 | return false; | ||
3608 | } | ||
3609 | |||
3610 | if (!insert_whole_album) | ||
3611 | rb->playlist_insert_track(NULL, get_track_filename(pf_tracks.sel), | ||
3612 | position, queue, true); | ||
3613 | else | ||
3614 | { | ||
3615 | int i = 0; | ||
3616 | do { | ||
3617 | rb->yield(); | ||
3618 | if (rb->playlist_insert_track(NULL, get_track_filename(i), | ||
3619 | position, queue, true) < 0) | ||
3620 | break; | ||
3621 | if (position == PLAYLIST_INSERT_FIRST) | ||
3622 | position = PLAYLIST_INSERT; | ||
3623 | } while(++i < pf_tracks.count); | ||
3624 | } | ||
3625 | rb->playlist_sync(NULL); | ||
3626 | old_playlist = create_new ? center_slide.slide_index : -1; | ||
3627 | return true; | ||
3628 | } | ||
3629 | |||
3630 | static void track_list_ready(void) | ||
3631 | { | ||
3632 | if (pf_state != pf_show_tracks) | ||
3633 | { | ||
3634 | rb->splash(0, ID2P(LANG_WAIT)); | ||
3635 | create_track_index(center_slide.slide_index); | ||
3636 | reset_track_list(); | ||
3637 | } | ||
3638 | } | ||
3639 | |||
3640 | /** | ||
3641 | Brings up "Current Playlist" menu with first | ||
3642 | track of selection. | ||
3643 | |||
3644 | Onplay menu code calls back playlist_insert for | ||
3645 | adding all of the tracks. | ||
3646 | */ | ||
3647 | static void show_current_playlist_menu(void) | ||
3594 | { | 3648 | { |
3595 | #ifdef USEGSLIB | 3649 | #ifdef USEGSLIB |
3596 | grey_show(false); | 3650 | grey_show(false); |
3651 | rb->lcd_clear_display(); | ||
3652 | rb->lcd_update(); | ||
3597 | #endif | 3653 | #endif |
3598 | bool ret = rb->warn_on_pl_erase(); | 3654 | track_list_ready(); |
3655 | insert_whole_album = pf_state != pf_show_tracks; | ||
3656 | FOR_NB_SCREENS(i) | ||
3657 | rb->viewportmanager_theme_enable(i, true, NULL); | ||
3658 | rb->onplay_show_playlist_menu(get_track_filename(pf_tracks.sel), | ||
3659 | &playlist_insert); | ||
3660 | FOR_NB_SCREENS(i) | ||
3661 | rb->viewportmanager_theme_undo(i, false); | ||
3662 | if (insert_whole_album) | ||
3663 | free_borrowed_tracks(); | ||
3599 | #ifdef USEGSLIB | 3664 | #ifdef USEGSLIB |
3600 | grey_show(true); | 3665 | grey_show(true); |
3601 | #endif | 3666 | #endif |
3602 | return ret; | 3667 | mylcd_set_drawmode(DRMODE_FG); |
3603 | } | 3668 | } |
3604 | 3669 | ||
3670 | |||
3605 | /* | 3671 | /* |
3606 | * Puts the current tracklist into a newly created playlist and starts playling | 3672 | * Puts selected album's tracks into a newly created playlist and starts playing |
3607 | */ | 3673 | */ |
3608 | static void start_playback(bool append) | 3674 | static bool start_playback(bool return_to_WPS) |
3609 | { | 3675 | { |
3610 | static int old_playlist = -1, old_shuffle = 0; | 3676 | #ifdef USEGSLIB |
3611 | int count = 0; | 3677 | grey_show(false); |
3612 | int position = pf_tracks.sel; | 3678 | #if LCD_DEPTH > 1 |
3613 | int shuffle = rb->global_settings->playlist_shuffle; | 3679 | rb->lcd_set_background(N_BRIGHT(0)); |
3614 | /* reuse existing playlist if possible | 3680 | rb->lcd_set_foreground(N_BRIGHT(255)); |
3615 | * regenerate if shuffle is on or changed, since playlist index and | 3681 | #endif |
3616 | * selected track are "out of sync" */ | 3682 | rb->lcd_clear_display(); |
3617 | if (!shuffle && !append && center_slide.slide_index == old_playlist | 3683 | rb->lcd_update(); |
3618 | && (old_shuffle == shuffle)) | 3684 | #endif /* USEGSLIB */ |
3619 | { | 3685 | |
3620 | goto play; | 3686 | if (!rb->warn_on_pl_erase()) |
3621 | } | ||
3622 | /* First, replace the current playlist with a new one */ | ||
3623 | else if (append || (rb->playlist_remove_all_tracks(NULL) == 0 | ||
3624 | && rb->playlist_create(NULL, NULL) == 0)) | ||
3625 | { | 3687 | { |
3626 | do { | 3688 | #ifdef USEGSLIB |
3627 | rb->yield(); | 3689 | grey_show(true); |
3628 | if (rb->playlist_insert_track(NULL, get_track_filename(count), | 3690 | #endif |
3629 | PLAYLIST_INSERT_LAST, false, true) < 0) | 3691 | return false; |
3630 | break; | ||
3631 | } while(++count < pf_tracks.count); | ||
3632 | rb->playlist_sync(NULL); | ||
3633 | } | 3692 | } |
3634 | else | ||
3635 | return; | ||
3636 | 3693 | ||
3637 | if (!append && rb->global_settings->playlist_shuffle) | 3694 | track_list_ready(); |
3638 | position = rb->playlist_shuffle(*rb->current_tick, pf_tracks.sel); | 3695 | insert_whole_album = true; |
3639 | play: | 3696 | int start_index = pf_tracks.sel; |
3640 | /* TODO: can we adjust selected_track if !play_selected ? | 3697 | bool shuffle = rb->global_settings->playlist_shuffle; |
3641 | * if shuffle, we can't predict the playing track easily, and for either | 3698 | /* can't reuse playlist if it may be out of sync with our track list */ |
3642 | * case the track list doesn't get auto scrolled*/ | 3699 | if (shuffle || center_slide.slide_index != old_playlist |
3643 | if(!append) | 3700 | || (old_shuffle != shuffle)) |
3644 | { | 3701 | { |
3645 | rb->playlist_start(position, 0, 0); | 3702 | if (!playlist_insert(PLAYLIST_REPLACE, false, true)) |
3646 | /* make warn on playlist erase work */ | 3703 | { |
3647 | rb->playlist_get_current()->num_inserted_tracks = 0; | 3704 | #ifdef USEGSLIB |
3648 | old_playlist = center_slide.slide_index; | 3705 | grey_show(true); |
3706 | #endif | ||
3707 | return false; | ||
3708 | } | ||
3709 | if (shuffle) | ||
3710 | start_index = rb->playlist_shuffle(*rb->current_tick, pf_tracks.sel); | ||
3649 | } | 3711 | } |
3650 | else | 3712 | rb->playlist_start(start_index, 0, 0); |
3651 | old_playlist = -1; | 3713 | rb->playlist_get_current()->num_inserted_tracks = 0; /* prevent warn_on_pl_erase */ |
3652 | old_shuffle = shuffle; | 3714 | old_shuffle = shuffle; |
3653 | } | 3715 | if (return_to_WPS) |
3716 | pf_cfg.last_album = center_index; | ||
3717 | #ifdef USEGSLIB | ||
3718 | else | ||
3719 | grey_show(true); | ||
3654 | #endif | 3720 | #endif |
3721 | return true; | ||
3722 | } | ||
3723 | #endif /* PF_PLAYBACK_CAPABLE */ | ||
3655 | 3724 | ||
3656 | /** | 3725 | /** |
3657 | Draw the current album name | 3726 | Draw the current album name |
@@ -3729,28 +3798,6 @@ static void draw_album_text(void) | |||
3729 | } | 3798 | } |
3730 | } | 3799 | } |
3731 | 3800 | ||
3732 | #if PF_PLAYBACK_CAPABLE | ||
3733 | /** | ||
3734 | Display an info message when items have been added to playlist | ||
3735 | */ | ||
3736 | static void rb_splash_added_to_playlist(void) | ||
3737 | { | ||
3738 | #ifdef USEGSLIB | ||
3739 | grey_show(false); | ||
3740 | #if LCD_DEPTH > 1 | ||
3741 | rb->lcd_set_background(N_BRIGHT(0)); | ||
3742 | rb->lcd_set_foreground(N_BRIGHT(255)); | ||
3743 | #endif | ||
3744 | rb->lcd_clear_display(); | ||
3745 | rb->lcd_update(); | ||
3746 | #endif | ||
3747 | rb->splash(HZ*2, ID2P(LANG_ADDED_TO_PLAYLIST)); | ||
3748 | #ifdef USEGSLIB | ||
3749 | grey_show(true); | ||
3750 | #endif | ||
3751 | } | ||
3752 | #endif | ||
3753 | |||
3754 | 3801 | ||
3755 | static void set_initial_slide(const char* selected_file) | 3802 | static void set_initial_slide(const char* selected_file) |
3756 | { | 3803 | { |
@@ -4101,19 +4148,7 @@ static int pictureflow_main(const char* selected_file) | |||
4101 | } else if (pf_state == pf_cover_out) | 4148 | } else if (pf_state == pf_cover_out) |
4102 | interrupt_cover_out_animation(); | 4149 | interrupt_cover_out_animation(); |
4103 | 4150 | ||
4104 | if( pf_state == pf_idle ) { | 4151 | show_current_playlist_menu(); |
4105 | create_track_index(center_slide.slide_index); | ||
4106 | reset_track_list(); | ||
4107 | start_playback(true); | ||
4108 | free_borrowed_tracks(); | ||
4109 | } | ||
4110 | else | ||
4111 | { | ||
4112 | rb->playlist_insert_track(NULL, get_track_filename(pf_tracks.sel), | ||
4113 | PLAYLIST_INSERT_LAST, false, true); | ||
4114 | rb->playlist_sync(NULL); | ||
4115 | } | ||
4116 | rb_splash_added_to_playlist(); | ||
4117 | } | 4152 | } |
4118 | break; | 4153 | break; |
4119 | #endif | 4154 | #endif |
@@ -4128,13 +4163,8 @@ static int pictureflow_main(const char* selected_file) | |||
4128 | set_current_slide(target); | 4163 | set_current_slide(target); |
4129 | #if PF_PLAYBACK_CAPABLE | 4164 | #if PF_PLAYBACK_CAPABLE |
4130 | if(pf_cfg.auto_wps == 1) { | 4165 | if(pf_cfg.auto_wps == 1) { |
4131 | if (!pf_warn_on_pl_erase()) | 4166 | if (start_playback(true)) |
4132 | break; | 4167 | return PLUGIN_GOTO_WPS; |
4133 | create_track_index(center_slide.slide_index); | ||
4134 | reset_track_list(); | ||
4135 | start_playback(false); | ||
4136 | pf_cfg.last_album = center_index; | ||
4137 | return PLUGIN_GOTO_WPS; | ||
4138 | } | 4168 | } |
4139 | else | 4169 | else |
4140 | #endif | 4170 | #endif |
@@ -4145,12 +4175,13 @@ static int pictureflow_main(const char* selected_file) | |||
4145 | else if (pf_state == pf_cover_in) | 4175 | else if (pf_state == pf_cover_in) |
4146 | interrupt_cover_in_animation(); | 4176 | interrupt_cover_in_animation(); |
4147 | #if PF_PLAYBACK_CAPABLE | 4177 | #if PF_PLAYBACK_CAPABLE |
4148 | else if (pf_state == pf_show_tracks && pf_warn_on_pl_erase()) { | 4178 | else if (pf_state == pf_show_tracks) { |
4149 | start_playback(false); | ||
4150 | if(pf_cfg.auto_wps != 0) { | 4179 | if(pf_cfg.auto_wps != 0) { |
4151 | pf_cfg.last_album = center_index; | 4180 | if (start_playback(true)) |
4152 | return PLUGIN_GOTO_WPS; | 4181 | return PLUGIN_GOTO_WPS; |
4153 | } | 4182 | } |
4183 | else | ||
4184 | start_playback(false); | ||
4154 | } | 4185 | } |
4155 | #endif | 4186 | #endif |
4156 | break; | 4187 | break; |
@@ -4226,6 +4257,9 @@ enum plugin_status plugin_start(const void *parameter) | |||
4226 | if (configfile_save(CONFIG_FILE, config, CONFIG_NUM_ITEMS, | 4257 | if (configfile_save(CONFIG_FILE, config, CONFIG_NUM_ITEMS, |
4227 | CONFIG_VERSION)) | 4258 | CONFIG_VERSION)) |
4228 | { | 4259 | { |
4260 | #ifdef USEGSLIB | ||
4261 | grey_show(false); | ||
4262 | #endif | ||
4229 | rb->splash(HZ, ID2P(LANG_ERROR_WRITING_CONFIG)); | 4263 | rb->splash(HZ, ID2P(LANG_ERROR_WRITING_CONFIG)); |
4230 | ret = PLUGIN_ERROR; | 4264 | ret = PLUGIN_ERROR; |
4231 | } | 4265 | } |
diff --git a/apps/shortcuts.c b/apps/shortcuts.c index 3672178647..b0a949933c 100644 --- a/apps/shortcuts.c +++ b/apps/shortcuts.c | |||
@@ -633,7 +633,7 @@ int do_shortcut_menu(void *ignored) | |||
633 | } | 633 | } |
634 | else | 634 | else |
635 | { | 635 | { |
636 | onplay_show_playlist_menu(sc->u.path); | 636 | onplay_show_playlist_menu(sc->u.path, NULL); |
637 | } | 637 | } |
638 | break; | 638 | break; |
639 | case SHORTCUT_FILE: | 639 | case SHORTCUT_FILE: |