On Fri, 07 Dec 2018 17:12:13 +0100, twischer@de.adit-jv.com wrote:
From: Timo Wischer twischer@de.adit-jv.com
if conversion is not supported by the implemented extplug.
Currently only the parameters for client and slave PCM can be limited separately. But there is no dependency between this parameters. This patch allows the user to link both parameter sets also if snd_pcm_extplug_set_param*() was used to limit the capabilities of the plugin.
Signed-off-by: Timo Wischer twischer@de.adit-jv.com
That's somewhat similar I had in my mind, but I'd rather leave the current API as is.
Basically what you need is to tell which parameter to be linked, so let's add just a simpler API to set/clear the link flag that can be used on top of the existing API, something like below.
The concept of link is a bit difficult for readers, but it should be understandable once when the actual usage is found.
thanks,
Takashi
--- diff --git a/include/pcm_extplug.h b/include/pcm_extplug.h --- a/include/pcm_extplug.h +++ b/include/pcm_extplug.h @@ -184,6 +184,7 @@ int snd_pcm_extplug_set_param_list(snd_pcm_extplug_t *extplug, int type, unsigne int snd_pcm_extplug_set_param_minmax(snd_pcm_extplug_t *extplug, int type, unsigned int min, unsigned int max); int snd_pcm_extplug_set_slave_param_list(snd_pcm_extplug_t *extplug, int type, unsigned int num_list, const unsigned int *list); int snd_pcm_extplug_set_slave_param_minmax(snd_pcm_extplug_t *extplug, int type, unsigned int min, unsigned int max); +int snd_pcm_extplug_set_param_link(snd_pcm_extplug_t *extplug, int type, int keep_link);
/** * set the parameter constraint with a single value diff --git a/src/pcm/pcm_ext_parm.h b/src/pcm/pcm_ext_parm.h --- a/src/pcm/pcm_ext_parm.h +++ b/src/pcm/pcm_ext_parm.h @@ -5,6 +5,7 @@ struct snd_ext_parm { unsigned int *list; unsigned int active: 1; unsigned int integer: 1; + unsigned int keep_link: 1; };
static inline snd_mask_t *hw_param_mask(snd_pcm_hw_params_t *params, diff --git a/src/pcm/pcm_extplug.c b/src/pcm/pcm_extplug.c --- a/src/pcm/pcm_extplug.c +++ b/src/pcm/pcm_extplug.c @@ -249,7 +249,7 @@ static unsigned int get_links(struct snd_ext_parm *params) SND_PCM_HW_PARBIT_TICK_TIME);
for (i = 0; i < SND_PCM_EXTPLUG_HW_PARAMS; i++) { - if (params[i].active) + if (params[i].active && !params[i].keep_link) links &= ~excl_parbits[i]; } return links; @@ -849,3 +849,16 @@ int snd_pcm_extplug_set_param_minmax(snd_pcm_extplug_t *extplug, int type, unsig return snd_ext_parm_set_minmax(&ext->params[type], min, max); }
+/** + * DOCUMENTATION HERE PLEASE + */ +int snd_pcm_extplug_set_param_link(snd_pcm_extplug_t *extplug, int type, int keep_link) +{ + extplug_priv_t *ext = extplug->pcm->private_data; + if (type < 0 || type >= SND_PCM_EXTPLUG_HW_PARAMS) { + SNDERR("EXTPLUG: invalid parameter type %d", type); + return -EINVAL; + } + ext->params[type].keep_link = keep_link; + return 0; +}