[alsa-devel] [PATCH v8] ASoC: dapm: add code to configure dai link parameters
Charles Keepax
ckeepax at opensource.wolfsonmicro.com
Fri Jan 16 15:46:35 CET 2015
On Thu, Jan 15, 2015 at 02:07:11PM +0000, Nikesh Oswal wrote:
> dai-link params for codec-codec links were fixed. The fixed
> link between codec and another chip which may be another codec,
> baseband, bluetooth codec etc may require run time configuaration
> changes. This change provides an optional alsa control to select
> one of the params from a list of params.
>
> Signed-off-by: Nikesh Oswal <nikesh at opensource.wolfsonmicro.com>
> ---
> include/sound/soc-dapm.h | 3 +
> include/sound/soc.h | 1 +
> sound/soc/soc-core.c | 6 +-
> sound/soc/soc-dapm.c | 155 ++++++++++++++++++++++++++++++++++++++++++++--
> 4 files changed, 157 insertions(+), 8 deletions(-)
>
> diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h
> index 5c0a798..a2098e4 100644
> @@ -3299,14 +3363,52 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
> struct snd_soc_dapm_widget *w;
> size_t len;
> char *link_name;
> - int ret;
> + int ret, count;
> + unsigned long private_value;
> + const char **w_param_text;
> + struct soc_enum w_param_enum[] = {
> + SOC_ENUM_SINGLE(0, 0, 0, NULL),
> + };
> + struct snd_kcontrol_new kcontrol_dai_link[] = {
> + SOC_ENUM_EXT(NULL, w_param_enum[0],
> + snd_soc_dapm_dai_link_get,
> + snd_soc_dapm_dai_link_put),
> + };
> + const struct snd_soc_pcm_stream *config = params;
> +
> + w_param_text = devm_kcalloc(card->dev, num_params,
> + sizeof(char *), GFP_KERNEL);
> + if (!w_param_text)
> + return -ENOMEM;
>
> len = strlen(source->name) + strlen(sink->name) + 2;
> link_name = devm_kzalloc(card->dev, len, GFP_KERNEL);
> - if (!link_name)
> - return -ENOMEM;
> + if (!link_name) {
> + ret = -ENOMEM;
> + goto outfree_w_param;
> + }
> snprintf(link_name, len, "%s-%s", source->name, sink->name);
>
> + for (count = 0 ; count < num_params; count++) {
> + if (!config->stream_name) {
> + dev_warn(card->dapm.dev,
> + "ASoC: anonymous config %d for dai link %s\n",
> + count, link_name);
The ALSA core doesn't like one of the string in the enum text
links being a NULL pointer so you will want to add some sort of
default text or something in this case.
> + } else {
> + w_param_text[count] = devm_kmemdup(card->dev,
> + config->stream_name,
> + strlen(config->stream_name) + 1,
> + GFP_KERNEL);
> + if (!w_param_text[count]) {
> + ret = -ENOMEM;
> + goto outfree_link_name;
> + }
> + }
> + config++;
> + }
> + w_param_enum[0].items = num_params;
> + w_param_enum[0].texts = w_param_text;
> +
> memset(&template, 0, sizeof(template));
> template.reg = SND_SOC_NOPM;
> template.id = snd_soc_dapm_dai_link;
Thanks,
Charles
More information about the Alsa-devel
mailing list