mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	audioconvert2: fix audio rate property
This commit is contained in:
		
							parent
							
								
									9babdee6cd
								
							
						
					
					
						commit
						e78a93d358
					
				
					 1 changed files with 17 additions and 15 deletions
				
			
		| 
						 | 
					@ -776,6 +776,10 @@ static int apply_props(struct impl *this, const struct spa_pod *param)
 | 
				
			||||||
				changed++;
 | 
									changed++;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							case SPA_PROP_rate:
 | 
				
			||||||
 | 
								if (spa_pod_get_double(&prop->value, &p->rate) == 0)
 | 
				
			||||||
 | 
									changed++;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case SPA_PROP_params:
 | 
							case SPA_PROP_params:
 | 
				
			||||||
			changed += parse_prop_params(this, &prop->value);
 | 
								changed += parse_prop_params(this, &prop->value);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
| 
						 | 
					@ -1895,6 +1899,8 @@ static inline int get_out_buffer(struct impl *this, struct port *port, struct bu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void resample_update_rate_match(struct impl *this, bool passthrough, uint32_t out_size, uint32_t in_queued)
 | 
					static void resample_update_rate_match(struct impl *this, bool passthrough, uint32_t out_size, uint32_t in_queued)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						double rate = this->rate_scale / this->props.rate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (this->io_rate_match) {
 | 
						if (this->io_rate_match) {
 | 
				
			||||||
		uint32_t match_size;
 | 
							uint32_t match_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1903,9 +1909,9 @@ static void resample_update_rate_match(struct impl *this, bool passthrough, uint
 | 
				
			||||||
			match_size = out_size;
 | 
								match_size = out_size;
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			if (SPA_FLAG_IS_SET(this->io_rate_match->flags, SPA_IO_RATE_MATCH_FLAG_ACTIVE))
 | 
								if (SPA_FLAG_IS_SET(this->io_rate_match->flags, SPA_IO_RATE_MATCH_FLAG_ACTIVE))
 | 
				
			||||||
				resample_update_rate(&this->resample, this->rate_scale * this->io_rate_match->rate);
 | 
									resample_update_rate(&this->resample, rate * this->io_rate_match->rate);
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				resample_update_rate(&this->resample, this->rate_scale);
 | 
									resample_update_rate(&this->resample, rate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			this->io_rate_match->delay = resample_delay(&this->resample);
 | 
								this->io_rate_match->delay = resample_delay(&this->resample);
 | 
				
			||||||
			match_size = resample_in_len(&this->resample, out_size);
 | 
								match_size = resample_in_len(&this->resample, out_size);
 | 
				
			||||||
| 
						 | 
					@ -1914,21 +1920,21 @@ static void resample_update_rate_match(struct impl *this, bool passthrough, uint
 | 
				
			||||||
		this->io_rate_match->size = match_size;
 | 
							this->io_rate_match->size = match_size;
 | 
				
			||||||
		spa_log_trace_fp(this->log, "%p: next match %u", this, match_size);
 | 
							spa_log_trace_fp(this->log, "%p: next match %u", this, match_size);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		resample_update_rate(&this->resample, this->rate_scale * this->props.rate);
 | 
							resample_update_rate(&this->resample, rate);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline bool resample_is_passthrough(struct impl *this)
 | 
					static inline bool resample_is_passthrough(struct impl *this)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return this->resample.i_rate == this->resample.o_rate && this->rate_scale == 1.0 &&
 | 
						return this->resample.i_rate == this->resample.o_rate && this->rate_scale == 1.0 &&
 | 
				
			||||||
 | 
							this->props.rate == 1.0 &&
 | 
				
			||||||
		(this->io_rate_match == NULL ||
 | 
							(this->io_rate_match == NULL ||
 | 
				
			||||||
		 !SPA_FLAG_IS_SET(this->io_rate_match->flags, SPA_IO_RATE_MATCH_FLAG_ACTIVE));
 | 
							 !SPA_FLAG_IS_SET(this->io_rate_match->flags, SPA_IO_RATE_MATCH_FLAG_ACTIVE));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void resample_recalc_rate_match(struct impl *this)
 | 
					static void resample_recalc_rate_match(struct impl *this, bool passthrough)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	bool passthrough = resample_is_passthrough(this);
 | 
						uint32_t out_size = this->io_position ? this->io_position->clock.duration : this->quantum_limit;
 | 
				
			||||||
	uint32_t out_size = this->io_position ? this->io_position->clock.duration : 1024;
 | 
					 | 
				
			||||||
	resample_update_rate_match(this, passthrough, out_size, 0);
 | 
						resample_update_rate_match(this, passthrough, out_size, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1942,18 +1948,15 @@ static int impl_node_process(void *object)
 | 
				
			||||||
	struct buffer *buf;
 | 
						struct buffer *buf;
 | 
				
			||||||
	struct spa_data *bd, *dst_bufs[MAX_PORTS];
 | 
						struct spa_data *bd, *dst_bufs[MAX_PORTS];
 | 
				
			||||||
	struct dir *dir;
 | 
						struct dir *dir;
 | 
				
			||||||
	int ready = 0, tmp = 0;
 | 
						int tmp = 0;
 | 
				
			||||||
	bool in_passthrough, mix_passthrough, resample_passthrough, out_passthrough, end_passthrough;
 | 
						bool in_passthrough, mix_passthrough, resample_passthrough, out_passthrough, end_passthrough;
 | 
				
			||||||
	uint32_t in_len, out_len;
 | 
						uint32_t in_len, out_len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (SPA_LIKELY(this->io_position))
 | 
					 | 
				
			||||||
		n_samples = this->io_position->clock.duration;
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		n_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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						n_samples = UINT32_MAX;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < dir->n_ports; i++) {
 | 
						for (i = 0; i < dir->n_ports; i++) {
 | 
				
			||||||
		port = GET_IN_PORT(this, i);
 | 
							port = GET_IN_PORT(this, i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1976,13 +1979,12 @@ static int impl_node_process(void *object)
 | 
				
			||||||
						bd->chunk->size, n_samples,
 | 
											bd->chunk->size, n_samples,
 | 
				
			||||||
						i * port->blocks + j, src_remap);
 | 
											i * port->blocks + j, src_remap);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			ready++;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resample_passthrough = resample_is_passthrough(this);
 | 
						resample_passthrough = resample_is_passthrough(this);
 | 
				
			||||||
	if (ready == 0) {
 | 
						if (n_samples == UINT32_MAX) {
 | 
				
			||||||
		resample_recalc_rate_match(this);
 | 
							resample_recalc_rate_match(this, resample_passthrough);
 | 
				
			||||||
		return SPA_STATUS_NEED_DATA;
 | 
							return SPA_STATUS_NEED_DATA;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue