mirror of
				https://github.com/alsa-project/alsa-lib.git
				synced 2025-11-03 09:01:52 -05:00 
			
		
		
		
	alsa-lib: pcm_plug: fix float conversion for user specified ttable
Move custom ttable with equal channels case from a separate ttable_last
exception into a common plugins insertion loop.
Fixes plug with ttable for float pcms (jack, ladspa).
Example: aplay -fFLOAT_LE /dev/zero
pcm.!default {
    type plug
    slave.pcm { type null }
    ttable.0.0 1
}
Signed-off-by: Sergey <sergemp@mail.ru>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
			
			
This commit is contained in:
		
							parent
							
								
									95ab1c1c7c
								
							
						
					
					
						commit
						47ee780997
					
				
					 1 changed files with 11 additions and 25 deletions
				
			
		| 
						 | 
					@ -53,7 +53,7 @@ typedef struct {
 | 
				
			||||||
	const snd_config_t *rate_converter;
 | 
						const snd_config_t *rate_converter;
 | 
				
			||||||
	enum snd_pcm_plug_route_policy route_policy;
 | 
						enum snd_pcm_plug_route_policy route_policy;
 | 
				
			||||||
	snd_pcm_route_ttable_entry_t *ttable;
 | 
						snd_pcm_route_ttable_entry_t *ttable;
 | 
				
			||||||
	int ttable_ok, ttable_last;
 | 
						int ttable_ok;
 | 
				
			||||||
	unsigned int tt_ssize, tt_cused, tt_sused;
 | 
						unsigned int tt_ssize, tt_cused, tt_sused;
 | 
				
			||||||
} snd_pcm_plug_t;
 | 
					} snd_pcm_plug_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -380,7 +380,7 @@ static int snd_pcm_plug_change_channels(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm
 | 
				
			||||||
	snd_pcm_route_ttable_entry_t *ttable;
 | 
						snd_pcm_route_ttable_entry_t *ttable;
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
	if (clt->channels == slv->channels &&
 | 
						if (clt->channels == slv->channels &&
 | 
				
			||||||
	    (!plug->ttable || !plug->ttable_last))
 | 
						    (!plug->ttable || plug->ttable_ok))
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	if (clt->rate != slv->rate &&
 | 
						if (clt->rate != slv->rate &&
 | 
				
			||||||
	    clt->channels > slv->channels)
 | 
						    clt->channels > slv->channels)
 | 
				
			||||||
| 
						 | 
					@ -485,13 +485,15 @@ static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_p
 | 
				
			||||||
	/* No conversion is needed */
 | 
						/* No conversion is needed */
 | 
				
			||||||
	if (clt->format == slv->format &&
 | 
						if (clt->format == slv->format &&
 | 
				
			||||||
	    clt->rate == slv->rate &&
 | 
						    clt->rate == slv->rate &&
 | 
				
			||||||
	    clt->channels == slv->channels)
 | 
						    clt->channels == slv->channels &&
 | 
				
			||||||
 | 
						    (!plug->ttable || plug->ttable_ok))
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (snd_pcm_format_linear(slv->format)) {
 | 
						if (snd_pcm_format_linear(slv->format)) {
 | 
				
			||||||
		/* Conversion is done in another plugin */
 | 
							/* Conversion is done in another plugin */
 | 
				
			||||||
		if (clt->rate != slv->rate ||
 | 
							if (clt->rate != slv->rate ||
 | 
				
			||||||
		    clt->channels != slv->channels)
 | 
							    clt->channels != slv->channels ||
 | 
				
			||||||
 | 
							    (plug->ttable && !plug->ttable_ok))
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		cfmt = clt->format;
 | 
							cfmt = clt->format;
 | 
				
			||||||
		switch (clt->format) {
 | 
							switch (clt->format) {
 | 
				
			||||||
| 
						 | 
					@ -525,7 +527,8 @@ static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_p
 | 
				
			||||||
		if (snd_pcm_format_linear(clt->format)) {
 | 
							if (snd_pcm_format_linear(clt->format)) {
 | 
				
			||||||
			cfmt = clt->format;
 | 
								cfmt = clt->format;
 | 
				
			||||||
			f = snd_pcm_lfloat_open;
 | 
								f = snd_pcm_lfloat_open;
 | 
				
			||||||
		} else if (clt->rate != slv->rate || clt->channels != slv->channels) {
 | 
							} else if (clt->rate != slv->rate || clt->channels != slv->channels ||
 | 
				
			||||||
 | 
								   (plug->ttable && !plug->ttable_ok)) {
 | 
				
			||||||
			cfmt = SND_PCM_FORMAT_S16;
 | 
								cfmt = SND_PCM_FORMAT_S16;
 | 
				
			||||||
			f = snd_pcm_lfloat_open;
 | 
								f = snd_pcm_lfloat_open;
 | 
				
			||||||
		} else
 | 
							} else
 | 
				
			||||||
| 
						 | 
					@ -641,11 +644,12 @@ static int snd_pcm_plug_insert_plugins(snd_pcm_t *pcm,
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
	snd_pcm_plug_params_t p = *slave;
 | 
						snd_pcm_plug_params_t p = *slave;
 | 
				
			||||||
	unsigned int k = 0;
 | 
						unsigned int k = 0;
 | 
				
			||||||
	plug->ttable_ok = plug->ttable_last = 0;
 | 
						plug->ttable_ok = 0;
 | 
				
			||||||
	while (client->format != p.format ||
 | 
						while (client->format != p.format ||
 | 
				
			||||||
	       client->channels != p.channels ||
 | 
						       client->channels != p.channels ||
 | 
				
			||||||
	       client->rate != p.rate ||
 | 
						       client->rate != p.rate ||
 | 
				
			||||||
	       client->access != p.access) {
 | 
						       client->access != p.access ||
 | 
				
			||||||
 | 
						       (plug->ttable && !plug->ttable_ok)) {
 | 
				
			||||||
		snd_pcm_t *new;
 | 
							snd_pcm_t *new;
 | 
				
			||||||
		int err;
 | 
							int err;
 | 
				
			||||||
		if (k >= sizeof(funcs)/sizeof(*funcs))
 | 
							if (k >= sizeof(funcs)/sizeof(*funcs))
 | 
				
			||||||
| 
						 | 
					@ -660,24 +664,6 @@ static int snd_pcm_plug_insert_plugins(snd_pcm_t *pcm,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		k++;
 | 
							k++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#ifdef BUILD_PCM_PLUGIN_ROUTE
 | 
					 | 
				
			||||||
	/* it's exception, user specified ttable, but no reduction/expand */
 | 
					 | 
				
			||||||
	if (plug->ttable && !plug->ttable_ok) {
 | 
					 | 
				
			||||||
		snd_pcm_t *new;
 | 
					 | 
				
			||||||
		int err;
 | 
					 | 
				
			||||||
		plug->ttable_last = 1;
 | 
					 | 
				
			||||||
		err = snd_pcm_plug_change_channels(pcm, &new, client, &p);
 | 
					 | 
				
			||||||
		if (err < 0) {
 | 
					 | 
				
			||||||
			snd_pcm_plug_clear(pcm);
 | 
					 | 
				
			||||||
			return err;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		assert(err);
 | 
					 | 
				
			||||||
		assert(plug->ttable_ok);
 | 
					 | 
				
			||||||
		plug->gen.slave = new;
 | 
					 | 
				
			||||||
		pcm->fast_ops = new->fast_ops;
 | 
					 | 
				
			||||||
		pcm->fast_op_arg = new->fast_op_arg;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue