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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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];
 | 
			
		||||
	s->impl = impl;
 | 
			
		||||
	s->passthrough = false;
 | 
			
		||||
	s->in_idx = idx;
 | 
			
		||||
	s->out_idx = idx;
 | 
			
		||||
	s->in_idx = ctx->src_idx;
 | 
			
		||||
	s->out_idx = ctx->src_idx;
 | 
			
		||||
	s->n_in = ctx->n_datas;
 | 
			
		||||
	s->n_out = ctx->n_datas;
 | 
			
		||||
	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)
 | 
			
		||||
{
 | 
			
		||||
	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 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);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
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];
 | 
			
		||||
	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_out = ctx->n_datas;
 | 
			
		||||
	s->data = NULL;
 | 
			
		||||
	s->run = run_src_remap2_stage;
 | 
			
		||||
	s->run = run_src_remap_stage;
 | 
			
		||||
	impl->n_stages++;
 | 
			
		||||
	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 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);
 | 
			
		||||
	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)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -3087,37 +3074,24 @@ static void add_channelmix_stage(struct impl *impl, struct stage_context *ctx)
 | 
			
		|||
	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)
 | 
			
		||||
{
 | 
			
		||||
	struct impl *impl = s->impl;
 | 
			
		||||
	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);
 | 
			
		||||
	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)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -3140,43 +3114,43 @@ static void recalc_stages(struct impl *this, struct stage_context *ctx)
 | 
			
		|||
	bool in_passthrough, mix_passthrough, resample_passthrough, out_passthrough;
 | 
			
		||||
	int tmp = 0;
 | 
			
		||||
	struct port *ctrlport = ctx->ctrlport;
 | 
			
		||||
	bool in_need_remap, out_need_remap;
 | 
			
		||||
 | 
			
		||||
	this->recalc = false;
 | 
			
		||||
	this->n_stages = 0;
 | 
			
		||||
 | 
			
		||||
	dir = &this->dir[SPA_DIRECTION_INPUT];
 | 
			
		||||
	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);
 | 
			
		||||
	this->resample_passthrough = resample_passthrough;
 | 
			
		||||
	mix_passthrough = SPA_FLAG_IS_SET(this->mix.flags, CHANNELMIX_FLAG_IDENTITY) &&
 | 
			
		||||
		(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)
 | 
			
		||||
		out_passthrough = false;
 | 
			
		||||
 | 
			
		||||
	if (out_passthrough && dir->need_remap)
 | 
			
		||||
	if (out_passthrough && out_need_remap)
 | 
			
		||||
		add_dst_remap_stage(this, ctx);
 | 
			
		||||
 | 
			
		||||
	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 (mix_passthrough && resample_passthrough && out_passthrough)
 | 
			
		||||
			ctx->dst_idx = ctx->final_idx;
 | 
			
		||||
		else
 | 
			
		||||
			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);
 | 
			
		||||
	} else {
 | 
			
		||||
		if (dir->need_remap)
 | 
			
		||||
			add_src_remap2_stage(this, ctx);
 | 
			
		||||
		if (in_need_remap)
 | 
			
		||||
			add_src_remap_stage(this, ctx);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (this->direction == SPA_DIRECTION_INPUT) {
 | 
			
		||||
| 
						 | 
				
			
			@ -3209,14 +3183,10 @@ static void recalc_stages(struct impl *this, struct stage_context *ctx)
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
	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);
 | 
			
		||||
	}
 | 
			
		||||
	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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue