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;
 | 
			
		||||
	enum snd_pcm_plug_route_policy route_policy;
 | 
			
		||||
	snd_pcm_route_ttable_entry_t *ttable;
 | 
			
		||||
	int ttable_ok, ttable_last;
 | 
			
		||||
	int ttable_ok;
 | 
			
		||||
	unsigned int tt_ssize, tt_cused, tt_sused;
 | 
			
		||||
} 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;
 | 
			
		||||
	int err;
 | 
			
		||||
	if (clt->channels == slv->channels &&
 | 
			
		||||
	    (!plug->ttable || !plug->ttable_last))
 | 
			
		||||
	    (!plug->ttable || plug->ttable_ok))
 | 
			
		||||
		return 0;
 | 
			
		||||
	if (clt->rate != slv->rate &&
 | 
			
		||||
	    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 */
 | 
			
		||||
	if (clt->format == slv->format &&
 | 
			
		||||
	    clt->rate == slv->rate &&
 | 
			
		||||
	    clt->channels == slv->channels)
 | 
			
		||||
	    clt->channels == slv->channels &&
 | 
			
		||||
	    (!plug->ttable || plug->ttable_ok))
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	if (snd_pcm_format_linear(slv->format)) {
 | 
			
		||||
		/* Conversion is done in another plugin */
 | 
			
		||||
		if (clt->rate != slv->rate ||
 | 
			
		||||
		    clt->channels != slv->channels)
 | 
			
		||||
		    clt->channels != slv->channels ||
 | 
			
		||||
		    (plug->ttable && !plug->ttable_ok))
 | 
			
		||||
			return 0;
 | 
			
		||||
		cfmt = 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)) {
 | 
			
		||||
			cfmt = clt->format;
 | 
			
		||||
			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;
 | 
			
		||||
			f = snd_pcm_lfloat_open;
 | 
			
		||||
		} else
 | 
			
		||||
| 
						 | 
				
			
			@ -641,11 +644,12 @@ static int snd_pcm_plug_insert_plugins(snd_pcm_t *pcm,
 | 
			
		|||
	};
 | 
			
		||||
	snd_pcm_plug_params_t p = *slave;
 | 
			
		||||
	unsigned int k = 0;
 | 
			
		||||
	plug->ttable_ok = plug->ttable_last = 0;
 | 
			
		||||
	plug->ttable_ok = 0;
 | 
			
		||||
	while (client->format != p.format ||
 | 
			
		||||
	       client->channels != p.channels ||
 | 
			
		||||
	       client->rate != p.rate ||
 | 
			
		||||
	       client->access != p.access) {
 | 
			
		||||
	       client->access != p.access ||
 | 
			
		||||
	       (plug->ttable && !plug->ttable_ok)) {
 | 
			
		||||
		snd_pcm_t *new;
 | 
			
		||||
		int err;
 | 
			
		||||
		if (k >= sizeof(funcs)/sizeof(*funcs))
 | 
			
		||||
| 
						 | 
				
			
			@ -660,24 +664,6 @@ static int snd_pcm_plug_insert_plugins(snd_pcm_t *pcm,
 | 
			
		|||
		}
 | 
			
		||||
		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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue