mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	stream: handle endpoint-target for streams
This commit is contained in:
		
							parent
							
								
									7bce1762de
								
							
						
					
					
						commit
						4ccbce9932
					
				
					 5 changed files with 27 additions and 20 deletions
				
			
		| 
						 | 
				
			
			@ -121,6 +121,9 @@ static int client_endpoint_create_link(void *object, const struct spa_dict *prop
 | 
			
		|||
 | 
			
		||||
	pw_log_debug(NAME" %p: endpoint %p", impl, endpoint);
 | 
			
		||||
 | 
			
		||||
	if (props == NULL)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	if (!endpoint->active) {
 | 
			
		||||
		endpoint->format.info.raw.rate = 48000;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -287,6 +290,8 @@ static struct endpoint *make_endpoint(struct alsa_node *obj)
 | 
			
		|||
	endpoint->info.props = &endpoint->props->dict;
 | 
			
		||||
	spa_list_init(&endpoint->stream_list);
 | 
			
		||||
 | 
			
		||||
	pw_log_debug(NAME" %p: new endpoint %p for alsa node %p", impl, endpoint, obj);
 | 
			
		||||
 | 
			
		||||
	pw_client_endpoint_proxy_add_listener(endpoint->client_endpoint,
 | 
			
		||||
			&endpoint->client_endpoint_listener,
 | 
			
		||||
			&client_endpoint_events,
 | 
			
		||||
| 
						 | 
				
			
			@ -319,9 +324,6 @@ static int setup_alsa_fallback_endpoint(struct alsa_object *obj)
 | 
			
		|||
		if (s == NULL)
 | 
			
		||||
			return -errno;
 | 
			
		||||
 | 
			
		||||
		spa_list_append(&endpoint->stream_list, &s->link);
 | 
			
		||||
		endpoint->info.n_streams++;
 | 
			
		||||
 | 
			
		||||
		s->props = pw_properties_new(NULL, NULL);
 | 
			
		||||
		if ((str = pw_properties_get(n->props, PW_KEY_MEDIA_CLASS)) != NULL)
 | 
			
		||||
			pw_properties_set(s->props, PW_KEY_MEDIA_CLASS, str);
 | 
			
		||||
| 
						 | 
				
			
			@ -333,18 +335,22 @@ static int setup_alsa_fallback_endpoint(struct alsa_object *obj)
 | 
			
		|||
			pw_properties_set(s->props, PW_KEY_ENDPOINT_STREAM_NAME, "Capture");
 | 
			
		||||
 | 
			
		||||
		s->info.version = PW_VERSION_ENDPOINT_STREAM_INFO;
 | 
			
		||||
		s->info.id = n->id;
 | 
			
		||||
		s->info.id = endpoint->info.n_streams;
 | 
			
		||||
		s->info.endpoint_id = endpoint->info.id;
 | 
			
		||||
		s->info.name = (char*)pw_properties_get(s->props, PW_KEY_ENDPOINT_STREAM_NAME);
 | 
			
		||||
		s->info.change_mask = PW_ENDPOINT_STREAM_CHANGE_MASK_PROPS;
 | 
			
		||||
		s->info.props = &s->props->dict;
 | 
			
		||||
 | 
			
		||||
		pw_log_debug("stream %d", n->id);
 | 
			
		||||
		pw_log_debug("stream %d", s->info.id);
 | 
			
		||||
		pw_client_endpoint_proxy_stream_update(endpoint->client_endpoint,
 | 
			
		||||
				n->id,
 | 
			
		||||
				PW_CLIENT_ENDPOINT_STREAM_UPDATE_INFO,
 | 
			
		||||
				0, NULL,
 | 
			
		||||
				&s->info);
 | 
			
		||||
 | 
			
		||||
		spa_list_append(&endpoint->stream_list, &s->link);
 | 
			
		||||
		endpoint->info.n_streams++;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -551,7 +551,7 @@ int sm_media_session_roundtrip(struct sm_media_session *sess)
 | 
			
		|||
	pw_log_debug(NAME" %p: roundtrip %d", impl, seq);
 | 
			
		||||
 | 
			
		||||
	pw_loop_enter(loop->loop);
 | 
			
		||||
	while (impl->last_seq != seq) {
 | 
			
		||||
	while (impl->last_seq <= seq) {
 | 
			
		||||
		if ((res = pw_loop_iterate(loop->loop, -1)) < 0) {
 | 
			
		||||
			pw_log_warn(NAME" %p: iterate error %d (%s)",
 | 
			
		||||
				loop, res, spa_strerror(res));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -456,7 +456,7 @@ static int rescan_endpoint(struct impl *impl, struct endpoint *ep)
 | 
			
		|||
		return -EINVAL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	str = spa_dict_lookup(props, PW_KEY_NODE_TARGET);
 | 
			
		||||
	str = spa_dict_lookup(props, PW_KEY_ENDPOINT_TARGET);
 | 
			
		||||
	if (str != NULL)
 | 
			
		||||
		find.path_id = atoi(str);
 | 
			
		||||
	else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -150,18 +150,6 @@ static int client_endpoint_create_link(void *object, const struct spa_dict *prop
 | 
			
		|||
	if (props == NULL)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	p = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (p == NULL)
 | 
			
		||||
		return -errno;
 | 
			
		||||
 | 
			
		||||
	if (endpoint->info.direction == PW_DIRECTION_OUTPUT) {
 | 
			
		||||
		pw_properties_setf(p, PW_KEY_LINK_OUTPUT_NODE, "%d", endpoint->node->id);
 | 
			
		||||
		pw_properties_setf(p, PW_KEY_LINK_OUTPUT_PORT, "-1");
 | 
			
		||||
	} else {
 | 
			
		||||
		pw_properties_setf(p, PW_KEY_LINK_INPUT_NODE, "%d", endpoint->node->id);
 | 
			
		||||
		pw_properties_setf(p, PW_KEY_LINK_INPUT_PORT, "-1");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!endpoint->stream.active) {
 | 
			
		||||
		char buf[1024];
 | 
			
		||||
		struct spa_pod_builder b = { 0, };
 | 
			
		||||
| 
						 | 
				
			
			@ -175,7 +163,7 @@ static int client_endpoint_create_link(void *object, const struct spa_dict *prop
 | 
			
		|||
			SPA_TYPE_OBJECT_ParamPortConfig, SPA_PARAM_PortConfig,
 | 
			
		||||
			SPA_PARAM_PORT_CONFIG_direction, SPA_POD_Id(endpoint->info.direction),
 | 
			
		||||
			SPA_PARAM_PORT_CONFIG_mode,	 SPA_POD_Id(SPA_PARAM_PORT_CONFIG_MODE_dsp),
 | 
			
		||||
			SPA_PARAM_PORT_CONFIG_monitor,   SPA_POD_Bool(true),
 | 
			
		||||
			SPA_PARAM_PORT_CONFIG_monitor,   SPA_POD_Bool(false),
 | 
			
		||||
			SPA_PARAM_PORT_CONFIG_format,    SPA_POD_Pod(param));
 | 
			
		||||
 | 
			
		||||
		if (pw_log_level_enabled(SPA_LOG_LEVEL_DEBUG))
 | 
			
		||||
| 
						 | 
				
			
			@ -187,10 +175,17 @@ static int client_endpoint_create_link(void *object, const struct spa_dict *prop
 | 
			
		|||
		endpoint->stream.active = true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p = pw_properties_new_dict(props);
 | 
			
		||||
	if (p == NULL)
 | 
			
		||||
		return -errno;
 | 
			
		||||
 | 
			
		||||
	if (endpoint->info.direction == PW_DIRECTION_OUTPUT) {
 | 
			
		||||
		const char *str;
 | 
			
		||||
		struct sm_object *obj;
 | 
			
		||||
 | 
			
		||||
		pw_properties_setf(p, PW_KEY_LINK_OUTPUT_NODE, "%d", endpoint->node->id);
 | 
			
		||||
		pw_properties_setf(p, PW_KEY_LINK_OUTPUT_PORT, "-1");
 | 
			
		||||
 | 
			
		||||
		str = spa_dict_lookup(props, PW_KEY_ENDPOINT_LINK_INPUT_ENDPOINT);
 | 
			
		||||
		if (str == NULL) {
 | 
			
		||||
			pw_log_warn(NAME" %p: no target endpoint given", impl);
 | 
			
		||||
| 
						 | 
				
			
			@ -205,6 +200,9 @@ static int client_endpoint_create_link(void *object, const struct spa_dict *prop
 | 
			
		|||
		}
 | 
			
		||||
		pw_endpoint_proxy_create_link((struct pw_endpoint_proxy*)obj->proxy, &p->dict);
 | 
			
		||||
	} else {
 | 
			
		||||
		pw_properties_setf(p, PW_KEY_LINK_INPUT_NODE, "%d", endpoint->node->id);
 | 
			
		||||
		pw_properties_setf(p, PW_KEY_LINK_INPUT_PORT, "-1");
 | 
			
		||||
 | 
			
		||||
		sm_media_session_create_links(impl->session, &p->dict);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -246,6 +244,8 @@ static struct client_endpoint *make_endpoint(struct node *node)
 | 
			
		|||
			pw_properties_set(props, PW_KEY_ENDPOINT_NAME, name);
 | 
			
		||||
		if ((str = spa_dict_lookup(dict, PW_KEY_NODE_AUTOCONNECT)) != NULL)
 | 
			
		||||
			pw_properties_set(props, PW_KEY_ENDPOINT_AUTOCONNECT, str);
 | 
			
		||||
		if ((str = spa_dict_lookup(dict, PW_KEY_NODE_TARGET)) != NULL)
 | 
			
		||||
			pw_properties_set(props, PW_KEY_ENDPOINT_TARGET, str);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	proxy = sm_media_session_create_object(impl->session,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,7 @@ extern "C" {
 | 
			
		|||
								  *  Ex. "sound-card-speakers-usb" */
 | 
			
		||||
#define PW_KEY_ENDPOINT_AUTOCONNECT	"endpoint.autoconnect"	/**< try to automatically connect this
 | 
			
		||||
								  *  endpoint. */
 | 
			
		||||
#define PW_KEY_ENDPOINT_TARGET		"endpoint.target"	/**< the suggested target to connect to */
 | 
			
		||||
 | 
			
		||||
#define PW_KEY_ENDPOINT_STREAM_ID		"endpoint-stream.id"		/**< id of a stream */
 | 
			
		||||
#define PW_KEY_ENDPOINT_STREAM_NAME		"endpoint-stream.name"		/**< unique name of a stream */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue