mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	resample: use a float phase in update_rate
My making the phase into a float, the resampler can do finer grained adjustments, which should improve the stability of adaptive resampling
This commit is contained in:
		
							parent
							
								
									ffd9a8b892
								
							
						
					
					
						commit
						e25f7716b5
					
				
					 2 changed files with 7 additions and 5 deletions
				
			
		| 
						 | 
					@ -29,7 +29,7 @@ struct native_data {
 | 
				
			||||||
	uint32_t n_phases;
 | 
						uint32_t n_phases;
 | 
				
			||||||
	uint32_t in_rate;
 | 
						uint32_t in_rate;
 | 
				
			||||||
	uint32_t out_rate;
 | 
						uint32_t out_rate;
 | 
				
			||||||
	uint32_t phase;
 | 
						float phase;
 | 
				
			||||||
	uint32_t inc;
 | 
						uint32_t inc;
 | 
				
			||||||
	uint32_t frac;
 | 
						uint32_t frac;
 | 
				
			||||||
	uint32_t filter_stride;
 | 
						uint32_t filter_stride;
 | 
				
			||||||
| 
						 | 
					@ -117,11 +117,12 @@ DEFINE_RESAMPLER(full,arch)							\
 | 
				
			||||||
DEFINE_RESAMPLER(inter,arch)							\
 | 
					DEFINE_RESAMPLER(inter,arch)							\
 | 
				
			||||||
{										\
 | 
					{										\
 | 
				
			||||||
	struct native_data *data = r->data;					\
 | 
						struct native_data *data = r->data;					\
 | 
				
			||||||
	uint32_t index, phase, stride = data->filter_stride;			\
 | 
						uint32_t index, stride = data->filter_stride;			\
 | 
				
			||||||
	uint32_t n_phases = data->n_phases, out_rate = data->out_rate;		\
 | 
						uint32_t n_phases = data->n_phases, out_rate = data->out_rate;		\
 | 
				
			||||||
	uint32_t n_taps = data->n_taps;						\
 | 
						uint32_t n_taps = data->n_taps;						\
 | 
				
			||||||
	uint32_t c, o, olen = *out_len, ilen = *in_len;				\
 | 
						uint32_t c, o, olen = *out_len, ilen = *in_len;				\
 | 
				
			||||||
	uint32_t inc = data->inc, frac = data->frac;				\
 | 
						uint32_t inc = data->inc, frac = data->frac;				\
 | 
				
			||||||
 | 
						float phase;												\
 | 
				
			||||||
										\
 | 
															\
 | 
				
			||||||
	if (r->channels == 0)							\
 | 
						if (r->channels == 0)							\
 | 
				
			||||||
		return;								\
 | 
							return;								\
 | 
				
			||||||
| 
						 | 
					@ -134,7 +135,7 @@ DEFINE_RESAMPLER(inter,arch)							\
 | 
				
			||||||
		phase = data->phase;						\
 | 
							phase = data->phase;						\
 | 
				
			||||||
										\
 | 
															\
 | 
				
			||||||
		for (o = ooffs; o < olen && index + n_taps <= ilen; o++) {	\
 | 
							for (o = ooffs; o < olen && index + n_taps <= ilen; o++) {	\
 | 
				
			||||||
			float ph = (float)phase * n_phases / out_rate;		\
 | 
								float ph = phase * n_phases / out_rate;					\
 | 
				
			||||||
			uint32_t offset = floorf(ph);				\
 | 
								uint32_t offset = floorf(ph);				\
 | 
				
			||||||
			inner_product_ip_##arch(&d[o], &s[index],		\
 | 
								inner_product_ip_##arch(&d[o], &s[index],		\
 | 
				
			||||||
					&data->filter[(offset + 0) * stride],	\
 | 
										&data->filter[(offset + 0) * stride],	\
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -134,7 +134,8 @@ static inline uint32_t calc_gcd(uint32_t a, uint32_t b)
 | 
				
			||||||
static void impl_native_update_rate(struct resample *r, double rate)
 | 
					static void impl_native_update_rate(struct resample *r, double rate)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct native_data *data = r->data;
 | 
						struct native_data *data = r->data;
 | 
				
			||||||
	uint32_t in_rate, out_rate, phase, gcd, old_out_rate;
 | 
						uint32_t in_rate, out_rate, gcd, old_out_rate;
 | 
				
			||||||
 | 
						float phase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (SPA_LIKELY(data->rate == rate))
 | 
						if (SPA_LIKELY(data->rate == rate))
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					@ -149,7 +150,7 @@ static void impl_native_update_rate(struct resample *r, double rate)
 | 
				
			||||||
	out_rate /= gcd;
 | 
						out_rate /= gcd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	data->rate = rate;
 | 
						data->rate = rate;
 | 
				
			||||||
	data->phase = phase * out_rate / old_out_rate;
 | 
						data->phase = phase * out_rate / (float)old_out_rate;
 | 
				
			||||||
	data->in_rate = in_rate;
 | 
						data->in_rate = in_rate;
 | 
				
			||||||
	data->out_rate = out_rate;
 | 
						data->out_rate = out_rate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue