[alsa-devel] [PATCH 1/5] topology: An element can refer to multipe data sections in text conf file
Takashi Sakamoto
o-takashi at sakamocchi.jp
Wed Jul 13 11:56:42 CEST 2016
On Jul 13 2016 17:44, mengdong.lin at linux.intel.com wrote:
> diff --git a/src/topology/data.c b/src/topology/data.c
> index 9f8d5d0..1db2e07 100644
> --- a/src/topology/data.c
> +++ b/src/topology/data.c
> @@ -20,6 +20,36 @@
> #include "tplg_local.h"
> #include <ctype.h>
>
> +/* Get private data buffer of an element */
> +struct snd_soc_tplg_private *get_priv_data(struct tplg_elem *elem)
> +{
> + struct snd_soc_tplg_private *priv = NULL;
> +
> + switch (elem->type) {
> + case SND_TPLG_TYPE_MIXER:
> + priv = &elem->mixer_ctrl->priv;
> + break;
> +
> + case SND_TPLG_TYPE_ENUM:
> + priv = &elem->enum_ctrl->priv;
> + break;
> +
> + case SND_TPLG_TYPE_BYTES:
> + priv = &elem->bytes_ext->priv;
> + break;
> +
> + case SND_TPLG_TYPE_DAPM_WIDGET:
> + priv = &elem->widget->priv;
> + break;
> +
> + default:
> + SNDERR("error: '%s': no support for private data for type %d\n",
> + elem->id, elem->type);
> + }
> +
> + return priv;
> +}
> +
> /* Get Private data from a file. */
> static int tplg_parse_data_file(snd_config_t *cfg, struct tplg_elem *elem)
> {
> @@ -614,6 +644,48 @@ static int parse_tuple_sets(snd_tplg_t *tplg, snd_config_t *cfg,
> return 0;
> }
>
> +/* Parse private data references for the element, either a single data section
> + * or a list of data sections.
> + */
> +int tplg_parse_data_refs(snd_tplg_t *tplg, snd_config_t *cfg,
> + struct tplg_elem *elem)
> +{
> + snd_config_type_t type;
> + snd_config_iterator_t i, next;
> + snd_config_t *n;
> + const char *id, *val = NULL;
> +
> + type = snd_config_get_type(cfg);
> +
> + /* refer to a single data section */
> + if (type == SND_CONFIG_TYPE_STRING) {
> + if (snd_config_get_string(cfg, &val) < 0)
> + return -EINVAL;
> +
> + tplg_dbg("\tdata: %s\n", val);
> + return tplg_ref_add(elem, SND_TPLG_TYPE_DATA, val);
> + }
> +
> + if (type != SND_CONFIG_TYPE_COMPOUND) {
> + SNDERR("error: compound type expected for %s", id);
In file included from ../../include/local.h:165:0,
from tplg_local.h:17,
from data.c:20:
data.c: In function ‘tplg_parse_data_refs’:
../../include/error.h:64:21: warning: ‘id’ may be used uninitialized in
this function [-Wmaybe-uninitialized]
#define SNDERR(...) snd_lib_error(__FILE__, __LINE__, __FUNCTION__, 0,
__VA_ARGS__) /**< Shows a sound error message. */
^
data.c:697:14: note: ‘id’ was declared here
const char *id, *val = NULL;
^
> + return -EINVAL;
> + }
> +
> + /* refer to a list of data sections */
> + snd_config_for_each(i, next, cfg) {
> + const char *val;
> +
> + n = snd_config_iterator_entry(i);
> + if (snd_config_get_string(n, &val) < 0)
> + continue;
> +
> + tplg_dbg("\tdata: %s\n", val);
> + tplg_ref_add(elem, SND_TPLG_TYPE_DATA, val);
> + }
> +
> + return 0;
> +}
> +
> /* Parse vendor tokens
> */
> int tplg_parse_tokens(snd_tplg_t *tplg, snd_config_t *cfg,
> @@ -817,11 +889,15 @@ int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
> return err;
> }
>
> -/* copy private data into the bytes extended control */
> +/* Merge data from a referenced data element to the parent element's
> + * private data buffer.
> + * An element can refer to multiple data sections. Data of these sections
> + * will be merged in the their reference order.
> + */
> int tplg_copy_data(struct tplg_elem *elem, struct tplg_elem *ref)
> {
> - struct snd_soc_tplg_private *priv;
> - int priv_data_size;
> + struct snd_soc_tplg_private *priv, *old_priv;
> + int priv_data_size, old_priv_data_size;
> void *obj;
>
> if (!ref)
> @@ -831,6 +907,11 @@ int tplg_copy_data(struct tplg_elem *elem, struct tplg_elem *ref)
> if (!ref->data || !ref->data->size) /* overlook empty private data */
> return 0;
data.c: In function ‘tplg_copy_data’:
data.c:1051:15: warning: ‘ref_elem’ may be used uninitialized in this
function [-Wmaybe-uninitialized]
if (!ref_elem->data || !ref_elem->data->size)
^
Regards
Takashi Sakamoto
More information about the Alsa-devel
mailing list