Blame src/topology/text.c

Packit Service db8eaa
/*
Packit Service db8eaa
  Copyright(c) 2014-2015 Intel Corporation
Packit Service db8eaa
  All rights reserved.
Packit Service db8eaa
Packit Service db8eaa
  This library is free software; you can redistribute it and/or modify
Packit Service db8eaa
  it under the terms of the GNU Lesser General Public License as
Packit Service db8eaa
  published by the Free Software Foundation; either version 2.1 of
Packit Service db8eaa
  the License, or (at your option) any later version.
Packit Service db8eaa
Packit Service db8eaa
  This program is distributed in the hope that it will be useful,
Packit Service db8eaa
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service db8eaa
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service db8eaa
  GNU Lesser General Public License for more details.
Packit Service db8eaa
Packit Service db8eaa
  Authors: Mengdong Lin <mengdong.lin@intel.com>
Packit Service db8eaa
           Yao Jin <yao.jin@intel.com>
Packit Service db8eaa
           Liam Girdwood <liam.r.girdwood@linux.intel.com>
Packit Service db8eaa
Packit Service db8eaa
*/
Packit Service db8eaa
Packit Service db8eaa
#include "list.h"
Packit Service db8eaa
#include "tplg_local.h"
Packit Service db8eaa
Packit Service db8eaa
#define TEXT_SIZE_MAX \
Packit Service db8eaa
	(SND_SOC_TPLG_NUM_TEXTS * SNDRV_CTL_ELEM_ID_NAME_MAXLEN)
Packit Service db8eaa
Packit Service db8eaa
static int parse_text_values(snd_config_t *cfg, struct tplg_elem *elem)
Packit Service db8eaa
{
Packit Service db8eaa
	struct tplg_texts *texts = elem->texts;
Packit Service db8eaa
	snd_config_iterator_t i, next;
Packit Service db8eaa
	snd_config_t *n;
Packit Service db8eaa
	const char *value = NULL;
Packit Service db8eaa
	int j = 0;
Packit Service db8eaa
Packit Service db8eaa
	tplg_dbg(" Text Values: %s", elem->id);
Packit Service db8eaa
Packit Service db8eaa
	snd_config_for_each(i, next, cfg) {
Packit Service db8eaa
		n = snd_config_iterator_entry(i);
Packit Service db8eaa
Packit Service db8eaa
		if (j == SND_SOC_TPLG_NUM_TEXTS) {
Packit Service db8eaa
			tplg_dbg("text string number exceeds %d", j);
Packit Service db8eaa
			return -ENOMEM;
Packit Service db8eaa
		}
Packit Service db8eaa
Packit Service db8eaa
		/* get value */
Packit Service db8eaa
		if (snd_config_get_string(n, &value) < 0)
Packit Service db8eaa
			continue;
Packit Service db8eaa
Packit Service db8eaa
		snd_strlcpy(&texts->items[j][0], value,
Packit Service db8eaa
			SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
Packit Service db8eaa
		tplg_dbg("\t%s", &texts->items[j][0]);
Packit Service db8eaa
Packit Service db8eaa
		j++;
Packit Service db8eaa
	}
Packit Service db8eaa
Packit Service db8eaa
	texts->num_items = j;
Packit Service db8eaa
	return 0;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/* Parse Text data */
Packit Service db8eaa
int tplg_parse_text(snd_tplg_t *tplg, snd_config_t *cfg,
Packit Service db8eaa
		    void *private ATTRIBUTE_UNUSED)
Packit Service db8eaa
{
Packit Service db8eaa
	snd_config_iterator_t i, next;
Packit Service db8eaa
	snd_config_t *n;
Packit Service db8eaa
	const char *id;
Packit Service db8eaa
	int err = 0;
Packit Service db8eaa
	struct tplg_elem *elem;
Packit Service db8eaa
Packit Service db8eaa
	elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_TEXT);
Packit Service db8eaa
	if (!elem)
Packit Service db8eaa
		return -ENOMEM;
Packit Service db8eaa
Packit Service db8eaa
	snd_config_for_each(i, next, cfg) {
Packit Service db8eaa
Packit Service db8eaa
		n = snd_config_iterator_entry(i);
Packit Service db8eaa
		if (snd_config_get_id(n, &id) < 0)
Packit Service db8eaa
			continue;
Packit Service db8eaa
Packit Service db8eaa
		if (strcmp(id, "values") == 0) {
Packit Service db8eaa
			err = parse_text_values(n, elem);
Packit Service db8eaa
			if (err < 0) {
Packit Service db8eaa
				SNDERR("error: failed to parse text values");
Packit Service db8eaa
				return err;
Packit Service db8eaa
			}
Packit Service db8eaa
			continue;
Packit Service db8eaa
		}
Packit Service db8eaa
	}
Packit Service db8eaa
Packit Service db8eaa
	return err;
Packit Service db8eaa
}
Packit Service db8eaa
Packit Service db8eaa
/* save text data */
Packit Service db8eaa
int tplg_save_text(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
Packit Service db8eaa
		   struct tplg_elem *elem,
Packit Service db8eaa
		   struct tplg_buf *dst, const char *pfx)
Packit Service db8eaa
{
Packit Service db8eaa
	struct tplg_texts *texts = elem->texts;
Packit Service db8eaa
	unsigned int i;
Packit Service db8eaa
	int err;
Packit Service db8eaa
Packit Service db8eaa
	if (!texts || texts->num_items == 0)
Packit Service db8eaa
		return 0;
Packit Service db8eaa
	err = tplg_save_printf(dst, pfx, "'%s'.values [\n", elem->id);
Packit Service db8eaa
	for (i = 0; err >= 0 && i < texts->num_items; i++)
Packit Service db8eaa
		err = tplg_save_printf(dst, pfx, "\t'%s'\n", texts->items[i]);
Packit Service db8eaa
	if (err >= 0)
Packit Service db8eaa
		err = tplg_save_printf(dst, pfx, "]\n");
Packit Service db8eaa
	return err;
Packit Service db8eaa
}