mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-04 13:30:08 -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