Răsfoiți Sursa

Merge pull request #904 from cg2121/vlc-source-random

vlc-video: Add ability to shuffle playlist in VLC source
Jim 8 ani în urmă
părinte
comite
b0f5694181

+ 1 - 0
plugins/vlc-video/data/locale/en-US.ini

@@ -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"

+ 21 - 0
plugins/vlc-video/vlc-video-source.c

@@ -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"
@@ -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")
@@ -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)
@@ -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 */
 
@@ -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);
 }
@@ -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);