Committing FS#10717 by Tomasz Kowalyczyk: add PLAYLIST_INSERT_LAST_SHUFFLED (appends the inserted folder into shuffled order to end of playlist)

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23385 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Dave Hooper 2009-10-28 22:27:38 +00:00
parent 7b1d12e067
commit 494fd9673d
5 changed files with 89 additions and 16 deletions

View file

@ -13182,3 +13182,31 @@
usb_hid: "USB Human Interface Device" usb_hid: "USB Human Interface Device"
</voice> </voice>
</phrase> </phrase>
<phrase>
id: LANG_INSERT_LAST_SHUFFLED
desc: in onplay menu. insert a playlist randomly at end of dynamic playlist
user: core
<source>
*: "Insert Last Shuffled"
</source>
<dest>
*: "Insert Last Shuffled"
</dest>
<voice>
*: "Insert Last Shuffled"
</voice>
</phrase>
<phrase>
id: LANG_QUEUE_LAST_SHUFFLED
desc: in onplay menu. queue a playlist randomly at and of dynamic playlist
user: core
<source>
*: "Queue Last Shuffled"
</source>
<dest>
*: "Queue Last Shuffled"
</dest>
<voice>
*: "Queue Last Shuffled"
</voice>
</phrase>

View file

@ -173,8 +173,12 @@ static bool add_to_playlist(int position, bool queue)
playlist_create(NULL, NULL); playlist_create(NULL, NULL);
/* always set seed before inserting shuffled */ /* always set seed before inserting shuffled */
if (position == PLAYLIST_INSERT_SHUFFLED) if (position == PLAYLIST_INSERT_SHUFFLED || position == PLAYLIST_INSERT_LAST_SHUFFLED)
{
srand(current_tick); srand(current_tick);
if (position == PLAYLIST_INSERT_LAST_SHUFFLED)
playlist_set_last_shuffled_start();
}
#ifdef HAVE_TAGCACHE #ifdef HAVE_TAGCACHE
if (context == CONTEXT_ID3DB) if (context == CONTEXT_ID3DB)
@ -355,6 +359,10 @@ MENUITEM_FUNCTION(i_shuf_pl_item, MENU_FUNC_USEPARAM,
ID2P(LANG_INSERT_SHUFFLED), playlist_insert_func, ID2P(LANG_INSERT_SHUFFLED), playlist_insert_func,
(intptr_t*)PLAYLIST_INSERT_SHUFFLED, treeplaylist_callback, (intptr_t*)PLAYLIST_INSERT_SHUFFLED, treeplaylist_callback,
Icon_Playlist); Icon_Playlist);
MENUITEM_FUNCTION(i_last_shuf_pl_item, MENU_FUNC_USEPARAM,
ID2P(LANG_INSERT_LAST_SHUFFLED), playlist_insert_func,
(intptr_t*)PLAYLIST_INSERT_LAST_SHUFFLED, treeplaylist_callback,
Icon_Playlist);
/* queue items */ /* queue items */
MENUITEM_FUNCTION(q_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE), MENUITEM_FUNCTION(q_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE),
playlist_queue_func, (intptr_t*)PLAYLIST_INSERT, playlist_queue_func, (intptr_t*)PLAYLIST_INSERT,
@ -369,6 +377,10 @@ MENUITEM_FUNCTION(q_shuf_pl_item, MENU_FUNC_USEPARAM,
ID2P(LANG_QUEUE_SHUFFLED), playlist_queue_func, ID2P(LANG_QUEUE_SHUFFLED), playlist_queue_func,
(intptr_t*)PLAYLIST_INSERT_SHUFFLED, (intptr_t*)PLAYLIST_INSERT_SHUFFLED,
treeplaylist_wplayback_callback, Icon_Playlist); treeplaylist_wplayback_callback, Icon_Playlist);
MENUITEM_FUNCTION(q_last_shuf_pl_item, MENU_FUNC_USEPARAM,
ID2P(LANG_QUEUE_LAST_SHUFFLED), playlist_queue_func,
(intptr_t*)PLAYLIST_INSERT_LAST_SHUFFLED,
treeplaylist_callback, Icon_Playlist);
/* replace playlist */ /* replace playlist */
MENUITEM_FUNCTION(replace_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_REPLACE), MENUITEM_FUNCTION(replace_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_REPLACE),
playlist_insert_func, (intptr_t*)PLAYLIST_REPLACE, playlist_insert_func, (intptr_t*)PLAYLIST_REPLACE,
@ -388,10 +400,12 @@ MAKE_ONPLAYMENU( tree_playlist_menu, ID2P(LANG_PLAYLIST),
/* insert */ /* insert */
&i_pl_item, &i_first_pl_item, &i_pl_item, &i_first_pl_item,
&i_last_pl_item, &i_shuf_pl_item, &i_last_pl_item, &i_shuf_pl_item,
&i_last_shuf_pl_item,
/* queue */ /* queue */
&q_pl_item, &q_first_pl_item, &q_last_pl_item, &q_pl_item, &q_first_pl_item, &q_last_pl_item,
&q_shuf_pl_item, &q_shuf_pl_item,
&q_last_shuf_pl_item,
/* replace */ /* replace */
&replace_pl_item &replace_pl_item
@ -439,6 +453,15 @@ static int treeplaylist_callback(int action,
} }
return ACTION_EXIT_MENUITEM; return ACTION_EXIT_MENUITEM;
} }
else if (this_item == &i_last_shuf_pl_item || this_item == &q_last_shuf_pl_item)
{
if ((playlist_amount() > 0) && (audio_status() & AUDIO_STATUS_PLAY) && (selected_file_attr & ATTR_DIRECTORY))
{
return action;
}
else
return ACTION_EXIT_MENUITEM;
}
break; break;
} }
return action; return action;

View file

@ -664,19 +664,21 @@ int playlist_remove_all_tracks(struct playlist_info *playlist)
/* /*
* Add track to playlist at specified position. There are five special * Add track to playlist at specified position. There are seven special
* positions that can be specified: * positions that can be specified:
* PLAYLIST_PREPEND - Add track at beginning of playlist * PLAYLIST_PREPEND - Add track at beginning of playlist
* PLAYLIST_INSERT - Add track after current song. NOTE: If * PLAYLIST_INSERT - Add track after current song. NOTE: If
* there are already inserted tracks then track * there are already inserted tracks then track
* is added to the end of the insertion list * is added to the end of the insertion list
* PLAYLIST_INSERT_FIRST - Add track immediately after current song, no * PLAYLIST_INSERT_FIRST - Add track immediately after current song, no
* matter what other tracks have been inserted * matter what other tracks have been inserted
* PLAYLIST_INSERT_LAST - Add track to end of playlist * PLAYLIST_INSERT_LAST - Add track to end of playlist
* PLAYLIST_INSERT_SHUFFLED - Add track at some random point between the * PLAYLIST_INSERT_SHUFFLED - Add track at some random point between the
* current playing track and end of playlist * current playing track and end of playlist
* PLAYLIST_REPLACE - Erase current playlist, Cue the current track * PLAYLIST_INSERT_LAST_SHUFFLED - Add tracks in random order to the end of
* and inster this track at the end. * the playlist.
* PLAYLIST_REPLACE - Erase current playlist, Cue the current track
* and inster this track at the end.
*/ */
static int add_track_to_playlist(struct playlist_info* playlist, static int add_track_to_playlist(struct playlist_info* playlist,
const char *filename, int position, const char *filename, int position,
@ -753,6 +755,12 @@ static int add_track_to_playlist(struct playlist_info* playlist,
position = insert_position = (rand() % (playlist->amount+1)); position = insert_position = (rand() % (playlist->amount+1));
break; break;
} }
case PLAYLIST_INSERT_LAST_SHUFFLED:
{
position = insert_position = playlist->last_shuffled_start +
rand() % (playlist->amount - playlist->last_shuffled_start + 1);
break;
}
case PLAYLIST_REPLACE: case PLAYLIST_REPLACE:
if (playlist_remove_all_tracks(playlist) < 0) if (playlist_remove_all_tracks(playlist) < 0)
return -1; return -1;
@ -2639,7 +2647,13 @@ int playlist_amount(void)
{ {
return playlist_amount_ex(NULL); return playlist_amount_ex(NULL);
} }
/* set playlist->last_shuffle_start to playlist->amount for
PLAYLIST_INSERT_LAST_SHUFFLED command purposes*/
void playlist_set_last_shuffled_start(void)
{
struct playlist_info* playlist = &current_playlist;
playlist->last_shuffled_start = playlist->amount;
}
/* /*
* Create a new playlist If playlist is not NULL then we're loading a * Create a new playlist If playlist is not NULL then we're loading a
* playlist off disk for viewing/editing. The index_buffer is used to store * playlist off disk for viewing/editing. The index_buffer is used to store

View file

@ -53,7 +53,8 @@ enum {
PLAYLIST_INSERT_LAST = -3, PLAYLIST_INSERT_LAST = -3,
PLAYLIST_INSERT_FIRST = -4, PLAYLIST_INSERT_FIRST = -4,
PLAYLIST_INSERT_SHUFFLED = -5, PLAYLIST_INSERT_SHUFFLED = -5,
PLAYLIST_REPLACE = -6 PLAYLIST_REPLACE = -6,
PLAYLIST_INSERT_LAST_SHUFFLED = -7
}; };
enum { enum {
@ -105,6 +106,8 @@ struct playlist_info
bool pending_control_sync; /* control file needs to be synced */ bool pending_control_sync; /* control file needs to be synced */
struct mutex control_mutex; /* mutex for control file access */ struct mutex control_mutex; /* mutex for control file access */
int last_shuffled_start; /* number of tracks when insert last
shuffled command start */
}; };
struct playlist_track_info struct playlist_track_info
@ -131,6 +134,7 @@ int playlist_get_resume_info(int *resume_index);
int playlist_update_resume_info(const struct mp3entry* id3); int playlist_update_resume_info(const struct mp3entry* id3);
int playlist_get_display_index(void); int playlist_get_display_index(void);
int playlist_amount(void); int playlist_amount(void);
void playlist_set_last_shuffled_start(void);
/* Exported functions for all playlists. Pass NULL for playlist_info /* Exported functions for all playlists. Pass NULL for playlist_info
structure to work with current playlist. */ structure to work with current playlist. */

View file

@ -100,7 +100,9 @@ options:
\item [Insert Last.] Add track(s) to end of playlist. \item [Insert Last.] Add track(s) to end of playlist.
\item [Insert Shuffled.] Add track(s) to the playlist in a random order. \item [Insert Shuffled.] Add track(s) to the playlist in a random order.
\item [Insert Last Shuffled.] Add tracks in a random order to the end of the playlist.
\item [Queue.] Queue is the same as Insert except queued tracks are \item [Queue.] Queue is the same as Insert except queued tracks are
deleted immediately from the playlist after they have been played. Also, deleted immediately from the playlist after they have been played. Also,
queued tracks are not saved to the playlist file (see queued tracks are not saved to the playlist file (see
@ -112,6 +114,8 @@ options:
\item [Queue Shuffled.] Queue track(s) in a random order. \item [Queue Shuffled.] Queue track(s) in a random order.
\item [Queue Last Shuffled.] Queue tracks in a random order at the end of the playlist.
\item [Play Next.] Replaces all but the current playing track with track(s). \item [Play Next.] Replaces all but the current playing track with track(s).
Current playing track is queued. Current playing track is queued.
\end{description} \end{description}