Index: apps/playlist.c
===================================================================
--- apps/playlist.c (revision 23378)
+++ apps/playlist.c (working copy)
@@ -751,8 +751,15 @@
}
else
position = insert_position = (rand() % (playlist->amount+1));
+
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:
if (playlist_remove_all_tracks(playlist) < 0)
return -1;
@@ -2639,7 +2646,13 @@
{
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 = ¤t_playlist;
+ playlist->last_shuffled_start = playlist->amount;
+}
/*
* 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
Index: apps/playlist.h
===================================================================
--- apps/playlist.h (revision 23378)
+++ apps/playlist.h (working copy)
@@ -53,7 +53,8 @@
PLAYLIST_INSERT_LAST = -3,
PLAYLIST_INSERT_FIRST = -4,
PLAYLIST_INSERT_SHUFFLED = -5,
- PLAYLIST_REPLACE = -6
+ PLAYLIST_REPLACE = -6,
+ PLAYLIST_INSERT_LAST_SHUFFLED = -7
};
enum {
@@ -105,6 +106,8 @@
bool pending_control_sync; /* control file needs to be synced */
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
@@ -131,6 +134,7 @@
int playlist_update_resume_info(const struct mp3entry* id3);
int playlist_get_display_index(void);
int playlist_amount(void);
+void playlist_set_last_shuffled_start(void);
/* Exported functions for all playlists. Pass NULL for playlist_info
structure to work with current playlist. */
Index: apps/lang/english.lang
===================================================================
--- apps/lang/english.lang (revision 23378)
+++ apps/lang/english.lang (working copy)
@@ -13182,3 +13182,31 @@
usb_hid: "USB Human Interface Device"
+
+ id: LANG_INSERT_LAST_SHUFFLED
+ desc: in onplay menu. insert a playlist randomly at end of dynamic playlist
+ user: core
+
+ *: "Insert Last Shuffled"
+
+
+ *: "Insert Last Shuffled"
+
+
+ *: "Insert Last Shuffled"
+
+
+
+ id: LANG_QUEUE_LAST_SHUFFLED
+ desc: in onplay menu. queue a playlist randomly at and of dynamic playlist
+ user: core
+
+ *: "Queue Last Shuffled"
+
+
+ *: "Queue Last Shuffled"
+
+
+ *: "Queue Last Shuffled"
+
+
Index: apps/onplay.c
===================================================================
--- apps/onplay.c (revision 23378)
+++ apps/onplay.c (working copy)
@@ -173,8 +173,12 @@
playlist_create(NULL, NULL);
/* always set seed before inserting shuffled */
- if (position == PLAYLIST_INSERT_SHUFFLED)
+ if (position == PLAYLIST_INSERT_SHUFFLED || position == PLAYLIST_INSERT_LAST_SHUFFLED)
+ {
srand(current_tick);
+ if (position == PLAYLIST_INSERT_LAST_SHUFFLED)
+ playlist_set_last_shuffled_start();
+ }
#ifdef HAVE_TAGCACHE
if (context == CONTEXT_ID3DB)
@@ -355,6 +359,10 @@
ID2P(LANG_INSERT_SHUFFLED), playlist_insert_func,
(intptr_t*)PLAYLIST_INSERT_SHUFFLED, treeplaylist_callback,
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 */
MENUITEM_FUNCTION(q_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_QUEUE),
playlist_queue_func, (intptr_t*)PLAYLIST_INSERT,
@@ -369,6 +377,10 @@
ID2P(LANG_QUEUE_SHUFFLED), playlist_queue_func,
(intptr_t*)PLAYLIST_INSERT_SHUFFLED,
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 */
MENUITEM_FUNCTION(replace_pl_item, MENU_FUNC_USEPARAM, ID2P(LANG_REPLACE),
playlist_insert_func, (intptr_t*)PLAYLIST_REPLACE,
@@ -388,10 +400,12 @@
/* insert */
&i_pl_item, &i_first_pl_item,
&i_last_pl_item, &i_shuf_pl_item,
+ &i_last_shuf_pl_item,
/* queue */
&q_pl_item, &q_first_pl_item, &q_last_pl_item,
&q_shuf_pl_item,
+ &q_last_shuf_pl_item,
/* replace */
&replace_pl_item
@@ -439,6 +453,15 @@
}
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))
+ {
+ return action;
+ }
+ else
+ return ACTION_EXIT_MENUITEM;
+ }
break;
}
return action;
Index: manual/working_with_playlists/main.tex
===================================================================
--- manual/working_with_playlists/main.tex (revision 23378)
+++ manual/working_with_playlists/main.tex (working copy)
@@ -100,7 +100,9 @@
\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 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
deleted immediately from the playlist after they have been played. Also,
queued tracks are not saved to the playlist file (see
@@ -112,6 +114,8 @@
\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).
Current playing track is queued.
\end{description}