From: Mengdong Lin mengdong.lin@linux.intel.com
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
diff --git a/include/topology.h b/include/topology.h index ccd8401..b6a6f19 100644 --- a/include/topology.h +++ b/include/topology.h @@ -606,6 +606,11 @@ extern "C" { * "config3" * ] * } + * + * # Optional boolean flags + * symmetric_rates "true" + * symmetric_channels "true" + * symmetric_sample_bits "false" * } * </pre> * @@ -863,6 +868,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 */ }; diff --git a/src/topology/pcm.c b/src/topology/pcm.c index 6fdf047..bd70dc9 100644 --- a/src/topology/pcm.c +++ b/src/topology/pcm.c @@ -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]);