mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	port: improve buffer handling
Remove the buffers_move method, it's not needed.
This commit is contained in:
		
							parent
							
								
									d4fab985a2
								
							
						
					
					
						commit
						9c4e5f4e27
					
				
					 5 changed files with 20 additions and 28 deletions
				
			
		| 
						 | 
					@ -301,10 +301,3 @@ void pw_buffers_clear(struct pw_buffers *buffers)
 | 
				
			||||||
	free(buffers->buffers);
 | 
						free(buffers->buffers);
 | 
				
			||||||
	spa_zero(*buffers);
 | 
						spa_zero(*buffers);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
SPA_EXPORT
 | 
					 | 
				
			||||||
void pw_buffers_move(struct pw_buffers *dest, struct pw_buffers *src)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	*dest = *src;
 | 
					 | 
				
			||||||
	spa_zero(*src);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,6 @@ int pw_buffers_negotiate(struct pw_core *core, uint32_t flags,
 | 
				
			||||||
		struct spa_node *innode, uint32_t in_port_id,
 | 
							struct spa_node *innode, uint32_t in_port_id,
 | 
				
			||||||
		struct pw_buffers *result);
 | 
							struct pw_buffers *result);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void pw_buffers_move(struct pw_buffers *dest, struct pw_buffers *src);
 | 
					 | 
				
			||||||
void pw_buffers_clear(struct pw_buffers *buffers);
 | 
					void pw_buffers_clear(struct pw_buffers *buffers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -417,7 +417,6 @@ static int do_allocation(struct pw_link *this)
 | 
				
			||||||
	uint32_t in_flags, out_flags;
 | 
						uint32_t in_flags, out_flags;
 | 
				
			||||||
	char *error = NULL;
 | 
						char *error = NULL;
 | 
				
			||||||
	struct pw_port *input, *output;
 | 
						struct pw_port *input, *output;
 | 
				
			||||||
	struct pw_buffers allocation = { NULL, };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (this->info.state > PW_LINK_STATE_ALLOCATING)
 | 
						if (this->info.state > PW_LINK_STATE_ALLOCATING)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
| 
						 | 
					@ -441,9 +440,9 @@ static int do_allocation(struct pw_link *this)
 | 
				
			||||||
		input->node->live = true;
 | 
							input->node->live = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (output->allocation.n_buffers) {
 | 
						if (output->buffers.n_buffers) {
 | 
				
			||||||
		pw_log_debug(NAME" %p: reusing %d output buffers %p", this,
 | 
							pw_log_debug(NAME" %p: reusing %d output buffers %p", this,
 | 
				
			||||||
				output->allocation.n_buffers, output->allocation.buffers);
 | 
									output->buffers.n_buffers, output->buffers.buffers);
 | 
				
			||||||
		this->rt.out_mix.have_buffers = true;
 | 
							this->rt.out_mix.have_buffers = true;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		uint32_t flags, alloc_flags;
 | 
							uint32_t flags, alloc_flags;
 | 
				
			||||||
| 
						 | 
					@ -460,22 +459,21 @@ static int do_allocation(struct pw_link *this)
 | 
				
			||||||
		if ((res = pw_buffers_negotiate(this->core, alloc_flags,
 | 
							if ((res = pw_buffers_negotiate(this->core, alloc_flags,
 | 
				
			||||||
						output->node->node, output->port_id,
 | 
											output->node->node, output->port_id,
 | 
				
			||||||
						input->node->node, input->port_id,
 | 
											input->node->node, input->port_id,
 | 
				
			||||||
						&allocation)) < 0) {
 | 
											&output->buffers)) < 0) {
 | 
				
			||||||
			asprintf(&error, "error alloc buffers: %s", spa_strerror(res));
 | 
								asprintf(&error, "error alloc buffers: %s", spa_strerror(res));
 | 
				
			||||||
			goto error;
 | 
								goto error;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pw_log_debug(NAME" %p: allocating %d buffers %p", this,
 | 
							pw_log_debug(NAME" %p: allocating %d buffers %p", this,
 | 
				
			||||||
			     allocation.n_buffers, allocation.buffers);
 | 
								     output->buffers.n_buffers, output->buffers.buffers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ((res = pw_port_use_buffers(output, &this->rt.out_mix,
 | 
							if ((res = pw_port_use_buffers(output, &this->rt.out_mix, flags,
 | 
				
			||||||
					flags, allocation.buffers, allocation.n_buffers)) < 0) {
 | 
											output->buffers.buffers,
 | 
				
			||||||
 | 
											output->buffers.n_buffers)) < 0) {
 | 
				
			||||||
			asprintf(&error, "error use output buffers: %d (%s)", res,
 | 
								asprintf(&error, "error use output buffers: %d (%s)", res,
 | 
				
			||||||
					spa_strerror(res));
 | 
										spa_strerror(res));
 | 
				
			||||||
			goto error;
 | 
								goto error;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		pw_buffers_move(&output->allocation, &allocation);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (SPA_RESULT_IS_ASYNC(res)) {
 | 
							if (SPA_RESULT_IS_ASYNC(res)) {
 | 
				
			||||||
			res = spa_node_sync(output->node->node, res),
 | 
								res = spa_node_sync(output->node->node, res),
 | 
				
			||||||
			pw_work_queue_add(impl->work, output, res,
 | 
								pw_work_queue_add(impl->work, output, res,
 | 
				
			||||||
| 
						 | 
					@ -488,11 +486,11 @@ static int do_allocation(struct pw_link *this)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_debug(NAME" %p: using %d buffers %p on input port", this,
 | 
						pw_log_debug(NAME" %p: using %d buffers %p on input port", this,
 | 
				
			||||||
		     output->allocation.n_buffers, output->allocation.buffers);
 | 
							     output->buffers.n_buffers, output->buffers.buffers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((res = pw_port_use_buffers(input, &this->rt.in_mix, 0,
 | 
						if ((res = pw_port_use_buffers(input, &this->rt.in_mix, 0,
 | 
				
			||||||
				output->allocation.buffers,
 | 
									output->buffers.buffers,
 | 
				
			||||||
				output->allocation.n_buffers)) < 0) {
 | 
									output->buffers.n_buffers)) < 0) {
 | 
				
			||||||
		asprintf(&error, "error use input buffers: %d (%s)", res,
 | 
							asprintf(&error, "error use input buffers: %d (%s)", res,
 | 
				
			||||||
				spa_strerror(res));
 | 
									spa_strerror(res));
 | 
				
			||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
| 
						 | 
					@ -508,7 +506,7 @@ static int do_allocation(struct pw_link *this)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
error:
 | 
					error:
 | 
				
			||||||
	pw_buffers_clear(&output->allocation);
 | 
						pw_buffers_clear(&output->buffers);
 | 
				
			||||||
	pw_link_update_state(this, PW_LINK_STATE_ERROR, error);
 | 
						pw_link_update_state(this, PW_LINK_STATE_ERROR, error);
 | 
				
			||||||
	return res;
 | 
						return res;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -984,7 +984,8 @@ void pw_port_destroy(struct pw_port *port)
 | 
				
			||||||
	pw_log_debug(NAME" %p: free", port);
 | 
						pw_log_debug(NAME" %p: free", port);
 | 
				
			||||||
	pw_port_emit_free(port);
 | 
						pw_port_emit_free(port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_buffers_clear(&port->allocation);
 | 
						pw_buffers_clear(&port->buffers);
 | 
				
			||||||
 | 
						pw_buffers_clear(&port->mix_buffers);
 | 
				
			||||||
	free((void*)port->error);
 | 
						free((void*)port->error);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_map_clear(&port->mix_port_map);
 | 
						pw_map_clear(&port->mix_port_map);
 | 
				
			||||||
| 
						 | 
					@ -1165,7 +1166,8 @@ int pw_port_set_param(struct pw_port *port, uint32_t id, uint32_t flags,
 | 
				
			||||||
		pw_log_debug(NAME" %p: %d %p %d", port, port->state, param, res);
 | 
							pw_log_debug(NAME" %p: %d %p %d", port, port->state, param, res);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* setting the format always destroys the negotiated buffers */
 | 
							/* setting the format always destroys the negotiated buffers */
 | 
				
			||||||
		pw_buffers_clear(&port->allocation);
 | 
							pw_buffers_clear(&port->buffers);
 | 
				
			||||||
 | 
							pw_buffers_clear(&port->mix_buffers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (param == NULL || res < 0) {
 | 
							if (param == NULL || res < 0) {
 | 
				
			||||||
			pw_port_update_state(port, PW_PORT_STATE_CONFIGURE, NULL);
 | 
								pw_port_update_state(port, PW_PORT_STATE_CONFIGURE, NULL);
 | 
				
			||||||
| 
						 | 
					@ -1187,7 +1189,6 @@ static int negotiate_mixer_buffers(struct pw_port *port, uint32_t flags,
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (SPA_FLAG_IS_SET(port->mix_flags, PW_PORT_MIX_FLAG_NEGOTIATE)) {
 | 
						if (SPA_FLAG_IS_SET(port->mix_flags, PW_PORT_MIX_FLAG_NEGOTIATE)) {
 | 
				
			||||||
		struct pw_buffers allocation = { NULL, };
 | 
					 | 
				
			||||||
		int alloc_flags;
 | 
							int alloc_flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* try dynamic data */
 | 
							/* try dynamic data */
 | 
				
			||||||
| 
						 | 
					@ -1196,16 +1197,16 @@ static int negotiate_mixer_buffers(struct pw_port *port, uint32_t flags,
 | 
				
			||||||
		pw_log_debug(NAME" %p: %d.%d negotiate buffers on node: %p",
 | 
							pw_log_debug(NAME" %p: %d.%d negotiate buffers on node: %p",
 | 
				
			||||||
				port, port->direction, port->port_id, node->node);
 | 
									port, port->direction, port->port_id, node->node);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							pw_buffers_clear(&port->mix_buffers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ((res = pw_buffers_negotiate(node->core, alloc_flags,
 | 
							if ((res = pw_buffers_negotiate(node->core, alloc_flags,
 | 
				
			||||||
				port->mix, 0,
 | 
									port->mix, 0,
 | 
				
			||||||
				node->node, port->port_id,
 | 
									node->node, port->port_id,
 | 
				
			||||||
				&allocation)) < 0) {
 | 
									&port->mix_buffers)) < 0) {
 | 
				
			||||||
			pw_log_warn(NAME" %p: can't negotiate buffers: %s",
 | 
								pw_log_warn(NAME" %p: can't negotiate buffers: %s",
 | 
				
			||||||
					port, spa_strerror(res));
 | 
										port, spa_strerror(res));
 | 
				
			||||||
			return res;
 | 
								return res;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		pw_buffers_clear(&port->mix_buffers);
 | 
					 | 
				
			||||||
		pw_buffers_move(&port->mix_buffers, &allocation);
 | 
					 | 
				
			||||||
		buffers = port->mix_buffers.buffers;
 | 
							buffers = port->mix_buffers.buffers;
 | 
				
			||||||
		n_buffers = port->mix_buffers.n_buffers;
 | 
							n_buffers = port->mix_buffers.n_buffers;
 | 
				
			||||||
		flags = 0;
 | 
							flags = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -565,7 +565,8 @@ struct pw_port {
 | 
				
			||||||
	struct pw_port_info info;
 | 
						struct pw_port_info info;
 | 
				
			||||||
	struct spa_param_info params[MAX_PARAMS];
 | 
						struct spa_param_info params[MAX_PARAMS];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct pw_buffers allocation;
 | 
						struct pw_buffers buffers;	/**< buffers managed by this port, only on
 | 
				
			||||||
 | 
										  *  output ports, shared with all links */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct spa_list links;		/**< list of \ref pw_link */
 | 
						struct spa_list links;		/**< list of \ref pw_link */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue