浏览代码

linux-pipewire: Factor out connection props in a struct

So that we can expand the number of construct-time connection
properties without changing the function signature every time.
This is mostly an ergonomic change for now, but it'll be very
useful when introducing the Camera portal code.
Georges Basile Stavracas Neto 1 年之前
父节点
当前提交
a1db8e5bde
共有 3 个文件被更改,包括 25 次插入14 次删除
  1. 8 6
      plugins/linux-pipewire/pipewire.c
  2. 8 4
      plugins/linux-pipewire/pipewire.h
  3. 9 4
      plugins/linux-pipewire/screencast-portal.c

+ 8 - 6
plugins/linux-pipewire/pipewire.c

@@ -1222,10 +1222,9 @@ void obs_pipewire_destroy(obs_pipewire *obs_pw)
 	bfree(obs_pw);
 	bfree(obs_pw);
 }
 }
 
 
-obs_pipewire_stream *
-obs_pipewire_connect_stream(obs_pipewire *obs_pw, obs_source_t *source,
-			    int pipewire_node, const char *stream_name,
-			    struct pw_properties *stream_properties)
+obs_pipewire_stream *obs_pipewire_connect_stream(
+	obs_pipewire *obs_pw, obs_source_t *source, int pipewire_node,
+	const struct obs_pipwire_connect_stream_info *connect_info)
 {
 {
 	struct spa_pod_builder pod_builder;
 	struct spa_pod_builder pod_builder;
 	const struct spa_pod **params = NULL;
 	const struct spa_pod **params = NULL;
@@ -1233,6 +1232,8 @@ obs_pipewire_connect_stream(obs_pipewire *obs_pw, obs_source_t *source,
 	uint32_t n_params;
 	uint32_t n_params;
 	uint8_t params_buffer[4096];
 	uint8_t params_buffer[4096];
 
 
+	assert(connect_info != NULL);
+
 	obs_pw_stream = bzalloc(sizeof(obs_pipewire_stream));
 	obs_pw_stream = bzalloc(sizeof(obs_pipewire_stream));
 	obs_pw_stream->obs_pw = obs_pw;
 	obs_pw_stream->obs_pw = obs_pw;
 	obs_pw_stream->source = source;
 	obs_pw_stream->source = source;
@@ -1248,8 +1249,9 @@ obs_pipewire_connect_stream(obs_pipewire *obs_pw, obs_source_t *source,
 	blog(LOG_DEBUG, "[pipewire] registered event %p", obs_pw_stream->reneg);
 	blog(LOG_DEBUG, "[pipewire] registered event %p", obs_pw_stream->reneg);
 
 
 	/* Stream */
 	/* Stream */
-	obs_pw_stream->stream =
-		pw_stream_new(obs_pw->core, stream_name, stream_properties);
+	obs_pw_stream->stream = pw_stream_new(obs_pw->core,
+					      connect_info->stream_name,
+					      connect_info->stream_properties);
 	pw_stream_add_listener(obs_pw_stream->stream,
 	pw_stream_add_listener(obs_pw_stream->stream,
 			       &obs_pw_stream->stream_listener, &stream_events,
 			       &obs_pw_stream->stream_listener, &stream_events,
 			       obs_pw_stream);
 			       obs_pw_stream);

+ 8 - 4
plugins/linux-pipewire/pipewire.h

@@ -28,13 +28,17 @@
 typedef struct _obs_pipewire obs_pipewire;
 typedef struct _obs_pipewire obs_pipewire;
 typedef struct _obs_pipewire_stream obs_pipewire_stream;
 typedef struct _obs_pipewire_stream obs_pipewire_stream;
 
 
+struct obs_pipwire_connect_stream_info {
+	const char *stream_name;
+	struct pw_properties *stream_properties;
+};
+
 obs_pipewire *obs_pipewire_create(int pipewire_fd);
 obs_pipewire *obs_pipewire_create(int pipewire_fd);
 void obs_pipewire_destroy(obs_pipewire *obs_pw);
 void obs_pipewire_destroy(obs_pipewire *obs_pw);
 
 
-obs_pipewire_stream *
-obs_pipewire_connect_stream(obs_pipewire *obs_pw, obs_source_t *source,
-			    int pipewire_node, const char *stream_name,
-			    struct pw_properties *stream_properties);
+obs_pipewire_stream *obs_pipewire_connect_stream(
+	obs_pipewire *obs_pw, obs_source_t *source, int pipewire_node,
+	const struct obs_pipwire_connect_stream_info *connect_info);
 
 
 void obs_pipewire_stream_show(obs_pipewire_stream *obs_pw_stream);
 void obs_pipewire_stream_show(obs_pipewire_stream *obs_pw_stream);
 void obs_pipewire_stream_hide(obs_pipewire_stream *obs_pw_stream);
 void obs_pipewire_stream_hide(obs_pipewire_stream *obs_pw_stream);

+ 9 - 4
plugins/linux-pipewire/screencast-portal.c

@@ -158,6 +158,7 @@ static const char *capture_type_to_string(enum portal_capture_type capture_type)
 static void on_pipewire_remote_opened_cb(GObject *source, GAsyncResult *res,
 static void on_pipewire_remote_opened_cb(GObject *source, GAsyncResult *res,
 					 void *user_data)
 					 void *user_data)
 {
 {
+	struct obs_pipwire_connect_stream_info connect_info;
 	struct screencast_portal_capture *capture;
 	struct screencast_portal_capture *capture;
 	g_autoptr(GUnixFDList) fd_list = NULL;
 	g_autoptr(GUnixFDList) fd_list = NULL;
 	g_autoptr(GVariant) result = NULL;
 	g_autoptr(GVariant) result = NULL;
@@ -192,12 +193,16 @@ static void on_pipewire_remote_opened_cb(GObject *source, GAsyncResult *res,
 	if (!capture->obs_pw)
 	if (!capture->obs_pw)
 		return;
 		return;
 
 
+	connect_info = (struct obs_pipwire_connect_stream_info){
+		.stream_name = "OBS Studio",
+		.stream_properties = pw_properties_new(
+			PW_KEY_MEDIA_TYPE, "Video", PW_KEY_MEDIA_CATEGORY,
+			"Capture", PW_KEY_MEDIA_ROLE, "Screen", NULL),
+	};
+
 	capture->obs_pw_stream = obs_pipewire_connect_stream(
 	capture->obs_pw_stream = obs_pipewire_connect_stream(
 		capture->obs_pw, capture->source, capture->pipewire_node,
 		capture->obs_pw, capture->source, capture->pipewire_node,
-		"OBS Studio",
-		pw_properties_new(PW_KEY_MEDIA_TYPE, "Video",
-				  PW_KEY_MEDIA_CATEGORY, "Capture",
-				  PW_KEY_MEDIA_ROLE, "Screen", NULL));
+		&connect_info);
 	obs_pipewire_stream_set_cursor_visible(capture->obs_pw_stream,
 	obs_pipewire_stream_set_cursor_visible(capture->obs_pw_stream,
 					       capture->cursor_visible);
 					       capture->cursor_visible);
 }
 }