mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	audiomixer: support multiple channels when mixing with AVX, SSE and SSE2
This commit is contained in:
		
							parent
							
								
									3f8fb6e4dc
								
							
						
					
					
						commit
						767ac79328
					
				
					 4 changed files with 15 additions and 15 deletions
				
			
		| 
						 | 
					@ -124,12 +124,12 @@ mix_f32_avx(struct mix_ops *ops, void * SPA_RESTRICT dst, const void * SPA_RESTR
 | 
				
			||||||
	uint32_t i;
 | 
						uint32_t i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (n_src == 0)
 | 
						if (n_src == 0)
 | 
				
			||||||
		memset(dst, 0, n_samples * sizeof(float));
 | 
							memset(dst, 0, n_samples * ops->n_channels * sizeof(float));
 | 
				
			||||||
	else if (dst != src[0])
 | 
						else if (dst != src[0])
 | 
				
			||||||
		memcpy(dst, src[0], n_samples * sizeof(float));
 | 
							memcpy(dst, src[0], n_samples * ops->n_channels * sizeof(float));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 1; i + 2 < n_src; i += 3)
 | 
						for (i = 1; i + 2 < n_src; i += 3)
 | 
				
			||||||
		mix_4(dst, src[i], src[i + 1], src[i + 2], n_samples);
 | 
							mix_4(dst, src[i], src[i + 1], src[i + 2], n_samples);
 | 
				
			||||||
	for (; i < n_src; i++)
 | 
						for (; i < n_src; i++)
 | 
				
			||||||
		mix_2(dst, src[i], n_samples);
 | 
							mix_2(dst, src[i], n_samples * ops->n_channels);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,11 +79,11 @@ mix_f32_sse(struct mix_ops *ops, void * SPA_RESTRICT dst, const void * SPA_RESTR
 | 
				
			||||||
	uint32_t i;
 | 
						uint32_t i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (n_src == 0)
 | 
						if (n_src == 0)
 | 
				
			||||||
		memset(dst, 0, n_samples * sizeof(float));
 | 
							memset(dst, 0, n_samples * ops->n_channels * sizeof(float));
 | 
				
			||||||
	else if (dst != src[0])
 | 
						else if (dst != src[0])
 | 
				
			||||||
		memcpy(dst, src[0], n_samples * sizeof(float));
 | 
							memcpy(dst, src[0], n_samples * ops->n_channels * sizeof(float));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 1; i < n_src; i++) {
 | 
						for (i = 1; i < n_src; i++) {
 | 
				
			||||||
		mix_2(dst, src[i], n_samples);
 | 
							mix_2(dst, src[i], n_samples * ops->n_channels);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,11 +79,11 @@ mix_f64_sse2(struct mix_ops *ops, void * SPA_RESTRICT dst, const void * SPA_REST
 | 
				
			||||||
	uint32_t i;
 | 
						uint32_t i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (n_src == 0)
 | 
						if (n_src == 0)
 | 
				
			||||||
		memset(dst, 0, n_samples * sizeof(double));
 | 
							memset(dst, 0, n_samples * ops->n_channels * sizeof(double));
 | 
				
			||||||
	else if (dst != src[0])
 | 
						else if (dst != src[0])
 | 
				
			||||||
		memcpy(dst, src[0], n_samples * sizeof(double));
 | 
							memcpy(dst, src[0], n_samples * ops->n_channels * sizeof(double));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 1; i < n_src; i++) {
 | 
						for (i = 1; i < n_src; i++) {
 | 
				
			||||||
		mix_2(dst, src[i], n_samples);
 | 
							mix_2(dst, src[i], n_samples * ops->n_channels);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,20 +47,20 @@ static struct mix_info mix_table[] =
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* f32 */
 | 
						/* f32 */
 | 
				
			||||||
#if defined(HAVE_AVX)
 | 
					#if defined(HAVE_AVX)
 | 
				
			||||||
	{ SPA_AUDIO_FORMAT_F32, 1, SPA_CPU_FLAG_AVX, 4, mix_f32_avx },
 | 
						{ SPA_AUDIO_FORMAT_F32, 0, SPA_CPU_FLAG_AVX, 4, mix_f32_avx },
 | 
				
			||||||
	{ SPA_AUDIO_FORMAT_F32P, 1, SPA_CPU_FLAG_AVX, 4, mix_f32_avx },
 | 
						{ SPA_AUDIO_FORMAT_F32P, 0, SPA_CPU_FLAG_AVX, 4, mix_f32_avx },
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if defined (HAVE_SSE)
 | 
					#if defined (HAVE_SSE)
 | 
				
			||||||
	{ SPA_AUDIO_FORMAT_F32, 1, SPA_CPU_FLAG_SSE, 4, mix_f32_sse },
 | 
						{ SPA_AUDIO_FORMAT_F32, 0, SPA_CPU_FLAG_SSE, 4, mix_f32_sse },
 | 
				
			||||||
	{ SPA_AUDIO_FORMAT_F32P, 1, SPA_CPU_FLAG_SSE, 4, mix_f32_sse },
 | 
						{ SPA_AUDIO_FORMAT_F32P, 0, SPA_CPU_FLAG_SSE, 4, mix_f32_sse },
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	{ SPA_AUDIO_FORMAT_F32, 0, 0, 4, mix_f32_c },
 | 
						{ SPA_AUDIO_FORMAT_F32, 0, 0, 4, mix_f32_c },
 | 
				
			||||||
	{ SPA_AUDIO_FORMAT_F32P, 0, 0, 4, mix_f32_c },
 | 
						{ SPA_AUDIO_FORMAT_F32P, 0, 0, 4, mix_f32_c },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* f64 */
 | 
						/* f64 */
 | 
				
			||||||
#if defined (HAVE_SSE2)
 | 
					#if defined (HAVE_SSE2)
 | 
				
			||||||
	{ SPA_AUDIO_FORMAT_F64, 1, SPA_CPU_FLAG_SSE2, 8, mix_f64_sse2 },
 | 
						{ SPA_AUDIO_FORMAT_F64, 0, SPA_CPU_FLAG_SSE2, 8, mix_f64_sse2 },
 | 
				
			||||||
	{ SPA_AUDIO_FORMAT_F64P, 1, SPA_CPU_FLAG_SSE2, 8, mix_f64_sse2 },
 | 
						{ SPA_AUDIO_FORMAT_F64P, 0, SPA_CPU_FLAG_SSE2, 8, mix_f64_sse2 },
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	{ SPA_AUDIO_FORMAT_F64, 0, 0, 8, mix_f64_c },
 | 
						{ SPA_AUDIO_FORMAT_F64, 0, 0, 8, mix_f64_c },
 | 
				
			||||||
	{ SPA_AUDIO_FORMAT_F64P, 0, 0, 8, mix_f64_c },
 | 
						{ SPA_AUDIO_FORMAT_F64P, 0, 0, 8, mix_f64_c },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue