Ver Fonte

image-source: Use media control api for slideshow

Clayton Groeneveld há 5 anos atrás
pai
commit
42e7b16fde
1 ficheiros alterados com 52 adições e 13 exclusões
  1. 52 13
      plugins/image-source/obs-slideshow.c

+ 52 - 13
plugins/image-source/obs-slideshow.c

@@ -112,8 +112,22 @@ struct slideshow {
 	obs_hotkey_id stop_hotkey;
 	obs_hotkey_id next_hotkey;
 	obs_hotkey_id prev_hotkey;
+
+	enum obs_media_state state;
 };
 
+static void set_media_state(void *data, enum obs_media_state state)
+{
+	struct slideshow *ss = data;
+	ss->state = state;
+}
+
+static enum obs_media_state ss_get_state(void *data)
+{
+	struct slideshow *ss = data;
+	return ss->state;
+}
+
 static obs_source_t *get_transition(struct slideshow *ss)
 {
 	obs_source_t *tr;
@@ -242,18 +256,21 @@ static void do_transition(void *data, bool to_null)
 	struct slideshow *ss = data;
 	bool valid = item_valid(ss);
 
-	if (valid && ss->use_cut)
+	if (valid && ss->use_cut) {
 		obs_transition_set(ss->transition,
 				   ss->files.array[ss->cur_item].source);
 
-	else if (valid && !to_null)
+	} else if (valid && !to_null) {
 		obs_transition_start(ss->transition, OBS_TRANSITION_MODE_AUTO,
 				     ss->tr_speed,
 				     ss->files.array[ss->cur_item].source);
 
-	else
+	} else {
 		obs_transition_start(ss->transition, OBS_TRANSITION_MODE_AUTO,
 				     ss->tr_speed, NULL);
+		set_media_state(ss, OBS_MEDIA_STATE_ENDED);
+		obs_source_media_ended(ss->source);
+	}
 }
 
 static void ss_update(void *data, obs_data_t *settings)
@@ -453,13 +470,21 @@ static void ss_update(void *data, obs_data_t *settings)
 		ss->cur_item = random_file(ss);
 	if (new_tr)
 		obs_source_add_active_child(ss->source, new_tr);
-	if (ss->files.num)
+	if (ss->files.num) {
 		do_transition(ss, false);
 
+		if (ss->manual)
+			set_media_state(ss, OBS_MEDIA_STATE_PAUSED);
+		else
+			set_media_state(ss, OBS_MEDIA_STATE_PLAYING);
+
+		obs_source_media_started(ss->source);
+	}
+
 	obs_data_array_release(array);
 }
 
-static void ss_play_pause(void *data)
+static void ss_play_pause(void *data, bool pause)
 {
 	struct slideshow *ss = data;
 
@@ -468,9 +493,14 @@ static void ss_play_pause(void *data)
 		ss->paused = false;
 		do_transition(ss, false);
 	} else {
-		ss->paused = !ss->paused;
-		ss->manual = ss->paused;
+		ss->paused = pause;
+		ss->manual = pause;
 	}
+
+	if (pause)
+		set_media_state(ss, OBS_MEDIA_STATE_PAUSED);
+	else
+		set_media_state(ss, OBS_MEDIA_STATE_PLAYING);
 }
 
 static void ss_restart(void *data)
@@ -485,6 +515,7 @@ static void ss_restart(void *data)
 
 	ss->stop = false;
 	ss->paused = false;
+	set_media_state(ss, OBS_MEDIA_STATE_PLAYING);
 }
 
 static void ss_stop(void *data)
@@ -497,6 +528,8 @@ static void ss_stop(void *data)
 	do_transition(ss, true);
 	ss->stop = true;
 	ss->paused = false;
+
+	set_media_state(ss, OBS_MEDIA_STATE_STOPPED);
 }
 
 static void ss_next_slide(void *data)
@@ -536,7 +569,7 @@ static void play_pause_hotkey(void *data, obs_hotkey_id id,
 	struct slideshow *ss = data;
 
 	if (pressed && obs_source_showing(ss->source))
-		ss_play_pause(ss);
+		obs_source_media_play_pause(ss->source, !ss->paused);
 }
 
 static void restart_hotkey(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey,
@@ -548,7 +581,7 @@ static void restart_hotkey(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey,
 	struct slideshow *ss = data;
 
 	if (pressed && obs_source_showing(ss->source))
-		ss_restart(ss);
+		obs_source_media_restart(ss->source);
 }
 
 static void stop_hotkey(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey,
@@ -560,7 +593,7 @@ static void stop_hotkey(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey,
 	struct slideshow *ss = data;
 
 	if (pressed && obs_source_showing(ss->source))
-		ss_stop(ss);
+		obs_source_media_stop(ss->source);
 }
 
 static void next_slide_hotkey(void *data, obs_hotkey_id id,
@@ -575,7 +608,7 @@ static void next_slide_hotkey(void *data, obs_hotkey_id id,
 		return;
 
 	if (pressed && obs_source_showing(ss->source))
-		ss_next_slide(ss);
+		obs_source_media_next(ss->source);
 }
 
 static void previous_slide_hotkey(void *data, obs_hotkey_id id,
@@ -590,7 +623,7 @@ static void previous_slide_hotkey(void *data, obs_hotkey_id id,
 		return;
 
 	if (pressed && obs_source_showing(ss->source))
-		ss_previous_slide(ss);
+		obs_source_media_previous(ss->source);
 }
 
 static void ss_destroy(void *data)
@@ -931,7 +964,7 @@ struct obs_source_info slideshow_info = {
 	.id = "slideshow",
 	.type = OBS_SOURCE_TYPE_INPUT,
 	.output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW |
-			OBS_SOURCE_COMPOSITE,
+			OBS_SOURCE_COMPOSITE | OBS_SOURCE_CONTROLLABLE_MEDIA,
 	.get_name = ss_getname,
 	.create = ss_create,
 	.destroy = ss_destroy,
@@ -947,4 +980,10 @@ struct obs_source_info slideshow_info = {
 	.get_defaults = ss_defaults,
 	.get_properties = ss_properties,
 	.icon_type = OBS_ICON_TYPE_SLIDESHOW,
+	.media_play_pause = ss_play_pause,
+	.media_restart = ss_restart,
+	.media_stop = ss_stop,
+	.media_next = ss_next_slide,
+	.media_previous = ss_previous_slide,
+	.media_get_state = ss_get_state,
 };