From patchwork Thu Apr 13 06:52:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fuweix.tang@intel.com X-Patchwork-Id: 9678783 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B3B2C601C3 for ; Thu, 13 Apr 2017 07:01:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A5DB92861E for ; Thu, 13 Apr 2017 07:01:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9A8EF28631; Thu, 13 Apr 2017 07:01:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A595628632 for ; Thu, 13 Apr 2017 07:01:21 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id EC40A267036; Thu, 13 Apr 2017 08:53:04 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 637DB267036; Thu, 13 Apr 2017 08:53:04 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by alsa0.perex.cz (Postfix) with ESMTP id 5C486266AD7 for ; Thu, 13 Apr 2017 08:53:00 +0200 (CEST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Apr 2017 23:52:58 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.37,193,1488873600"; d="scan'208";a="73475698" Received: from tangfw-thinkpad-x230.sh.intel.com ([10.239.47.88]) by orsmga002.jf.intel.com with ESMTP; 12 Apr 2017 23:52:57 -0700 From: fuweix.tang@intel.com To: alsa-devel@alsa-project.org Date: Thu, 13 Apr 2017 14:52:44 +0800 Message-Id: X-Mailer: git-send-email 2.7.4 In-Reply-To: References: In-Reply-To: References: Cc: tiwai@suse.de, liam.r.girdwood@linux.intel.com, Fuwei Tang , mengdong.lin@intel.com Subject: [alsa-devel] [PATCH 1/4] topology: Insert new element based on its index value X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Fuwei Tang When creating a new element, insert it into the list in the ascending order of index value. Signed-off-by: Fuwei Tang Reviewed-by: Mengdong Lin --- src/topology/elem.c | 67 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/src/topology/elem.c b/src/topology/elem.c index efcf3e9..3ed655a 100644 --- a/src/topology/elem.c +++ b/src/topology/elem.c @@ -126,14 +126,33 @@ struct tplg_elem *tplg_elem_lookup(struct list_head *base, const char* id, return NULL; } +/* insert a new element into list in the ascending order of index value*/ +static void tplg_elem_insert(struct tplg_elem *elem_p, struct list_head *list) +{ + struct list_head *pos, *p = &(elem_p->list); + struct tplg_elem *elem; + + list_for_each(pos, list) { + elem = list_entry(pos, struct tplg_elem, list); + if (elem_p->index < elem->index) + break; + } + p->prev = pos->prev; + pos->prev->next = p; + pos->prev = p; + p->next = pos; +} + /* create a new common element and object */ struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg, snd_config_t *cfg, const char *name, enum snd_tplg_type type) { struct tplg_elem *elem; - const char *id; + const char *id, *val = NULL; int obj_size = 0; void *obj; + snd_config_iterator_t i, next; + snd_config_t *n; if (!cfg && !name) return NULL; @@ -147,75 +166,87 @@ struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg, snd_config_get_id(cfg, &id); elem_copy_text(elem->id, id, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); elem->id[SNDRV_CTL_ELEM_ID_NAME_MAXLEN - 1] = 0; + /* as we insert new elem based on the index value, move index + parsing here */ + snd_config_for_each(i, next, cfg) { + n = snd_config_iterator_entry(i); + if (snd_config_get_id(n, &id)) + continue; + if (strcmp(id, "index") == 0) { + if (snd_config_get_string(n, &val) < 0) + return NULL; + elem->index = atoi(val); + } + } } else if (name != NULL) elem_copy_text(elem->id, name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); switch (type) { case SND_TPLG_TYPE_DATA: - list_add_tail(&elem->list, &tplg->pdata_list); + tplg_elem_insert(elem, &tplg->pdata_list); break; case SND_TPLG_TYPE_MANIFEST: - list_add_tail(&elem->list, &tplg->manifest_list); + tplg_elem_insert(elem, &tplg->manifest_list); obj_size = sizeof(struct snd_soc_tplg_manifest); break; case SND_TPLG_TYPE_TEXT: - list_add_tail(&elem->list, &tplg->text_list); + tplg_elem_insert(elem, &tplg->text_list); obj_size = sizeof(struct tplg_texts); break; case SND_TPLG_TYPE_TLV: - list_add_tail(&elem->list, &tplg->tlv_list); + tplg_elem_insert(elem, &tplg->tlv_list); elem->size = sizeof(struct snd_soc_tplg_ctl_tlv); break; case SND_TPLG_TYPE_BYTES: - list_add_tail(&elem->list, &tplg->bytes_ext_list); + tplg_elem_insert(elem, &tplg->bytes_ext_list); obj_size = sizeof(struct snd_soc_tplg_bytes_control); break; case SND_TPLG_TYPE_ENUM: - list_add_tail(&elem->list, &tplg->enum_list); + tplg_elem_insert(elem, &tplg->enum_list); obj_size = sizeof(struct snd_soc_tplg_enum_control); break; case SND_TPLG_TYPE_MIXER: - list_add_tail(&elem->list, &tplg->mixer_list); + tplg_elem_insert(elem, &tplg->mixer_list); obj_size = sizeof(struct snd_soc_tplg_mixer_control); break; case SND_TPLG_TYPE_DAPM_WIDGET: - list_add_tail(&elem->list, &tplg->widget_list); + tplg_elem_insert(elem, &tplg->widget_list); obj_size = sizeof(struct snd_soc_tplg_dapm_widget); break; case SND_TPLG_TYPE_STREAM_CONFIG: - list_add_tail(&elem->list, &tplg->pcm_config_list); + tplg_elem_insert(elem, &tplg->pcm_config_list); obj_size = sizeof(struct snd_soc_tplg_stream); break; case SND_TPLG_TYPE_STREAM_CAPS: - list_add_tail(&elem->list, &tplg->pcm_caps_list); + tplg_elem_insert(elem, &tplg->pcm_caps_list); obj_size = sizeof(struct snd_soc_tplg_stream_caps); break; case SND_TPLG_TYPE_PCM: - list_add_tail(&elem->list, &tplg->pcm_list); + tplg_elem_insert(elem, &tplg->pcm_list); obj_size = sizeof(struct snd_soc_tplg_pcm); break; case SND_TPLG_TYPE_DAI: - list_add_tail(&elem->list, &tplg->dai_list); + tplg_elem_insert(elem, &tplg->dai_list); obj_size = sizeof(struct snd_soc_tplg_dai); break; case SND_TPLG_TYPE_BE: case SND_TPLG_TYPE_LINK: - list_add_tail(&elem->list, &tplg->be_list); + tplg_elem_insert(elem, &tplg->be_list); obj_size = sizeof(struct snd_soc_tplg_link_config); break; case SND_TPLG_TYPE_CC: - list_add_tail(&elem->list, &tplg->cc_list); + tplg_elem_insert(elem, &tplg->cc_list); obj_size = sizeof(struct snd_soc_tplg_link_config); break; case SND_TPLG_TYPE_TOKEN: - list_add_tail(&elem->list, &tplg->token_list); + tplg_elem_insert(elem, &tplg->token_list); break; case SND_TPLG_TYPE_TUPLE: - list_add_tail(&elem->list, &tplg->tuple_list); + tplg_elem_insert(elem, &tplg->tuple_list); elem->free = tplg_free_tuples; break; case SND_TPLG_TYPE_HW_CONFIG: - list_add_tail(&elem->list, &tplg->hw_cfg_list); + tplg_elem_insert(elem, &tplg->hw_cfg_list); obj_size = sizeof(struct snd_soc_tplg_hw_config); break; default: