On Fri, 04 Nov 2016 00:07:06 +0100, mengdong.lin@xxxxxxxxxxxxxxx wrote: > > From: Mengdong Lin <mengdong.lin@xxxxxxxxxxxxxxx> > > 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@xxxxxxxxxxxxxxx> > > 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; This can be simplified with snd_config_get_bool(). thanks, Takashi > + > + 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]); > -- > 2.7.4 > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel