From de2d99a177ff440303f86da8d1db3b6c3d6c9b26 Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Sun, 31 May 2009 19:19:34 +0000 Subject: A bit more work on playback controlling pictureflow: *) Fix that the generated playlist can't be resumed after reboot *) make it work with shuffle git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21151 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugin.c | 2 ++ apps/plugin.h | 5 ++++- apps/plugins/pictureflow/pictureflow.c | 37 ++++++++++++++++++++++++---------- 3 files changed, 32 insertions(+), 12 deletions(-) (limited to 'apps') diff --git a/apps/plugin.c b/apps/plugin.c index 31990a9b00..eba2c28b33 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -655,6 +655,8 @@ static const struct plugin_api rockbox_api = { playlist_sync, playlist_remove_all_tracks, playlist_create, + playlist_insert_track, + playlist_shuffle, }; int plugin_load(const char* plugin, const void* parameter) diff --git a/apps/plugin.h b/apps/plugin.h index 6f5a6940e7..6c2c903308 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -128,7 +128,7 @@ void* plugin_get_buffer(size_t *buffer_size); #define PLUGIN_MAGIC 0x526F634B /* RocK */ /* increase this every time the api struct changes */ -#define PLUGIN_API_VERSION 154 +#define PLUGIN_API_VERSION 155 /* update this to latest version if a change to the api struct breaks backwards compatibility (and please take the opportunity to sort in any @@ -817,6 +817,9 @@ struct plugin_api { void (*playlist_sync)(struct playlist_info* playlist); int (*playlist_remove_all_tracks)(struct playlist_info *playlist); int (*playlist_create)(const char *dir, const char *file); + int (*playlist_insert_track)(struct playlist_info* playlist, + const char *filename, int position, bool queue, bool sync); + int (*playlist_shuffle)(int random_seed, int start_index); }; /* plugin header */ diff --git a/apps/plugins/pictureflow/pictureflow.c b/apps/plugins/pictureflow/pictureflow.c index de9859897c..cd8ef1a29f 100644 --- a/apps/plugins/pictureflow/pictureflow.c +++ b/apps/plugins/pictureflow/pictureflow.c @@ -2330,27 +2330,42 @@ void select_prev_track(void) */ void start_playback(void) { - static int old_playlist = -1; - if (center_slide.slide_index == old_playlist) + static int old_playlist = -1, old_shuffle = 0; + int count = 0; + int position = selected_track; + int shuffle = rb->global_settings->playlist_shuffle; + /* reuse existing playlist if possible + * regenerate if shuffle is on or changed, since playlist index and + * selected track are "out of sync" */ + if (!shuffle && center_slide.slide_index == old_playlist + && (old_shuffle == shuffle)) { - rb->playlist_start(selected_track, 0); + goto play; } /* First, replace the current playlist with a new one */ - else if ((rb->playlist_remove_all_tracks(NULL) == 0) && - (rb->playlist_create(PLUGIN_DEMOS_DIR, NULL) == 0)) + else if (rb->playlist_remove_all_tracks(NULL) == 0 + && rb->playlist_create(NULL, NULL) == 0) { - int count = 0; do { - if (rb->playlist_add(get_track_filename(count)) != 0) + rb->yield(); + if (rb->playlist_insert_track(NULL, get_track_filename(count), + PLAYLIST_INSERT_LAST, false, true) < 0) break; } while(++count < track_count); - rb->playlist_sync(NULL); - - rb->playlist_start(selected_track, 0); } + else + return; + + if (rb->global_settings->playlist_shuffle) + position = rb->playlist_shuffle(*rb->current_tick, selected_track); +play: + /* TODO: can we adjust selected_track if !play_selected ? + * if shuffle, we can't predict the playing track easily, and for either + * case the track list doesn't get auto scrolled*/ + rb->playlist_start(position, 0); old_playlist = center_slide.slide_index; - + old_shuffle = shuffle; } /** -- cgit v1.2.3