mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	device: implement param introspection
This commit is contained in:
		
							parent
							
								
									4810d91c58
								
							
						
					
					
						commit
						6e66456381
					
				
					 2 changed files with 81 additions and 0 deletions
				
			
		| 
						 | 
					@ -32,6 +32,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct resource_data {
 | 
					struct resource_data {
 | 
				
			||||||
	struct spa_hook resource_listener;
 | 
						struct spa_hook resource_listener;
 | 
				
			||||||
 | 
						struct pw_device *device;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct node_data {
 | 
					struct node_data {
 | 
				
			||||||
| 
						 | 
					@ -103,6 +104,75 @@ static const struct pw_resource_events resource_events = {
 | 
				
			||||||
	.destroy = device_unbind_func,
 | 
						.destroy = device_unbind_func,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int pw_device_for_each_param(struct pw_device *device,
 | 
				
			||||||
 | 
								     uint32_t param_id,
 | 
				
			||||||
 | 
								     uint32_t index, uint32_t max,
 | 
				
			||||||
 | 
								     const struct spa_pod *filter,
 | 
				
			||||||
 | 
								     int (*callback) (void *data,
 | 
				
			||||||
 | 
										      uint32_t id, uint32_t index, uint32_t next,
 | 
				
			||||||
 | 
										      struct spa_pod *param),
 | 
				
			||||||
 | 
								     void *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int res = 0;
 | 
				
			||||||
 | 
						uint32_t idx, count;
 | 
				
			||||||
 | 
						uint8_t buf[4096];
 | 
				
			||||||
 | 
						struct spa_pod_builder b = { 0 };
 | 
				
			||||||
 | 
						struct spa_pod *param;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (max == 0)
 | 
				
			||||||
 | 
							max = UINT32_MAX;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (count = 0; count < max; count++) {
 | 
				
			||||||
 | 
							spa_pod_builder_init(&b, buf, sizeof(buf));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							idx = index;
 | 
				
			||||||
 | 
							if ((res = spa_device_enum_params(device->implementation,
 | 
				
			||||||
 | 
											param_id, &index,
 | 
				
			||||||
 | 
											filter, ¶m, &b)) <= 0)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ((res = callback(data, param_id, idx, index, param)) != 0)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int reply_param(void *data, uint32_t id, uint32_t index, uint32_t next, struct spa_pod *param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct pw_resource *resource = data;
 | 
				
			||||||
 | 
						pw_device_resource_param(resource, id, index, next, param);
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void device_enum_params(void *object, uint32_t id, uint32_t start, uint32_t num,
 | 
				
			||||||
 | 
					                             const struct spa_pod *filter)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct pw_resource *resource = object;
 | 
				
			||||||
 | 
						struct resource_data *data = pw_resource_get_user_data(resource);
 | 
				
			||||||
 | 
						struct pw_device *device = data->device;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pw_device_for_each_param(device, id, start, num, filter, reply_param, resource);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void device_set_param(void *object, uint32_t id, uint32_t flags,
 | 
				
			||||||
 | 
					                           const struct spa_pod *param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct pw_resource *resource = object;
 | 
				
			||||||
 | 
						struct resource_data *data = pw_resource_get_user_data(resource);
 | 
				
			||||||
 | 
						struct pw_device *device = data->device;
 | 
				
			||||||
 | 
						int res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ((res = spa_device_set_param(device->implementation, id, flags, param)) < 0)
 | 
				
			||||||
 | 
							pw_core_resource_error(resource->client->core_resource,
 | 
				
			||||||
 | 
									resource->id, res, spa_strerror(res));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct pw_device_proxy_methods device_methods = {
 | 
				
			||||||
 | 
						PW_VERSION_DEVICE_PROXY_METHODS,
 | 
				
			||||||
 | 
						.enum_params = device_enum_params,
 | 
				
			||||||
 | 
						.set_param = device_set_param
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
global_bind(void *_data, struct pw_client *client, uint32_t permissions,
 | 
					global_bind(void *_data, struct pw_client *client, uint32_t permissions,
 | 
				
			||||||
		  uint32_t version, uint32_t id)
 | 
							  uint32_t version, uint32_t id)
 | 
				
			||||||
| 
						 | 
					@ -117,8 +187,11 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions,
 | 
				
			||||||
		goto no_mem;
 | 
							goto no_mem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	data = pw_resource_get_user_data(resource);
 | 
						data = pw_resource_get_user_data(resource);
 | 
				
			||||||
 | 
						data->device = this;
 | 
				
			||||||
	pw_resource_add_listener(resource, &data->resource_listener, &resource_events, resource);
 | 
						pw_resource_add_listener(resource, &data->resource_listener, &resource_events, resource);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pw_resource_set_implementation(resource, &device_methods, resource);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_debug("device %p: bound to %d", this, resource->id);
 | 
						pw_log_debug("device %p: bound to %d", this, resource->id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_list_append(&global->resource_list, &resource->link);
 | 
						spa_list_append(&global->resource_list, &resource->link);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -93,6 +93,14 @@ int pw_device_update_properties(struct pw_device *device, const struct spa_dict
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const struct pw_properties *pw_device_get_properties(struct pw_device *device);
 | 
					const struct pw_properties *pw_device_get_properties(struct pw_device *device);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int pw_device_for_each_param(struct pw_device *device,
 | 
				
			||||||
 | 
								     uint32_t param_id,
 | 
				
			||||||
 | 
								     uint32_t index, uint32_t max,
 | 
				
			||||||
 | 
								     const struct spa_pod *filter,
 | 
				
			||||||
 | 
								     int (*callback) (void *data,
 | 
				
			||||||
 | 
										      uint32_t id, uint32_t index, uint32_t next,
 | 
				
			||||||
 | 
										      struct spa_pod *param),
 | 
				
			||||||
 | 
								     void *data);
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue