mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	audioconvert2: rearrange some code
Move some code around so that we don't have to prepare the output buffers when there is no input to process.
This commit is contained in:
		
							parent
							
								
									d5e333eea7
								
							
						
					
					
						commit
						50c37cc801
					
				
					 1 changed files with 47 additions and 52 deletions
				
			
		| 
						 | 
					@ -1997,30 +1997,6 @@ static int impl_node_process(void *object)
 | 
				
			||||||
	bool in_avail = false, flush_in = false, flush_out = false, draining = false;
 | 
						bool in_avail = false, flush_in = false, flush_out = false, draining = false;
 | 
				
			||||||
	struct spa_io_buffers *io;
 | 
						struct spa_io_buffers *io;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* calculate quantum scale */
 | 
					 | 
				
			||||||
	if (SPA_LIKELY(this->io_position)) {
 | 
					 | 
				
			||||||
		double r =  this->rate_scale;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		quant_samples = this->io_position->clock.duration;
 | 
					 | 
				
			||||||
		if (this->direction == SPA_DIRECTION_INPUT) {
 | 
					 | 
				
			||||||
			if (this->io_position->clock.rate.denom != this->resample.o_rate)
 | 
					 | 
				
			||||||
				r = (double) this->io_position->clock.rate.denom / this->resample.o_rate;
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				r = 1.0;
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			if (this->io_position->clock.rate.denom != this->resample.i_rate)
 | 
					 | 
				
			||||||
				r = (double) this->resample.i_rate / this->io_position->clock.rate.denom;
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				r = 1.0;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (this->rate_scale != r) {
 | 
					 | 
				
			||||||
			spa_log_info(this->log, "scale %f->%f", this->rate_scale, r);
 | 
					 | 
				
			||||||
			this->rate_scale = r;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		quant_samples = this->quantum_limit;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	dir = &this->dir[SPA_DIRECTION_INPUT];
 | 
						dir = &this->dir[SPA_DIRECTION_INPUT];
 | 
				
			||||||
	in_passthrough = dir->conv.is_passthrough;
 | 
						in_passthrough = dir->conv.is_passthrough;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2084,16 +2060,61 @@ static int impl_node_process(void *object)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* calculate quantum scale */
 | 
				
			||||||
 | 
						if (SPA_LIKELY(this->io_position)) {
 | 
				
			||||||
 | 
							double r =  this->rate_scale;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							quant_samples = this->io_position->clock.duration;
 | 
				
			||||||
 | 
							if (this->direction == SPA_DIRECTION_INPUT) {
 | 
				
			||||||
 | 
								if (this->io_position->clock.rate.denom != this->resample.o_rate)
 | 
				
			||||||
 | 
									r = (double) this->io_position->clock.rate.denom / this->resample.o_rate;
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									r = 1.0;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								if (this->io_position->clock.rate.denom != this->resample.i_rate)
 | 
				
			||||||
 | 
									r = (double) this->resample.i_rate / this->io_position->clock.rate.denom;
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									r = 1.0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (this->rate_scale != r) {
 | 
				
			||||||
 | 
								spa_log_info(this->log, "scale %f->%f", this->rate_scale, r);
 | 
				
			||||||
 | 
								this->rate_scale = r;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							quant_samples = this->quantum_limit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (draining)
 | 
						if (draining)
 | 
				
			||||||
		n_samples = SPA_MIN(max_in, this->quantum_limit);
 | 
							n_samples = SPA_MIN(max_in, this->quantum_limit);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		n_samples = max_in - this->in_offset;
 | 
							n_samples = max_in - this->in_offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resample_passthrough = resample_is_passthrough(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (this->direction == SPA_DIRECTION_INPUT) {
 | 
				
			||||||
 | 
							uint32_t out = resample_update_rate_match(this, resample_passthrough, quant_samples, 0);
 | 
				
			||||||
 | 
							if (!in_avail || this->drained) {
 | 
				
			||||||
 | 
								spa_log_debug(this->log, "%p: no input drained:%d", this, this->drained);
 | 
				
			||||||
 | 
								/* no input, ask for more */
 | 
				
			||||||
 | 
								res |= this->drained ? SPA_STATUS_DRAINED : SPA_STATUS_NEED_DATA;
 | 
				
			||||||
 | 
								return res;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							/* in split mode we need to output exactly the size of the
 | 
				
			||||||
 | 
							 * duration so we don't try to flush early */
 | 
				
			||||||
 | 
							n_samples = SPA_MIN(n_samples, out);
 | 
				
			||||||
 | 
							max_out = quant_samples;
 | 
				
			||||||
 | 
							flush_out = false;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							/* in merge mode we consume one duration of samples and
 | 
				
			||||||
 | 
							 * always output the resulting data */
 | 
				
			||||||
 | 
							n_samples = SPA_MIN(n_samples, quant_samples);
 | 
				
			||||||
 | 
							max_out = this->quantum_limit;
 | 
				
			||||||
 | 
							in_avail = flush_out = true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dir = &this->dir[SPA_DIRECTION_OUTPUT];
 | 
						dir = &this->dir[SPA_DIRECTION_OUTPUT];
 | 
				
			||||||
	out_passthrough = dir->conv.is_passthrough;
 | 
						out_passthrough = dir->conv.is_passthrough;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	max_out = UINT32_MAX;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* collect output ports and monitor ports data */
 | 
						/* collect output ports and monitor ports data */
 | 
				
			||||||
	for (i = 0; i < dir->n_ports; i++) {
 | 
						for (i = 0; i < dir->n_ports; i++) {
 | 
				
			||||||
		port = GET_OUT_PORT(this, i);
 | 
							port = GET_OUT_PORT(this, i);
 | 
				
			||||||
| 
						 | 
					@ -2167,32 +2188,6 @@ static int impl_node_process(void *object)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resample_passthrough = resample_is_passthrough(this);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* calculate in/out sizes */
 | 
					 | 
				
			||||||
	if (this->direction == SPA_DIRECTION_INPUT) {
 | 
					 | 
				
			||||||
		/* in split mode we need to output exactly the size of the
 | 
					 | 
				
			||||||
		 * duration so we don't try to flush early */
 | 
					 | 
				
			||||||
		n_samples = SPA_MIN(n_samples,
 | 
					 | 
				
			||||||
				resample_update_rate_match(this, resample_passthrough, quant_samples, 0));
 | 
					 | 
				
			||||||
		max_out = SPA_MIN(max_out, quant_samples);
 | 
					 | 
				
			||||||
		flush_out = false;
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		/* in merge mode we consume one duration of samples and
 | 
					 | 
				
			||||||
		 * always output the resulting data */
 | 
					 | 
				
			||||||
		max_out = SPA_MIN(max_out, this->quantum_limit);
 | 
					 | 
				
			||||||
		n_samples = SPA_MIN(n_samples, quant_samples);
 | 
					 | 
				
			||||||
		in_avail = flush_out = true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!in_avail || this->drained) {
 | 
					 | 
				
			||||||
		spa_log_debug(this->log, "%p: no input drained:%d", this, this->drained);
 | 
					 | 
				
			||||||
		/* no input, ask for more */
 | 
					 | 
				
			||||||
		resample_update_rate_match(this, resample_passthrough, quant_samples, 0);
 | 
					 | 
				
			||||||
		res |= this->drained ? SPA_STATUS_DRAINED : SPA_STATUS_NEED_DATA;
 | 
					 | 
				
			||||||
		return res;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mix_passthrough = SPA_FLAG_IS_SET(this->mix.flags, CHANNELMIX_FLAG_IDENTITY);
 | 
						mix_passthrough = SPA_FLAG_IS_SET(this->mix.flags, CHANNELMIX_FLAG_IDENTITY);
 | 
				
			||||||
	end_passthrough = mix_passthrough && resample_passthrough && out_passthrough;
 | 
						end_passthrough = mix_passthrough && resample_passthrough && out_passthrough;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue