]> git.alsa-project.org Git - alsa-lib.git/commitdiff
topology: Parse flags for PCM
authorMengdong Lin <mengdong.lin@linux.intel.com>
Thu, 3 Nov 2016 23:07:06 +0000 (07:07 +0800)
committerTakashi Iwai <tiwai@suse.de>
Sat, 5 Nov 2016 15:41:53 +0000 (16:41 +0100)
Users can define flags by both text conf file and C API.
Add flags and flag_mask to C API template of PCM object.

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 e1c2d1127a0b0f2e82524809c546d1d94e0f0e80..8f3e1471811fd9d28eea4c1030b154ad72f02317 100644 (file)
@@ -607,6 +607,11 @@ extern "C" {
  *                     "config3"
  *             ]
  *     }
+ *
+ *     # Optional boolean flags
+ *     symmetric_rates                 "true"
+ *     symmetric_channels              "true"
+ *     symmetric_sample_bits           "false"
  * }
  * </pre>
  *
@@ -894,6 +899,8 @@ struct snd_tplg_pcm_template {
        unsigned int capture;   /*!< supports capture mode */
        unsigned int compress;  /*!< 1 = compressed; 0 = PCM */
        struct snd_tplg_stream_caps_template *caps[2]; /*!< playback & capture for DAI */
+       unsigned int flag_mask; /*!< bitmask of flags to configure */
+       unsigned int flags;     /*!< flag value SND_SOC_TPLG_LNK_FLGBIT_* */
        int num_streams;        /*!< number of supported configs */
        struct snd_tplg_stream_template stream[0]; /*!< supported configs */
 };
index 6fdf047032dbeffa664dd2d3f8e2a3696b5c96ab..bd70dc9596d4973c90044dcbfa736a7022035e62 100644 (file)
@@ -364,6 +364,24 @@ static int tplg_parse_fe_dai(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
        return 0;
 }
 
+/* parse a flag bit of the given mask */
+static int parse_flag(snd_config_t *n, unsigned int mask_in,
+                     unsigned int *mask, unsigned int *flags)
+{
+       const char *val = NULL;
+
+       if (snd_config_get_string(n, &val) < 0)
+               return -EINVAL;
+
+       *mask |= mask_in;
+       if (strcmp(val, "true") == 0)
+               *flags |= mask_in;
+       else
+               *flags &= ~mask_in;
+
+       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)
@@ -430,6 +448,34 @@ int tplg_parse_pcm(snd_tplg_t *tplg,
                                return err;
                        continue;
                }
+
+               /* flags */
+               if (strcmp(id, "symmetric_rates") == 0) {
+                       err = parse_flag(n,
+                               SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES,
+                               &pcm->flag_mask, &pcm->flags);
+                       if (err < 0)
+                               return err;
+                       continue;
+               }
+
+               if (strcmp(id, "symmetric_channels") == 0) {
+                       err = parse_flag(n,
+                               SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS,
+                               &pcm->flag_mask, &pcm->flags);
+                       if (err < 0)
+                               return err;
+                       continue;
+               }
+
+               if (strcmp(id, "symmetric_sample_bits") == 0) {
+                       err = parse_flag(n,
+                               SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS,
+                               &pcm->flag_mask, &pcm->flags);
+                       if (err < 0)
+                               return err;
+                       continue;
+               }
        }
 
        return 0;
@@ -610,6 +656,9 @@ int tplg_add_pcm_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
                        tplg_add_stream_caps(&pcm->caps[i], pcm_tpl->caps[i]);
        }
 
+       pcm->flag_mask = pcm_tpl->flag_mask;
+       pcm->flags = pcm_tpl->flags;
+
        pcm->num_streams = pcm_tpl->num_streams;
        for (i = 0; i < pcm_tpl->num_streams; i++)
                tplg_add_stream_object(&pcm->stream[i], &pcm_tpl->stream[i]);