Browse Source

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 year ago
parent
commit
a1db8e5bde

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

@@ -1222,10 +1222,9 @@ void obs_pipewire_destroy(obs_pipewire *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;
 	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;
 	uint8_t params_buffer[4096];
 
+	assert(connect_info != NULL);
+
 	obs_pw_stream = bzalloc(sizeof(obs_pipewire_stream));
 	obs_pw_stream->obs_pw = obs_pw;
 	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);
 
 	/* 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,
 			       &obs_pw_stream->stream_listener, &stream_events,
 			       obs_pw_stream);

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

@@ -28,13 +28,17 @@
 typedef struct _obs_pipewire obs_pipewire;
 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);
 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_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,
 					 void *user_data)
 {
+	struct obs_pipwire_connect_stream_info connect_info;
 	struct screencast_portal_capture *capture;
 	g_autoptr(GUnixFDList) fd_list = 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)
 		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, 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,
 					       capture->cursor_visible);
 }