diff options
-rw-r--r-- | playlist.c | 8 | ||||
-rw-r--r-- | streamer.c | 24 | ||||
-rw-r--r-- | streamer.h | 3 |
3 files changed, 33 insertions, 2 deletions
@@ -105,7 +105,7 @@ static playlist_t dummy_playlist = { .refc = 1 }; -static int pl_order; // mirrors "playback.order" config variable +static int pl_order = -1; // mirrors "playback.order" config variable static int no_remove_notify; @@ -113,12 +113,16 @@ static playlist_t *addfiles_playlist; // current playlist for adding files/folde void pl_set_order (int order) { - if (pl_order != order || pl_order == PLAYBACK_ORDER_SHUFFLE_TRACKS || pl_order == PLAYBACK_ORDER_SHUFFLE_ALBUMS) { + int prev_order = pl_order; + + if (pl_order != order) { pl_order = order; for (playlist_t *plt = playlists_head; plt; plt = plt->next) { plt_reshuffle (plt, NULL, NULL); } } + + streamer_notify_order_changed (prev_order, pl_order); } int @@ -2243,3 +2243,27 @@ void streamer_get_output_format (ddb_waveformat_t *fmt) { memcpy (fmt, &output_format, sizeof (ddb_waveformat_t)); } + +void +streamer_notify_order_changed (int prev_order, int new_order) { + if (prev_order != PLAYBACK_ORDER_SHUFFLE_ALBUMS && new_order == PLAYBACK_ORDER_SHUFFLE_ALBUMS) { + streamer_lock (); + playItem_t *curr = playing_track; + if (curr) { + + const char *alb = pl_find_meta_raw (curr, "album"); + const char *art = pl_find_meta_raw (curr, "artist"); + playItem_t *next = curr->prev[PL_MAIN]; + while (next) { + if (alb == pl_find_meta_raw (next, "album") && art == pl_find_meta_raw (next, "artist")) { + next->played = 1; + next = next->prev[PL_MAIN]; + } + else { + break; + } + } + } + streamer_unlock (); + } +} @@ -127,4 +127,7 @@ streamer_dsp_postinit (void); int streamer_dsp_chain_save (const char *fname, ddb_dsp_context_t *chain); +void +streamer_notify_order_changed (int prev_order, int new_order); + #endif // __STREAMER_H |