Re: [PATCH v0] ASoC: rsnd: core: Check convert rate in rsnd_hw_params

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on asoc/for-next]
[also build test WARNING on v5.10-rc6 next-20201201]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/mdurnev-gmail-com/ASoC-rsnd-core-Check-convert-rate-in-rsnd_hw_params/20201202-191131
base:   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
config: riscv-allyesconfig (attached as .config)
compiler: riscv64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/2ffb6c8ec578fd78d5962f7bc7c38eeb5c6a4bd1
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review mdurnev-gmail-com/ASoC-rsnd-core-Check-convert-rate-in-rsnd_hw_params/20201202-191131
        git checkout 2ffb6c8ec578fd78d5962f7bc7c38eeb5c6a4bd1
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=riscv 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>

All warnings (new ones prefixed by >>):

   sound/soc/sh/rcar/core.c: In function 'rsnd_hw_params':
>> sound/soc/sh/rcar/core.c:1442:4: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
    1442 |    int k_up = 6;
         |    ^~~
   sound/soc/sh/rcar/core.c:1447:56: error: 'fe_channel' undeclared (first use in this function); did you mean 'channel'?
    1447 |    channel = io->converted_chan ? io->converted_chan : fe_channel;
         |                                                        ^~~~~~~~~~
         |                                                        channel
   sound/soc/sh/rcar/core.c:1447:56: note: each undeclared identifier is reported only once for each function it appears in
>> sound/soc/sh/rcar/core.c:1460:8: warning: this statement may fall through [-Wimplicit-fallthrough=]
    1460 |     if (channel > 4) {
         |        ^
   sound/soc/sh/rcar/core.c:1464:4: note: here
    1464 |    case 0:
         |    ^~~~

vim +1442 sound/soc/sh/rcar/core.c

  1391	
  1392	/*
  1393	 *		pcm ops
  1394	 */
  1395	static int rsnd_hw_params(struct snd_soc_component *component,
  1396				  struct snd_pcm_substream *substream,
  1397				  struct snd_pcm_hw_params *hw_params)
  1398	{
  1399		struct snd_soc_dai *dai = rsnd_substream_to_dai(substream);
  1400		struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
  1401		struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
  1402		struct snd_soc_pcm_runtime *fe = asoc_substream_to_rtd(substream);
  1403	
  1404		/*
  1405		 * rsnd assumes that it might be used under DPCM if user want to use
  1406		 * channel / rate convert. Then, rsnd should be FE.
  1407		 * And then, this function will be called *after* BE settings.
  1408		 * this means, each BE already has fixuped hw_params.
  1409		 * see
  1410		 *	dpcm_fe_dai_hw_params()
  1411		 *	dpcm_be_dai_hw_params()
  1412		 */
  1413		io->converted_rate = 0;
  1414		io->converted_chan = 0;
  1415		if (fe->dai_link->dynamic) {
  1416			struct rsnd_priv *priv = rsnd_io_to_priv(io);
  1417			struct device *dev = rsnd_priv_to_dev(priv);
  1418			struct snd_soc_dpcm *dpcm;
  1419			struct snd_pcm_hw_params *be_params;
  1420			int stream = substream->stream;
  1421	
  1422			for_each_dpcm_be(fe, stream, dpcm) {
  1423				be_params = &dpcm->hw_params;
  1424				if (params_channels(hw_params) != params_channels(be_params))
  1425					io->converted_chan = params_channels(be_params);
  1426				if (params_rate(hw_params) != params_rate(be_params))
  1427					io->converted_rate = params_rate(be_params);
  1428			}
  1429			if (io->converted_chan)
  1430				dev_dbg(dev, "convert channels = %d\n", io->converted_chan);
  1431			if (io->converted_rate) {
  1432				dev_dbg(dev, "convert rate     = %d\n", io->converted_rate);
  1433	
  1434				/*
  1435				 * SRC supports convert rates from params_rate(hw_params)/k_down
  1436				 * to params_rate(hw_params)*k_up, where k_up is always 6, and
  1437				 * k_down depends on number of channels and SRC unit.
  1438				 * So all SRC units can upsample audio up to 6 times regardless
  1439				 * its number of channels. And all SRC units can downsample
  1440				 * 2 channel audio up to 6 times too.
  1441				 */
> 1442				int k_up = 6;
  1443				int k_down = 6;
  1444				int channel;
  1445				struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io);
  1446	
  1447				channel = io->converted_chan ? io->converted_chan : fe_channel;
  1448	
  1449				switch (rsnd_mod_id(src_mod)) {
  1450				/*
  1451				 * SRC0 can downsample 4, 6 and 8 channel audio up to 4 times.
  1452				 * SRC1, SRC3 and SRC4 can downsample 4 channel audio
  1453				 * up to 4 times.
  1454				 * SRC1, SRC3 and SRC4 can downsample 6 and 8 channel audio
  1455				 * no more than twice.
  1456				 */
  1457				case 1:
  1458				case 3:
  1459				case 4:
> 1460					if (channel > 4) {
  1461						k_down = 2;
  1462						break;
  1463					}
  1464				case 0:
  1465					if (channel > 2)
  1466						k_down = 4;
  1467					break;
  1468	
  1469				/* Other SRC units do not support more than 2 channels */
  1470				default:
  1471					if (channel > 2)
  1472						return -EINVAL;
  1473				}
  1474	
  1475				if (params_rate(hw_params) > io->converted_rate * k_down) {
  1476					hw_param_interval(hw_params, SNDRV_PCM_HW_PARAM_RATE)->min =
  1477						io->converted_rate * k_down;
  1478					hw_param_interval(hw_params, SNDRV_PCM_HW_PARAM_RATE)->max =
  1479						io->converted_rate * k_down;
  1480					hw_params->cmask |= SNDRV_PCM_HW_PARAM_RATE;
  1481				} else if (params_rate(hw_params) * k_up < io->converted_rate) {
  1482					hw_param_interval(hw_params, SNDRV_PCM_HW_PARAM_RATE)->min =
  1483						(io->converted_rate + k_up - 1) / k_up;
  1484					hw_param_interval(hw_params, SNDRV_PCM_HW_PARAM_RATE)->max =
  1485						(io->converted_rate + k_up - 1) / k_up;
  1486					hw_params->cmask |= SNDRV_PCM_HW_PARAM_RATE;
  1487				}
  1488	
  1489				/*
  1490				 * TBD: Max SRC input and output rates also depend on number
  1491				 * of channels and SRC unit:
  1492				 * SRC1, SRC3 and SRC4 do not support more than 128kHz
  1493				 * for 6 channel and 96kHz for 8 channel audio.
  1494				 * Perhaps this function should return EINVAL if the input or
  1495				 * the output rate exceeds the limitation.
  1496				 */
  1497			}
  1498		}
  1499	
  1500		return rsnd_dai_call(hw_params, io, substream, hw_params);
  1501	}
  1502	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx

Attachment: .config.gz
Description: application/gzip


[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux