From patchwork Tue Feb 21 15:04:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Young X-Patchwork-Id: 9584817 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 6C736602A7 for ; Tue, 21 Feb 2017 15:20:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5411E2885F for ; Tue, 21 Feb 2017 15:20:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 474632886E; Tue, 21 Feb 2017 15:20:43 +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.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_NONE,T_DKIM_INVALID autolearn=no 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 A5D2B2885F for ; Tue, 21 Feb 2017 15:20:41 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id D6ED5266CF3; Tue, 21 Feb 2017 16:05:00 +0100 (CET) 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 5108E266CF6; Tue, 21 Feb 2017 16:04:59 +0100 (CET) Received: from mail-wr0-f176.google.com (mail-wr0-f176.google.com [209.85.128.176]) by alsa0.perex.cz (Postfix) with ESMTP id 054DD2666EA for ; Tue, 21 Feb 2017 16:04:56 +0100 (CET) Received: by mail-wr0-f176.google.com with SMTP id 89so79300735wrr.3 for ; Tue, 21 Feb 2017 07:04:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to; bh=SyVLRR7qJB/rjBS1H3VeTe71gQ3CKU3Vm18LpY8jx6g=; b=HToxpXEk2iKuqHbMne+lp4X+Cc0oHXfE0fTqbP9RBoZ0CB41NzjY7nQhrIbOM+XLfJ Gwd0+QY0DPZbfA96qvusx/eXUFjva87yJZT7S5oI+3zXfGZd7hDdA2mapkCWYIzvHh+g kkAyaNml8KPaj4FEu2mIAEAtTfQAumSzt6zSaSj47hDlPCbbR9YA2Cv8onUUfMt7Zbyl X66J8rt71LQJq6+3KfQG6PZkBDKogWpbOsrSck0SU6f52tVXVldjH6avH97Bbu0RdiBb vfiPAMEmOW+5DueSSAO1DnVLQUhE46pSLrwXtmr/bS/gb3Ardd1BTCZNFY0Ecalyn59p rIgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:references:cc:from:message-id :date:user-agent:mime-version:in-reply-to; bh=SyVLRR7qJB/rjBS1H3VeTe71gQ3CKU3Vm18LpY8jx6g=; b=js6odWe+AICuyfzlBfxakkh2xh4lqGpMI/5kowYA+GyMJOV/hbF29hCgSZ7oUbRJZx NVW1xlSdE/9q9sMxDLmaMnb5qUHckJ7k5UFyfAObNtdcsF7Ap7DVOS2uBlGmDrp6X7EA 62O4DeXDKRFJnCp+8NY6PLWAyIwV3b3qU0ppvalSa3NQQg/oVpso0HX820c5VJtD5UyA Uqb0pEXjwHAPMAhBeMXRILihfFTdybKdHYirQNFUaI3RmtG1/B2EiDfmn4XCBio8THUV m4Bq6LMqNliHtNGr/UcoXPol1JC19YxX7xn7qJSIjRnfJ91ymNiJ7UEQrRv3fM0A0KfG zMCA== X-Gm-Message-State: AMke39k+VWFLDrOfOD2Q21/gN3uy/7SJa/rvepc7pUOGHULZ8z1977n4UW1uMRGsB1l78A== X-Received: by 10.223.135.244 with SMTP id c49mr19758466wrc.135.1487689496134; Tue, 21 Feb 2017 07:04:56 -0800 (PST) Received: from [192.168.11.11] (225.55.208.46.dyn.plus.net. [46.208.55.225]) by smtp.googlemail.com with ESMTPSA id i189sm17946895wmg.7.2017.02.21.07.04.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 21 Feb 2017 07:04:54 -0800 (PST) To: Takashi Iwai References: <6d7c74b7-da90-5ae9-c355-c6884b2edf09@gmail.com> <7b3c655f-4b7a-e10a-90ff-5cb480332f3f@IEE.org> <3b8cd9c9-8248-b22a-ebb8-dce7d901951d@IEE.org> From: Alan Young Message-ID: <2cb132c7-638b-6d93-621d-3460654660b8@IEE.org> Date: Tue, 21 Feb 2017 15:04:54 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: alsa-devel@alsa-project.org Subject: Re: [alsa-devel] [PATCH] [updated] pcm: rate: Add capability to pass configuration node to plugins 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP Update patch. On 21/02/17 14:43, Takashi Iwai wrote: > > The error handling is missing when no name is given. > You should handle the error explicitly instead of the success. > > if (!type) { > SNDERR("No name is given for rate converter"); > ..... > return -EINVAL; > } > > err = rate_open_func(....); > > > Takashi From 6eb392e6e2b5749bd8f2c67907b2a08da8cfe863 Mon Sep 17 00:00:00 2001 From: Alan Young Date: Thu, 7 Apr 2016 09:15:04 +0100 Subject: [PATCH] pcm: rate: Add capability to pass configuration node to plugins If a rate plugin uses a node (compound) instead of a plain string for its "converter", and that compound is not a simple string array, then the compound will be passed as an additional parameter to the new plugin open() function (SND_PCM_RATE_PLUGIN_CONF_ENTRY(XXX)). The previous open() function (SND_PCM_RATE_PLUGIN_ENTRY(XXX)) will be called if the CONF version is not found. It is up to the plugin to determine whether the presence of the conf parameter is mandatory. Signed-off-by: Alan Young --- include/pcm_rate.h | 5 +++- src/pcm/pcm_rate.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 81 insertions(+), 10 deletions(-) diff --git a/include/pcm_rate.h b/include/pcm_rate.h index 4d70df2..da278ac 100644 --- a/include/pcm_rate.h +++ b/include/pcm_rate.h @@ -120,11 +120,14 @@ typedef struct snd_pcm_rate_ops { typedef int (*snd_pcm_rate_open_func_t)(unsigned int version, void **objp, snd_pcm_rate_ops_t *opsp); +typedef int (*snd_pcm_rate_open_conf_func_t)(unsigned int version, void **objp, + snd_pcm_rate_ops_t *opsp, const snd_config_t *conf); + /** * Define the object entry for external PCM rate-converter plugins */ #define SND_PCM_RATE_PLUGIN_ENTRY(name) _snd_pcm_rate_##name##_open - +#define SND_PCM_RATE_PLUGIN_CONF_ENTRY(name) _snd_pcm_rate_##name##_open_conf #ifndef DOC_HIDDEN /* old rate_ops for protocol version 0x010001 */ diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c index cbb7618..2021247 100644 --- a/src/pcm/pcm_rate.c +++ b/src/pcm/pcm_rate.c @@ -1258,26 +1258,48 @@ static const char *const default_rate_plugins[] = { "speexrate", "linear", NULL }; -static int rate_open_func(snd_pcm_rate_t *rate, const char *type, int verbose) +static int rate_open_func(snd_pcm_rate_t *rate, const char *type, const snd_config_t *converter_conf, int verbose) { - char open_name[64], lib_name[128], *lib = NULL; + char open_name[64], open_conf_name[64], lib_name[128], *lib = NULL; snd_pcm_rate_open_func_t open_func; + snd_pcm_rate_open_conf_func_t open_conf_func; int err; snprintf(open_name, sizeof(open_name), "_snd_pcm_rate_%s_open", type); + snprintf(open_conf_name, sizeof(open_conf_name), "_snd_pcm_rate_%s_open_conf", type); if (!is_builtin_plugin(type)) { snprintf(lib_name, sizeof(lib_name), "%s/libasound_module_rate_%s.so", ALSA_PLUGIN_DIR, type); lib = lib_name; } + + rate->rate_min = SND_PCM_PLUGIN_RATE_MIN; + rate->rate_max = SND_PCM_PLUGIN_RATE_MAX; + rate->plugin_version = SND_PCM_RATE_PLUGIN_VERSION; + + open_conf_func = snd_dlobj_cache_get(lib, open_conf_name, NULL, verbose && converter_conf != NULL); + if (open_conf_func) { + err = open_conf_func(SND_PCM_RATE_PLUGIN_VERSION, + &rate->obj, &rate->ops, converter_conf); + if (!err) { + rate->plugin_version = rate->ops.version; + if (rate->ops.get_supported_rates) + rate->ops.get_supported_rates(rate->obj, + &rate->rate_min, + &rate->rate_max); + rate->open_func = open_conf_func; + return 0; + } else { + snd_dlobj_cache_put(open_conf_func); + return err; + } + } + open_func = snd_dlobj_cache_get(lib, open_name, NULL, verbose); if (!open_func) return -ENOENT; rate->open_func = open_func; - rate->rate_min = SND_PCM_PLUGIN_RATE_MIN; - rate->rate_max = SND_PCM_PLUGIN_RATE_MAX; - rate->plugin_version = SND_PCM_RATE_PLUGIN_VERSION; err = open_func(SND_PCM_RATE_PLUGIN_VERSION, &rate->obj, &rate->ops); if (!err) { @@ -1301,6 +1323,30 @@ static int rate_open_func(snd_pcm_rate_t *rate, const char *type, int verbose) } #endif +/* + * If the conf is an array of alternatives then the id of + * the first element will be "0" (or maybe NULL). Otherwise assume it is + * a structure. + */ +static int is_string_array(const snd_config_t *conf) +{ + snd_config_iterator_t i; + + if (snd_config_get_type(conf) != SND_CONFIG_TYPE_COMPOUND) + return 0; + + i = snd_config_iterator_first(conf); + if (i && i != snd_config_iterator_end(conf)) { + snd_config_t *n = snd_config_iterator_entry(i); + const char *id; + snd_config_get_id(n, &id); + if (id && strcmp(id, "0") != 0) + return 0; + } + + return 1; +} + /** * \brief Creates a new rate PCM * \param pcmp Returns created PCM handle @@ -1353,24 +1399,41 @@ int snd_pcm_rate_open(snd_pcm_t **pcmp, const char *name, if (!converter) { const char *const *types; for (types = default_rate_plugins; *types; types++) { - err = rate_open_func(rate, *types, 0); + err = rate_open_func(rate, *types, NULL, 0); if (!err) { type = *types; break; } } } else if (!snd_config_get_string(converter, &type)) - err = rate_open_func(rate, type, 1); - else if (snd_config_get_type(converter) == SND_CONFIG_TYPE_COMPOUND) { + err = rate_open_func(rate, type, NULL, 1); + else if (is_string_array(converter)) { snd_config_iterator_t i, next; snd_config_for_each(i, next, converter) { snd_config_t *n = snd_config_iterator_entry(i); if (snd_config_get_string(n, &type) < 0) break; - err = rate_open_func(rate, type, 0); + err = rate_open_func(rate, type, NULL, 0); if (!err) break; } + } + else if (snd_config_get_type(converter) == SND_CONFIG_TYPE_COMPOUND) { + snd_config_iterator_t i, next; + snd_config_for_each(i, next, converter) { + snd_config_t *n = snd_config_iterator_entry(i); + const char *id; + snd_config_get_id(n, &id); + if (strcmp(id, "name") != 0) + continue; + snd_config_get_string(n, &type); + break; + } + if (!type) { + SNDERR("No name given for rate converter"); + return -EINVAL; + } + err = rate_open_func(rate, type, converter, 1); } else { SNDERR("Invalid type for rate converter"); snd_pcm_free(pcm); @@ -1439,6 +1502,11 @@ pcm.name { converter [ STR1 STR2 ... ] # optional # Converter type, default is taken from # defaults.pcm.rate_converter + # or + converter { # optional + name STR # Convertor type + xxx yyy # optional convertor-specific configuration + } } \endcode -- 2.5.5