]> git.alsa-project.org Git - alsa-lib.git/commitdiff
topology: Parse front-end DAI name and ID for the PCM
authorMengdong Lin <mengdong.lin@linux.intel.com>
Fri, 29 Apr 2016 03:03:37 +0000 (11:03 +0800)
committerTakashi Iwai <tiwai@suse.de>
Mon, 9 May 2016 08:30:40 +0000 (10:30 +0200)
These two fields are necessary to create the front-end DAIs
in kernel but the support is missing in text conf previously.

Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/topology.h
src/topology/pcm.c

index b47f422ddc90dae60cb5845ffce787666004053a..9d57ce3b7b68aca12ba0827f053b0284fecfd5a2 100644 (file)
@@ -533,6 +533,10 @@ extern "C" {
  *
  *     id "0"                          # used for binding to the PCM
  *
+ *     dai."name of front-end DAI" {
+ *             id "0"          # used for binding to the front-end DAI
+ *     }
+ *
  *     pcm."playback" {
  *             capabilities "capabilities1"    # capabilities for playback
  *
index 16618216eb30a304809600f2a311d1b0c4d69ffd..efee58b8f4c56565a58cb028d7a5ca22d468c7d9 100644 (file)
@@ -320,6 +320,51 @@ static int tplg_parse_streams(snd_tplg_t *tplg, snd_config_t *cfg,
        return 0;
 }
 
+/* Parse name and id of a front-end DAI (ie. cpu dai of a FE DAI link) */
+static int tplg_parse_fe_dai(snd_tplg_t *tplg, snd_config_t *cfg,
+       void *private)
+{
+       struct tplg_elem *elem = private;
+       struct snd_soc_tplg_pcm *pcm = elem->pcm;
+       snd_config_iterator_t i, next;
+       snd_config_t *n;
+       const char *id, *value = NULL;
+       unsigned long int id_val;
+       int err;
+
+       snd_config_get_id(cfg, &id);
+       tplg_dbg("\t\tFE DAI %s:\n", id);
+       elem_copy_text(pcm->dai_name, id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
+
+       snd_config_for_each(i, next, cfg) {
+
+               n = snd_config_iterator_entry(i);
+
+               /* get id */
+               if (snd_config_get_id(n, &id) < 0)
+                       continue;
+
+               if (strcmp(id, "id") == 0) {
+                       if (snd_config_get_string(n, &value) < 0)
+                               continue;
+                       errno = 0;
+                       /* no support for negative value */
+                       id_val = strtoul(value, NULL, 0);
+                       if ((errno == ERANGE && id_val == ULONG_MAX)
+                               || (errno != 0 && id_val == 0)
+                               || id_val > UINT_MAX) {
+                               SNDERR("error: invalid fe dai ID\n");
+                               return -EINVAL;
+                       }
+
+                       pcm->dai_id = (int) id_val;
+                       tplg_dbg("\t\t\tindex: %d\n", pcm->dai_id);
+               }
+       }
+
+       return 0;
+}
+
 /* Parse pcm (for front end DAI & DAI link) */
 int tplg_parse_pcm(snd_tplg_t *tplg,
        snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
@@ -378,6 +423,14 @@ int tplg_parse_pcm(snd_tplg_t *tplg,
                                return err;
                        continue;
                }
+
+               if (strcmp(id, "dai") == 0) {
+                       err = tplg_parse_compound(tplg, n,
+                               tplg_parse_fe_dai, elem);
+                       if (err < 0)
+                               return err;
+                       continue;
+               }
        }
 
        return 0;