Sfoglia il codice sorgente

linux-pipewire: Start camera only after we find the device

Wait with starting the camera until we find the device in the
registry. Avoids cases where the camera stays unlinked.
Wim Taymans 3 anni fa
parent
commit
e6d98ebfbb
1 ha cambiato i file con 9 aggiunte e 6 eliminazioni
  1. 9 6
      plugins/linux-pipewire/camera-portal.c

+ 9 - 6
plugins/linux-pipewire/camera-portal.c

@@ -280,6 +280,8 @@ static void on_registry_global_cb(void *user_data, uint32_t id,
 	registry = obs_pipewire_get_registry(connection->obs_pw);
 	device_id = spa_dict_lookup(props, SPA_KEY_NODE_NAME);
 
+	blog(LOG_INFO, "[camera-portal] Found device %s", device_id);
+
 	device = camera_device_new(id, props);
 	device->proxy = pw_registry_bind(registry, id, type, version, 0);
 	if (!device->proxy) {
@@ -292,6 +294,13 @@ static void on_registry_global_cb(void *user_data, uint32_t id,
 			      &proxy_events, device);
 
 	g_hash_table_insert(connection->devices, bstrdup(device_id), device);
+
+	for (size_t i = 0; i < connection->sources->len; i++) {
+		struct camera_portal_source *camera_source =
+			g_ptr_array_index(connection->sources, i);
+		if (strcmp(camera_source->device_id, device_id) == 0)
+			stream_camera(camera_source);
+	}
 }
 
 static void on_registry_global_remove_cb(void *user_data, uint32_t id)
@@ -355,12 +364,6 @@ static void on_pipewire_remote_opened_cb(GObject *source, GAsyncResult *res,
 		pipewire_fd, &registry_events, connection);
 
 	obs_pipewire_roundtrip(connection->obs_pw);
-
-	for (size_t i = 0; i < connection->sources->len; i++) {
-		struct camera_portal_source *camera_source =
-			g_ptr_array_index(connection->sources, i);
-		stream_camera(camera_source);
-	}
 }
 
 static void open_pipewire_remote(void)