mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	audio-dsp: use the quantum to fill underrun with silence
This commit is contained in:
		
							parent
							
								
									055518b40d
								
							
						
					
					
						commit
						bc2b965591
					
				
					 1 changed files with 17 additions and 16 deletions
				
			
		| 
						 | 
				
			
			@ -760,13 +760,17 @@ static int schedule_mix(struct spa_node *_node)
 | 
			
		|||
	struct port *outp = GET_OUT_PORT(n, 0);
 | 
			
		||||
	struct spa_graph_node *node = &port->rt.mix_node;
 | 
			
		||||
	struct spa_graph_port *gp;
 | 
			
		||||
	size_t buffer_size = 0;
 | 
			
		||||
	int n_samples;
 | 
			
		||||
	struct buffer *outb;
 | 
			
		||||
	float *out = NULL;
 | 
			
		||||
	int layer = 0;
 | 
			
		||||
	int stride = n->channels;
 | 
			
		||||
	struct pw_driver_quantum *q;
 | 
			
		||||
 | 
			
		||||
	pw_log_trace("port %p", port);
 | 
			
		||||
	q = n->node->driver_node->rt.quantum;
 | 
			
		||||
 | 
			
		||||
	n_samples = q->size;
 | 
			
		||||
	pw_log_trace("port %p %d", port, n_samples);
 | 
			
		||||
 | 
			
		||||
	spa_list_for_each(gp, &node->ports[SPA_DIRECTION_INPUT], link) {
 | 
			
		||||
		struct pw_port_mix *mix = SPA_CONTAINER_OF(gp, struct pw_port_mix, port);
 | 
			
		||||
| 
						 | 
				
			
			@ -782,35 +786,32 @@ static int schedule_mix(struct spa_node *_node)
 | 
			
		|||
				inio->status, inio->buffer_id, mix->n_buffers);
 | 
			
		||||
 | 
			
		||||
		inb = mix->buffers[inio->buffer_id];
 | 
			
		||||
		buffer_size = inb->datas[0].chunk->size / sizeof(float);
 | 
			
		||||
		n_samples = SPA_MIN(n_samples, inb->datas[0].chunk->size / sizeof(float));
 | 
			
		||||
 | 
			
		||||
		if (layer++ == 0) {
 | 
			
		||||
			out = inb->datas[0].data;
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			add_f32(out, inb->datas[0].data, buffer_size);
 | 
			
		||||
			add_f32(out, inb->datas[0].data, n_samples);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		pw_log_trace("mix %p: input %p %p %zd", node, inio, mix->io, buffer_size);
 | 
			
		||||
		pw_log_trace("mix %p: input %p %p %d", node, inio, mix->io, n_samples);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	outb = peek_buffer(n, outp);
 | 
			
		||||
	if (outb == NULL)
 | 
			
		||||
		return -EPIPE;
 | 
			
		||||
 | 
			
		||||
	if (layer > 0) {
 | 
			
		||||
		n->conv_func(outb->ptr, out, port->port_id, buffer_size, stride);
 | 
			
		||||
	if (layer > 0)
 | 
			
		||||
		n->conv_func(outb->ptr, out, port->port_id, n_samples, stride);
 | 
			
		||||
	else
 | 
			
		||||
		n->fill_func(outb->ptr, port->port_id, n_samples, stride);
 | 
			
		||||
 | 
			
		||||
	outb->buf->datas[0].chunk->offset = 0;
 | 
			
		||||
		outb->buf->datas[0].chunk->size = buffer_size * outp->stride;
 | 
			
		||||
	outb->buf->datas[0].chunk->size = n_samples * outp->stride;
 | 
			
		||||
	outb->buf->datas[0].chunk->stride = outp->stride;
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		buffer_size = outb->buf->datas[0].maxsize / outp->stride;
 | 
			
		||||
		n->fill_func(outb->ptr, port->port_id, buffer_size, stride);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pw_log_trace("mix %p: layer %d %zd %d", node, layer, buffer_size, outp->stride);
 | 
			
		||||
	pw_log_trace("mix %p: layers:%d %d %d", node, layer, n_samples, outp->stride);
 | 
			
		||||
 | 
			
		||||
	return SPA_STATUS_HAVE_BUFFER;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue