[alsa-devel] ASoC : playback and capture counts in soc_new_pcm

JongHo Kim furmuwon at gmail.com
Tue Mar 5 08:55:51 CET 2013


2013/3/5 JongHo Kim <furmuwon at gmail.com>

> Hi I am developing the ALSA ASoC part. I has some problem.
> Now my situation must only use the cpu_dai(AP I2S IP) to half duplex.
> So, I want to allocate either a capture substream or a playback substream.
> But ASoC(soc-pcm.c) referred to the playback(capture)_channel_min of
> codec_dai
> at the calling snd_pcm_new in soc_new_pcm.
> I do not want to modify the codec_dai codes.
> As a result, hope to see below
>
> /dev/snd/pcmC0D0p
> /dev/snd/pcmC0D1c
>
> attach the ASCII schematic diagram.
>
> Slaves                          Master
> +--------------+               +-----------------+
> |I2S.0 data_out|---------------|data_in(AIF1)    |
> |I2S.0 bclk    |-------+-------|bclk             |
> |I2S.0 lrclk   |-------|--+----|lrclk            |
> +--------------+       |  |    |                 |
> +--------------+       |  |    |   AUDIO CODEC   |
> |I2S.1 bclk    |-------+  |    |                 |
> |I2S.1 lrclk   |----------+    |                 |
> |I2S.1 data_in |---------------|data_out(AIF1)   |
> +--------------+               +-----------------+
>
> attach the i2s and dai_link codes.
>
> -----------------------------------------------------------------------------
> static struct snd_soc_dai_driver board_i2s_dai_hf_playback_template = {
>  .probe = board_i2s_probe,
> .playback = {
>  .stream_name = "Playback",
> .channels_min = 1,
>  .channels_max = 2,
> .rates = SNDRV_PCM_RATE_8000_96000,
>  .formats = SNDRV_PCM_FMTBIT_S16_LE,
> },
>  .ops = &board_i2s_dai_ops,
> };
>
> static struct snd_soc_dai_driver board_i2s_dai_hf_capture_template = {
> .probe = board_i2s_probe,
>  .capture = {
> .stream_name = "Capture",
>  .channels_min = 1,
> .channels_max = 2,
>  .rates = SNDRV_PCM_RATE_8000_96000,
> .formats = SNDRV_PCM_FMTBIT_S16_LE,
>  },
> .ops = &board_i2s_dai_ops,
> };
>
> static struct snd_soc_dai_link board_dai[] = {
> {
>  .name = "audcodec_l0",
> .stream_name = "audcodec HiFi",
>  .cpu_dai_name = "board-i2s.0",
> .codec_dai_name = "audcodec-aif1",
>  .platform_name = "board-pcm-audio",
> .codec_name = "audcodec-codec",
>  .ops = &board_ops,
> },
>  {
> .name = "audcodec_l1",
>  .stream_name = "audcodec HiFi",
> .cpu_dai_name = "board-i2s.1",
>  .codec_dai_name = "audcodec-aif1",
> .platform_name = "board-pcm-audio",
>  .codec_name = "audcodec-codec",
> .ops = &board_ops,
>  },
> };
>
> -----------------------------------------------------------------------------
>
> So, I suggest the next diff.
>
> --- a/sound/soc/soc-pcm.c
> +++ b/sound/soc/soc-pcm.c
> @@ -2014,9 +2014,11 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd,
> int num)
>                 if (cpu_dai->driver->capture.channels_min)
>                         capture = 1;
>         } else {
> -               if (codec_dai->driver->playback.channels_min)
> +               if (codec_dai->driver->playback.channels_min &&
> +                   cpu_dai->driver->playback.channels_min)
>                         playback = 1;
> -               if (codec_dai->driver->capture.channels_min)
> +               if (codec_dai->driver->playback.channels_min &&
> +                   cpu_dai->driver->playback.channels_min)
>                         capture = 1;
>         }
>

oh! my bad :(

--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -2014,9 +2014,11 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int
num)
                if (cpu_dai->driver->capture.channels_min)
                        capture = 1;
        } else {
-               if (codec_dai->driver->playback.channels_min)
+               if (codec_dai->driver->playback.channels_min &&
+                   cpu_dai->driver->playback.channels_min)
                        playback = 1;
-               if (codec_dai->driver->capture.channels_min)
+               if (codec_dai->driver->capture.channels_min &&
+                   cpu_dai->driver->capture.channels_min)
                        capture = 1;
        }

>
> Thanks.
>


More information about the Alsa-devel mailing list