1d5ac70f0Sopenharmony_ci/* 2d5ac70f0Sopenharmony_ci Copyright(c) 2014-2015 Intel Corporation 3d5ac70f0Sopenharmony_ci All rights reserved. 4d5ac70f0Sopenharmony_ci 5d5ac70f0Sopenharmony_ci This library is free software; you can redistribute it and/or modify 6d5ac70f0Sopenharmony_ci it under the terms of the GNU Lesser General Public License as 7d5ac70f0Sopenharmony_ci published by the Free Software Foundation; either version 2.1 of 8d5ac70f0Sopenharmony_ci the License, or (at your option) any later version. 9d5ac70f0Sopenharmony_ci 10d5ac70f0Sopenharmony_ci This program is distributed in the hope that it will be useful, 11d5ac70f0Sopenharmony_ci but WITHOUT ANY WARRANTY; without even the implied warranty of 12d5ac70f0Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13d5ac70f0Sopenharmony_ci GNU Lesser General Public License for more details. 14d5ac70f0Sopenharmony_ci 15d5ac70f0Sopenharmony_ci Authors: Mengdong Lin <mengdong.lin@intel.com> 16d5ac70f0Sopenharmony_ci Yao Jin <yao.jin@intel.com> 17d5ac70f0Sopenharmony_ci Liam Girdwood <liam.r.girdwood@linux.intel.com> 18d5ac70f0Sopenharmony_ci 19d5ac70f0Sopenharmony_ci*/ 20d5ac70f0Sopenharmony_ci 21d5ac70f0Sopenharmony_ci#include "tplg_local.h" 22d5ac70f0Sopenharmony_ci 23d5ac70f0Sopenharmony_ci#define TEXT_SIZE_MAX \ 24d5ac70f0Sopenharmony_ci (SND_SOC_TPLG_NUM_TEXTS * SNDRV_CTL_ELEM_ID_NAME_MAXLEN) 25d5ac70f0Sopenharmony_ci 26d5ac70f0Sopenharmony_cistatic int parse_text_values(snd_config_t *cfg, struct tplg_elem *elem) 27d5ac70f0Sopenharmony_ci{ 28d5ac70f0Sopenharmony_ci struct tplg_texts *texts = elem->texts; 29d5ac70f0Sopenharmony_ci snd_config_iterator_t i, next; 30d5ac70f0Sopenharmony_ci snd_config_t *n; 31d5ac70f0Sopenharmony_ci const char *value = NULL; 32d5ac70f0Sopenharmony_ci int j = 0; 33d5ac70f0Sopenharmony_ci 34d5ac70f0Sopenharmony_ci tplg_dbg(" Text Values: %s", elem->id); 35d5ac70f0Sopenharmony_ci 36d5ac70f0Sopenharmony_ci snd_config_for_each(i, next, cfg) { 37d5ac70f0Sopenharmony_ci n = snd_config_iterator_entry(i); 38d5ac70f0Sopenharmony_ci 39d5ac70f0Sopenharmony_ci if (j == SND_SOC_TPLG_NUM_TEXTS) { 40d5ac70f0Sopenharmony_ci tplg_dbg("text string number exceeds %d", j); 41d5ac70f0Sopenharmony_ci return -ENOMEM; 42d5ac70f0Sopenharmony_ci } 43d5ac70f0Sopenharmony_ci 44d5ac70f0Sopenharmony_ci /* get value */ 45d5ac70f0Sopenharmony_ci if (snd_config_get_string(n, &value) < 0) 46d5ac70f0Sopenharmony_ci continue; 47d5ac70f0Sopenharmony_ci 48d5ac70f0Sopenharmony_ci snd_strlcpy(&texts->items[j][0], value, 49d5ac70f0Sopenharmony_ci SNDRV_CTL_ELEM_ID_NAME_MAXLEN); 50d5ac70f0Sopenharmony_ci tplg_dbg("\t%s", &texts->items[j][0]); 51d5ac70f0Sopenharmony_ci 52d5ac70f0Sopenharmony_ci j++; 53d5ac70f0Sopenharmony_ci } 54d5ac70f0Sopenharmony_ci 55d5ac70f0Sopenharmony_ci texts->num_items = j; 56d5ac70f0Sopenharmony_ci return 0; 57d5ac70f0Sopenharmony_ci} 58d5ac70f0Sopenharmony_ci 59d5ac70f0Sopenharmony_ci/* Parse Text data */ 60d5ac70f0Sopenharmony_ciint tplg_parse_text(snd_tplg_t *tplg, snd_config_t *cfg, 61d5ac70f0Sopenharmony_ci void *private ATTRIBUTE_UNUSED) 62d5ac70f0Sopenharmony_ci{ 63d5ac70f0Sopenharmony_ci snd_config_iterator_t i, next; 64d5ac70f0Sopenharmony_ci snd_config_t *n; 65d5ac70f0Sopenharmony_ci const char *id; 66d5ac70f0Sopenharmony_ci int err = 0; 67d5ac70f0Sopenharmony_ci struct tplg_elem *elem; 68d5ac70f0Sopenharmony_ci 69d5ac70f0Sopenharmony_ci elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_TEXT); 70d5ac70f0Sopenharmony_ci if (!elem) 71d5ac70f0Sopenharmony_ci return -ENOMEM; 72d5ac70f0Sopenharmony_ci 73d5ac70f0Sopenharmony_ci snd_config_for_each(i, next, cfg) { 74d5ac70f0Sopenharmony_ci 75d5ac70f0Sopenharmony_ci n = snd_config_iterator_entry(i); 76d5ac70f0Sopenharmony_ci if (snd_config_get_id(n, &id) < 0) 77d5ac70f0Sopenharmony_ci continue; 78d5ac70f0Sopenharmony_ci 79d5ac70f0Sopenharmony_ci if (strcmp(id, "values") == 0) { 80d5ac70f0Sopenharmony_ci err = parse_text_values(n, elem); 81d5ac70f0Sopenharmony_ci if (err < 0) { 82d5ac70f0Sopenharmony_ci SNDERR("error: failed to parse text values"); 83d5ac70f0Sopenharmony_ci return err; 84d5ac70f0Sopenharmony_ci } 85d5ac70f0Sopenharmony_ci continue; 86d5ac70f0Sopenharmony_ci } 87d5ac70f0Sopenharmony_ci } 88d5ac70f0Sopenharmony_ci 89d5ac70f0Sopenharmony_ci return err; 90d5ac70f0Sopenharmony_ci} 91d5ac70f0Sopenharmony_ci 92d5ac70f0Sopenharmony_ci/* save text data */ 93d5ac70f0Sopenharmony_ciint tplg_save_text(snd_tplg_t *tplg ATTRIBUTE_UNUSED, 94d5ac70f0Sopenharmony_ci struct tplg_elem *elem, 95d5ac70f0Sopenharmony_ci struct tplg_buf *dst, const char *pfx) 96d5ac70f0Sopenharmony_ci{ 97d5ac70f0Sopenharmony_ci struct tplg_texts *texts = elem->texts; 98d5ac70f0Sopenharmony_ci unsigned int i; 99d5ac70f0Sopenharmony_ci int err; 100d5ac70f0Sopenharmony_ci 101d5ac70f0Sopenharmony_ci if (!texts || texts->num_items == 0) 102d5ac70f0Sopenharmony_ci return 0; 103d5ac70f0Sopenharmony_ci err = tplg_save_printf(dst, pfx, "'%s'.values [\n", elem->id); 104d5ac70f0Sopenharmony_ci for (i = 0; err >= 0 && i < texts->num_items; i++) 105d5ac70f0Sopenharmony_ci err = tplg_save_printf(dst, pfx, "\t'%s'\n", texts->items[i]); 106d5ac70f0Sopenharmony_ci if (err >= 0) 107d5ac70f0Sopenharmony_ci err = tplg_save_printf(dst, pfx, "]\n"); 108d5ac70f0Sopenharmony_ci return err; 109d5ac70f0Sopenharmony_ci} 110