On Jul 13 2016 17:44, mengdong.lin@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