Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp3128260pxj; Mon, 17 May 2021 18:31:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyEtkDP8cjhqVNXU8Wm7ULO+A134fCgcvMuypFA0RSToOwclzXPBq6A2aKHGvIaC4oAL7G7 X-Received: by 2002:a92:2a0a:: with SMTP id r10mr2176119ile.274.1621301484662; Mon, 17 May 2021 18:31:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621301484; cv=none; d=google.com; s=arc-20160816; b=GSSHk16EzeiioPNixYICQZiFmfySkzVkgdg+wM3steyTHq4qFAsIiFd80lKidzctfL 0X0qkZe9itBOdljTjvmKZZKSauoQAUXtvQZM69u2AEu3NpSsnK7RzZ5tI7sG+tCQdoyW 0cZ2ZYFaGfthd2tpaWCdWydebO/JHiV+vnqxYa1PeX8aTH+eEKEoNQtzaYOv/Op7GxBQ Lk4ObmVUT2LKf84RuJjZIv9DxxU2bZEijl/38c3Jsb8Yj2fzmRMmIuQ8oNSEfz1PvccA xvE5c1Mm605S4Vd+5ras5Vtq3eXaeqZ3rDQ5tB8Zoe5b8u2oUTmXUVTtYIRsBcWTofoQ KIdQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=tbZw4vvg6WqC0qcC11mcxXM9ysilWw6DjxKNH/9Z8S0=; b=eGosCUbYMPeviEK8PM6edRCIZ9X00LvCfyxPRpqNz2YC93kVkxPB/DYIylR77AQ/n6 3pybUB+i6q8bAXeidnJDtAetA1ah8vC/HAEKdfB2eW/zrwlpCDkVxCkU7de3s6WvYTZJ RnCe9iyFvMAf4zQKMP1ZaornZF55o7CfrYqwRb5hTwa1PdZw/2271KZPPAnMSfHypO3A W67l9rxlVEQ3Klv/jbcAnXpsauaf/9Z+aqNofWd6H2D3Kq+qhsJ22NbACo2kfn0sYoQL 9mC+iqLbQnVsnUw92sr6d1RX2By55a3F2CYd2Bc9k/d10hv+1bYplcmHcy0ejJ34bTXm qo8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=G+YRt5pD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r25si19649414jai.80.2021.05.17.18.31.12; Mon, 17 May 2021 18:31:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=G+YRt5pD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240092AbhEQOeA (ORCPT + 99 others); Mon, 17 May 2021 10:34:00 -0400 Received: from mail.kernel.org ([198.145.29.99]:54920 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239719AbhEQO2r (ORCPT ); Mon, 17 May 2021 10:28:47 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id D5B5E6162D; Mon, 17 May 2021 14:14:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1621260878; bh=BMgVRc07yMdSNpu4EtODLQluJHjs8aTrZ8NbIbKt+d4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=G+YRt5pDPHXMRRSMUf69hBiXuOi3B4YtnjnVnjpvZjBYiAknzpiVGVS7nKu9XkpiY N1a+xJwLPUB12mwPzTNydMAy3XZoW3wPM5ZDbAqizEKZB3epYlbvAUA4hXbe7vHWqA aM9uYF0tTK7wXu5ZAHu2QfMjD2+mxwf14CSBIqlo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mikhail Durnev , Mark Brown , Sasha Levin Subject: [PATCH 5.11 026/329] ASoC: rsnd: core: Check convert rate in rsnd_hw_params Date: Mon, 17 May 2021 15:58:57 +0200 Message-Id: <20210517140302.931600567@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210517140302.043055203@linuxfoundation.org> References: <20210517140302.043055203@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mikhail Durnev [ Upstream commit 19c6a63ced5e07e40f3a5255cb1f0fe0d3be7b14 ] snd_pcm_hw_params_set_rate_near can return incorrect sample rate in some cases, e.g. when the backend output rate is set to some value higher than 48000 Hz and the input rate is 8000 Hz. So passing the value returned by snd_pcm_hw_params_set_rate_near to snd_pcm_hw_params will result in "FSO/FSI ratio error" and playing no audio at all while the userland is not properly notified about the issue. If SRC is unable to convert the requested sample rate to the sample rate the backend is using, then the requested sample rate should be adjusted in rsnd_hw_params. The userland will be notified about that change in the returned hw_params structure. Signed-off-by: Mikhail Durnev Link: https://lore.kernel.org/r/1615870055-13954-1-git-send-email-mikhail_durnev@mentor.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/sh/rcar/core.c | 69 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c index 6e670b3e92a0..289928d4c0c9 100644 --- a/sound/soc/sh/rcar/core.c +++ b/sound/soc/sh/rcar/core.c @@ -1428,8 +1428,75 @@ static int rsnd_hw_params(struct snd_soc_component *component, } if (io->converted_chan) dev_dbg(dev, "convert channels = %d\n", io->converted_chan); - if (io->converted_rate) + if (io->converted_rate) { + /* + * SRC supports convert rates from params_rate(hw_params)/k_down + * to params_rate(hw_params)*k_up, where k_up is always 6, and + * k_down depends on number of channels and SRC unit. + * So all SRC units can upsample audio up to 6 times regardless + * its number of channels. And all SRC units can downsample + * 2 channel audio up to 6 times too. + */ + int k_up = 6; + int k_down = 6; + int channel; + struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io); + dev_dbg(dev, "convert rate = %d\n", io->converted_rate); + + channel = io->converted_chan ? io->converted_chan : + params_channels(hw_params); + + switch (rsnd_mod_id(src_mod)) { + /* + * SRC0 can downsample 4, 6 and 8 channel audio up to 4 times. + * SRC1, SRC3 and SRC4 can downsample 4 channel audio + * up to 4 times. + * SRC1, SRC3 and SRC4 can downsample 6 and 8 channel audio + * no more than twice. + */ + case 1: + case 3: + case 4: + if (channel > 4) { + k_down = 2; + break; + } + fallthrough; + case 0: + if (channel > 2) + k_down = 4; + break; + + /* Other SRC units do not support more than 2 channels */ + default: + if (channel > 2) + return -EINVAL; + } + + if (params_rate(hw_params) > io->converted_rate * k_down) { + hw_param_interval(hw_params, SNDRV_PCM_HW_PARAM_RATE)->min = + io->converted_rate * k_down; + hw_param_interval(hw_params, SNDRV_PCM_HW_PARAM_RATE)->max = + io->converted_rate * k_down; + hw_params->cmask |= SNDRV_PCM_HW_PARAM_RATE; + } else if (params_rate(hw_params) * k_up < io->converted_rate) { + hw_param_interval(hw_params, SNDRV_PCM_HW_PARAM_RATE)->min = + (io->converted_rate + k_up - 1) / k_up; + hw_param_interval(hw_params, SNDRV_PCM_HW_PARAM_RATE)->max = + (io->converted_rate + k_up - 1) / k_up; + hw_params->cmask |= SNDRV_PCM_HW_PARAM_RATE; + } + + /* + * TBD: Max SRC input and output rates also depend on number + * of channels and SRC unit: + * SRC1, SRC3 and SRC4 do not support more than 128kHz + * for 6 channel and 96kHz for 8 channel audio. + * Perhaps this function should return EINVAL if the input or + * the output rate exceeds the limitation. + */ + } } return rsnd_dai_call(hw_params, io, substream, hw_params); -- 2.30.2