mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	audioconvert: fix remap stages
Merge remap with convert to simplify some things.
This commit is contained in:
		
							parent
							
								
									c00df67c12
								
							
						
					
					
						commit
						1f4e8b96c2
					
				
					 1 changed files with 42 additions and 72 deletions
				
			
		| 
						 | 
					@ -2908,13 +2908,13 @@ static void run_wav_stage(struct stage *stage, struct stage_context *c)
 | 
				
			||||||
	handle_wav(impl, (const void **)c->datas[stage->in_idx], c->n_samples);
 | 
						handle_wav(impl, (const void **)c->datas[stage->in_idx], c->n_samples);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void add_wav_stage(struct impl *impl, struct stage_context *ctx, uint32_t idx)
 | 
					static void add_wav_stage(struct impl *impl, struct stage_context *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct stage *s = &impl->stages[impl->n_stages];
 | 
						struct stage *s = &impl->stages[impl->n_stages];
 | 
				
			||||||
	s->impl = impl;
 | 
						s->impl = impl;
 | 
				
			||||||
	s->passthrough = false;
 | 
						s->passthrough = false;
 | 
				
			||||||
	s->in_idx = idx;
 | 
						s->in_idx = ctx->src_idx;
 | 
				
			||||||
	s->out_idx = idx;
 | 
						s->out_idx = ctx->src_idx;
 | 
				
			||||||
	s->n_in = ctx->n_datas;
 | 
						s->n_in = ctx->n_datas;
 | 
				
			||||||
	s->n_out = ctx->n_datas;
 | 
						s->n_out = ctx->n_datas;
 | 
				
			||||||
	s->data = NULL;
 | 
						s->data = NULL;
 | 
				
			||||||
| 
						 | 
					@ -2949,31 +2949,6 @@ static void add_dst_remap_stage(struct impl *impl, struct stage_context *ctx)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void run_src_remap_stage(struct stage *s, struct stage_context *c)
 | 
					static void run_src_remap_stage(struct stage *s, struct stage_context *c)
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct impl *impl = s->impl;
 | 
					 | 
				
			||||||
	struct dir *dir = &impl->dir[SPA_DIRECTION_INPUT];
 | 
					 | 
				
			||||||
	uint32_t i;
 | 
					 | 
				
			||||||
	for (i = 0; i < dir->conv.n_channels; i++) {
 | 
					 | 
				
			||||||
		c->datas[s->out_idx][i] = c->datas[s->in_idx][dir->remap[i]];
 | 
					 | 
				
			||||||
		spa_log_trace_fp(impl->log, "%p: input remap %d -> %d", impl, dir->remap[i], i);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
static void add_src_remap_stage(struct impl *impl, struct stage_context *ctx)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct stage *s = &impl->stages[impl->n_stages];
 | 
					 | 
				
			||||||
	s->impl = impl;
 | 
					 | 
				
			||||||
	s->passthrough = false;
 | 
					 | 
				
			||||||
	s->in_idx = ctx->dst_idx;
 | 
					 | 
				
			||||||
	s->out_idx = CTX_DATA_REMAP_SRC;
 | 
					 | 
				
			||||||
	s->n_in = ctx->n_datas;
 | 
					 | 
				
			||||||
	s->n_out = ctx->n_datas;
 | 
					 | 
				
			||||||
	s->data = NULL;
 | 
					 | 
				
			||||||
	s->run = run_src_remap_stage;
 | 
					 | 
				
			||||||
	impl->n_stages++;
 | 
					 | 
				
			||||||
	ctx->dst_idx = CTX_DATA_REMAP_SRC;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void run_src_remap2_stage(struct stage *s, struct stage_context *c)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct impl *impl = s->impl;
 | 
						struct impl *impl = s->impl;
 | 
				
			||||||
	struct dir *dir = &impl->dir[SPA_DIRECTION_INPUT];
 | 
						struct dir *dir = &impl->dir[SPA_DIRECTION_INPUT];
 | 
				
			||||||
| 
						 | 
					@ -2983,7 +2958,7 @@ static void run_src_remap2_stage(struct stage *s, struct stage_context *c)
 | 
				
			||||||
		spa_log_trace_fp(impl->log, "%p: input remap %d -> %d", impl, dir->remap[i], i);
 | 
							spa_log_trace_fp(impl->log, "%p: input remap %d -> %d", impl, dir->remap[i], i);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static void add_src_remap2_stage(struct impl *impl, struct stage_context *ctx)
 | 
					static void add_src_remap_stage(struct impl *impl, struct stage_context *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct stage *s = &impl->stages[impl->n_stages];
 | 
						struct stage *s = &impl->stages[impl->n_stages];
 | 
				
			||||||
	s->impl = impl;
 | 
						s->impl = impl;
 | 
				
			||||||
| 
						 | 
					@ -2993,7 +2968,7 @@ static void add_src_remap2_stage(struct impl *impl, struct stage_context *ctx)
 | 
				
			||||||
	s->n_in = ctx->n_datas;
 | 
						s->n_in = ctx->n_datas;
 | 
				
			||||||
	s->n_out = ctx->n_datas;
 | 
						s->n_out = ctx->n_datas;
 | 
				
			||||||
	s->data = NULL;
 | 
						s->data = NULL;
 | 
				
			||||||
	s->run = run_src_remap2_stage;
 | 
						s->run = run_src_remap_stage;
 | 
				
			||||||
	impl->n_stages++;
 | 
						impl->n_stages++;
 | 
				
			||||||
	ctx->src_idx = CTX_DATA_REMAP_SRC;
 | 
						ctx->src_idx = CTX_DATA_REMAP_SRC;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -3002,8 +2977,20 @@ static void run_src_convert_stage(struct stage *s, struct stage_context *c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct impl *impl = s->impl;
 | 
						struct impl *impl = s->impl;
 | 
				
			||||||
	struct dir *dir = &impl->dir[SPA_DIRECTION_INPUT];
 | 
						struct dir *dir = &impl->dir[SPA_DIRECTION_INPUT];
 | 
				
			||||||
 | 
						void *remap_src_datas[MAX_PORTS], **dst;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_log_trace_fp(impl->log, "%p: input convert %d", impl, c->n_samples);
 | 
						spa_log_trace_fp(impl->log, "%p: input convert %d", impl, c->n_samples);
 | 
				
			||||||
	convert_process(&dir->conv, c->datas[s->out_idx], (const void**)c->datas[s->in_idx], c->n_samples);
 | 
						if (dir->need_remap) {
 | 
				
			||||||
 | 
							uint32_t i;
 | 
				
			||||||
 | 
							for (i = 0; i < dir->conv.n_channels; i++) {
 | 
				
			||||||
 | 
								remap_src_datas[i] = c->datas[s->out_idx][dir->remap[i]];
 | 
				
			||||||
 | 
								spa_log_trace_fp(impl->log, "%p: input remap %d -> %d", impl, dir->remap[i], i);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							dst = remap_src_datas;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							dst = c->datas[s->out_idx];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						convert_process(&dir->conv, dst, (const void**)c->datas[s->in_idx], c->n_samples);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static void add_src_convert_stage(struct impl *impl, struct stage_context *ctx)
 | 
					static void add_src_convert_stage(struct impl *impl, struct stage_context *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -3087,37 +3074,24 @@ static void add_channelmix_stage(struct impl *impl, struct stage_context *ctx)
 | 
				
			||||||
	ctx->src_idx = ctx->dst_idx;
 | 
						ctx->src_idx = ctx->dst_idx;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void run_dst_remap2_stage(struct stage *s, struct stage_context *c)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct impl *impl = s->impl;
 | 
					 | 
				
			||||||
	struct dir *dir = &impl->dir[SPA_DIRECTION_OUTPUT];
 | 
					 | 
				
			||||||
	uint32_t i;
 | 
					 | 
				
			||||||
	for (i = 0; i < dir->conv.n_channels; i++) {
 | 
					 | 
				
			||||||
		c->datas[s->out_idx][dir->remap[i]] = c->datas[s->in_idx][i];
 | 
					 | 
				
			||||||
		spa_log_trace_fp(impl->log, "%p: output remap %d -> %d", impl, i, dir->remap[i]);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
static void add_dst_remap2_stage(struct impl *impl, struct stage_context *ctx)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct stage *s = &impl->stages[impl->n_stages];
 | 
					 | 
				
			||||||
	s->impl = impl;
 | 
					 | 
				
			||||||
	s->passthrough = false;
 | 
					 | 
				
			||||||
	s->in_idx = ctx->src_idx;
 | 
					 | 
				
			||||||
	s->out_idx = CTX_DATA_REMAP_DST;
 | 
					 | 
				
			||||||
	s->n_in = ctx->n_datas;
 | 
					 | 
				
			||||||
	s->n_out = ctx->n_datas;
 | 
					 | 
				
			||||||
	s->data = NULL;
 | 
					 | 
				
			||||||
	s->run = run_dst_remap2_stage;
 | 
					 | 
				
			||||||
	impl->n_stages++;
 | 
					 | 
				
			||||||
	ctx->src_idx = CTX_DATA_REMAP_DST;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void run_dst_convert_stage(struct stage *s, struct stage_context *c)
 | 
					static void run_dst_convert_stage(struct stage *s, struct stage_context *c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct impl *impl = s->impl;
 | 
						struct impl *impl = s->impl;
 | 
				
			||||||
	struct dir *dir = &impl->dir[SPA_DIRECTION_OUTPUT];
 | 
						struct dir *dir = &impl->dir[SPA_DIRECTION_OUTPUT];
 | 
				
			||||||
 | 
						void *remap_datas[MAX_PORTS], **src;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_log_trace_fp(impl->log, "%p: output convert %d", impl, c->n_samples);
 | 
						spa_log_trace_fp(impl->log, "%p: output convert %d", impl, c->n_samples);
 | 
				
			||||||
	convert_process(&dir->conv, c->datas[s->out_idx], (const void **)c->datas[s->in_idx], c->n_samples);
 | 
						if (dir->need_remap) {
 | 
				
			||||||
 | 
							uint32_t i;
 | 
				
			||||||
 | 
							for (i = 0; i < dir->conv.n_channels; i++) {
 | 
				
			||||||
 | 
								remap_datas[dir->remap[i]] = c->datas[s->in_idx][i];
 | 
				
			||||||
 | 
								spa_log_trace_fp(impl->log, "%p: output remap %d -> %d", impl, i, dir->remap[i]);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							src = remap_datas;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							src = c->datas[s->in_idx];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						convert_process(&dir->conv, c->datas[s->out_idx], (const void **)src, c->n_samples);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static void add_dst_convert_stage(struct impl *impl, struct stage_context *ctx)
 | 
					static void add_dst_convert_stage(struct impl *impl, struct stage_context *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -3140,43 +3114,43 @@ static void recalc_stages(struct impl *this, struct stage_context *ctx)
 | 
				
			||||||
	bool in_passthrough, mix_passthrough, resample_passthrough, out_passthrough;
 | 
						bool in_passthrough, mix_passthrough, resample_passthrough, out_passthrough;
 | 
				
			||||||
	int tmp = 0;
 | 
						int tmp = 0;
 | 
				
			||||||
	struct port *ctrlport = ctx->ctrlport;
 | 
						struct port *ctrlport = ctx->ctrlport;
 | 
				
			||||||
 | 
						bool in_need_remap, out_need_remap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	this->recalc = false;
 | 
						this->recalc = false;
 | 
				
			||||||
	this->n_stages = 0;
 | 
						this->n_stages = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dir = &this->dir[SPA_DIRECTION_INPUT];
 | 
						dir = &this->dir[SPA_DIRECTION_INPUT];
 | 
				
			||||||
	in_passthrough = dir->conv.is_passthrough;
 | 
						in_passthrough = dir->conv.is_passthrough;
 | 
				
			||||||
 | 
						in_need_remap = dir->need_remap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dir = &this->dir[SPA_DIRECTION_OUTPUT];
 | 
				
			||||||
 | 
						out_passthrough = dir->conv.is_passthrough;
 | 
				
			||||||
 | 
						out_need_remap = dir->need_remap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resample_passthrough = resample_is_passthrough(this);
 | 
						resample_passthrough = resample_is_passthrough(this);
 | 
				
			||||||
	this->resample_passthrough = resample_passthrough;
 | 
						this->resample_passthrough = resample_passthrough;
 | 
				
			||||||
	mix_passthrough = SPA_FLAG_IS_SET(this->mix.flags, CHANNELMIX_FLAG_IDENTITY) &&
 | 
						mix_passthrough = SPA_FLAG_IS_SET(this->mix.flags, CHANNELMIX_FLAG_IDENTITY) &&
 | 
				
			||||||
		(ctrlport == NULL || ctrlport->ctrl == NULL) && (this->vol_ramp_sequence == NULL);
 | 
							(ctrlport == NULL || ctrlport->ctrl == NULL) && (this->vol_ramp_sequence == NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dir = &this->dir[SPA_DIRECTION_OUTPUT];
 | 
					 | 
				
			||||||
	out_passthrough = dir->conv.is_passthrough;
 | 
					 | 
				
			||||||
	if (in_passthrough && mix_passthrough && resample_passthrough)
 | 
						if (in_passthrough && mix_passthrough && resample_passthrough)
 | 
				
			||||||
		out_passthrough = false;
 | 
							out_passthrough = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (out_passthrough && dir->need_remap)
 | 
						if (out_passthrough && out_need_remap)
 | 
				
			||||||
		add_dst_remap_stage(this, ctx);
 | 
							add_dst_remap_stage(this, ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (this->direction == SPA_DIRECTION_INPUT)
 | 
						if (this->direction == SPA_DIRECTION_INPUT)
 | 
				
			||||||
		add_wav_stage(this, ctx, ctx->src_idx);
 | 
							add_wav_stage(this, ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dir = &this->dir[SPA_DIRECTION_INPUT];
 | 
					 | 
				
			||||||
	if (!in_passthrough) {
 | 
						if (!in_passthrough) {
 | 
				
			||||||
		if (mix_passthrough && resample_passthrough && out_passthrough)
 | 
							if (mix_passthrough && resample_passthrough && out_passthrough)
 | 
				
			||||||
			ctx->dst_idx = ctx->final_idx;
 | 
								ctx->dst_idx = ctx->final_idx;
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			ctx->dst_idx = CTX_DATA_TMP_0 + ((tmp++) & 1);
 | 
								ctx->dst_idx = CTX_DATA_TMP_0 + ((tmp++) & 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (dir->need_remap)
 | 
					 | 
				
			||||||
			add_src_remap_stage(this, ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		add_src_convert_stage(this, ctx);
 | 
							add_src_convert_stage(this, ctx);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if (dir->need_remap)
 | 
							if (in_need_remap)
 | 
				
			||||||
			add_src_remap2_stage(this, ctx);
 | 
								add_src_remap_stage(this, ctx);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (this->direction == SPA_DIRECTION_INPUT) {
 | 
						if (this->direction == SPA_DIRECTION_INPUT) {
 | 
				
			||||||
| 
						 | 
					@ -3209,14 +3183,10 @@ static void recalc_stages(struct impl *this, struct stage_context *ctx)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (!out_passthrough) {
 | 
						if (!out_passthrough) {
 | 
				
			||||||
		dir = &this->dir[SPA_DIRECTION_OUTPUT];
 | 
					 | 
				
			||||||
		if (dir->need_remap) {
 | 
					 | 
				
			||||||
			add_dst_remap2_stage(this, ctx);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		add_dst_convert_stage(this, ctx);
 | 
							add_dst_convert_stage(this, ctx);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (this->direction == SPA_DIRECTION_OUTPUT)
 | 
						if (this->direction == SPA_DIRECTION_OUTPUT)
 | 
				
			||||||
		add_wav_stage(this, ctx, ctx->dst_idx);
 | 
							add_wav_stage(this, ctx);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int impl_node_process(void *object)
 | 
					static int impl_node_process(void *object)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue