Message ID | 34d6902914df281d29cb4f01ccb5e8ffe1b78d8a.1478212626.git.mengdong.lin@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, 04 Nov 2016 00:07:06 +0100, mengdong.lin@linux.intel.com wrote: > > 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; 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 >
> -----Original Message----- > From: Takashi Iwai [mailto:tiwai@suse.de] > Sent: Saturday, November 5, 2016 11:46 PM > > > > +/* 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(). Okay, I'll fix it in my later patches. Thank you so much for the review! There will be ~15 patches left for topology user space. I'll split into 2 series. Regards Mengdong > > > 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 > >
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]);