Skip to content

Commit

Permalink
vlc-video: Add ability to shuffle playlist in VLC source
Browse files Browse the repository at this point in the history
  • Loading branch information
cg2121 committed May 5, 2017
1 parent 54281f2 commit 7ff9510
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
1 change: 1 addition & 0 deletions plugins/vlc-video/data/locale/en-US.ini
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
VLCSource="VLC Video Source"
Playlist="Playlist"
LoopPlaylist="Loop Playlist"
Shuffle="Shuffle Playlist"
PlaybackBehavior="Visibility behavior"
PlaybackBehavior.StopRestart="Stop when not visible, restart when visible"
PlaybackBehavior.PauseUnpause="Pause when not visible, unpause when visible"
Expand Down
21 changes: 21 additions & 0 deletions plugins/vlc-video/vlc-video-source.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#define S_PLAYLIST "playlist"
#define S_LOOP "loop"
#define S_SHUFFLE "shuffle"
#define S_BEHAVIOR "playback_behavior"
#define S_BEHAVIOR_STOP_RESTART "stop_restart"
#define S_BEHAVIOR_PAUSE_UNPAUSE "pause_unpause"
Expand All @@ -20,6 +21,7 @@
#define T_(text) obs_module_text(text)
#define T_PLAYLIST T_("Playlist")
#define T_LOOP T_("LoopPlaylist")
#define T_SHUFFLE T_("shuffle")
#define T_BEHAVIOR T_("PlaybackBehavior")
#define T_BEHAVIOR_STOP_RESTART T_("PlaybackBehavior.StopRestart")
#define T_BEHAVIOR_PAUSE_UNPAUSE T_("PlaybackBehavior.PauseUnpause")
Expand Down Expand Up @@ -52,6 +54,7 @@ struct vlc_source {
DARRAY(struct media_file_data) files;
enum behavior behavior;
bool loop;
bool shuffle;
};

static libvlc_media_t *get_media(struct darray *array, const char *path)
Expand Down Expand Up @@ -542,6 +545,22 @@ static void vlcs_update(void *data, obs_data_t *settings)
c->files.da = new_files.da;
pthread_mutex_unlock(&c->mutex);

/* ------------------------------------- */
/* shuffle playlist */

c->shuffle = obs_data_get_bool(settings, S_SHUFFLE);

if (c->files.num > 1 && c->shuffle) {
for (size_t i = 0; i < c->files.num - 1; i++) {
size_t j = i + rand() / (RAND_MAX
/ (c->files.num - i) + 1);

struct media_file_data t = c->files.array[j];
c->files.array[j] = c->files.array[i];
c->files.array[i] = t;
}
}

/* ------------------------------------- */
/* clean up and restart playback */

Expand Down Expand Up @@ -658,6 +677,7 @@ static void vlcs_deactivate(void *data)
static void vlcs_defaults(obs_data_t *settings)
{
obs_data_set_default_bool(settings, S_LOOP, true);
obs_data_set_default_bool(settings, S_SHUFFLE, false);
obs_data_set_default_string(settings, S_BEHAVIOR,
S_BEHAVIOR_STOP_RESTART);
}
Expand All @@ -672,6 +692,7 @@ static obs_properties_t *vlcs_properties(void *data)
obs_property_t *p;

obs_properties_add_bool(ppts, S_LOOP, T_LOOP);
obs_properties_add_bool(ppts, S_SHUFFLE, T_SHUFFLE);

if (c) {
pthread_mutex_lock(&c->mutex);
Expand Down

0 comments on commit 7ff9510

Please sign in to comment.