109 lines
3.4 KiB
ReStructuredText
109 lines
3.4 KiB
ReStructuredText
|
==============================================
|
||
|
Creating codec to codec dai link for ALSA dapm
|
||
|
==============================================
|
||
|
|
||
|
Mostly the flow of audio is always from CPU to codec so your system
|
||
|
will look as below:
|
||
|
::
|
||
|
|
||
|
--------- ---------
|
||
|
| | dai | |
|
||
|
CPU -------> codec
|
||
|
| | | |
|
||
|
--------- ---------
|
||
|
|
||
|
In case your system looks as below:
|
||
|
::
|
||
|
|
||
|
---------
|
||
|
| |
|
||
|
codec-2
|
||
|
| |
|
||
|
---------
|
||
|
|
|
||
|
dai-2
|
||
|
|
|
||
|
---------- ---------
|
||
|
| | dai-1 | |
|
||
|
CPU -------> codec-1
|
||
|
| | | |
|
||
|
---------- ---------
|
||
|
|
|
||
|
dai-3
|
||
|
|
|
||
|
---------
|
||
|
| |
|
||
|
codec-3
|
||
|
| |
|
||
|
---------
|
||
|
|
||
|
Suppose codec-2 is a bluetooth chip and codec-3 is connected to
|
||
|
a speaker and you have a below scenario:
|
||
|
codec-2 will receive the audio data and the user wants to play that
|
||
|
audio through codec-3 without involving the CPU.This
|
||
|
aforementioned case is the ideal case when codec to codec
|
||
|
connection should be used.
|
||
|
|
||
|
Your dai_link should appear as below in your machine
|
||
|
file:
|
||
|
::
|
||
|
|
||
|
/*
|
||
|
* this pcm stream only supports 24 bit, 2 channel and
|
||
|
* 48k sampling rate.
|
||
|
*/
|
||
|
static const struct snd_soc_pcm_stream dsp_codec_params = {
|
||
|
.formats = SNDRV_PCM_FMTBIT_S24_LE,
|
||
|
.rate_min = 48000,
|
||
|
.rate_max = 48000,
|
||
|
.channels_min = 2,
|
||
|
.channels_max = 2,
|
||
|
};
|
||
|
|
||
|
{
|
||
|
.name = "CPU-DSP",
|
||
|
.stream_name = "CPU-DSP",
|
||
|
.cpu_dai_name = "samsung-i2s.0",
|
||
|
.codec_name = "codec-2,
|
||
|
.codec_dai_name = "codec-2-dai_name",
|
||
|
.platform_name = "samsung-i2s.0",
|
||
|
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
||
|
| SND_SOC_DAIFMT_CBM_CFM,
|
||
|
.ignore_suspend = 1,
|
||
|
.params = &dsp_codec_params,
|
||
|
},
|
||
|
{
|
||
|
.name = "DSP-CODEC",
|
||
|
.stream_name = "DSP-CODEC",
|
||
|
.cpu_dai_name = "wm0010-sdi2",
|
||
|
.codec_name = "codec-3,
|
||
|
.codec_dai_name = "codec-3-dai_name",
|
||
|
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
||
|
| SND_SOC_DAIFMT_CBM_CFM,
|
||
|
.ignore_suspend = 1,
|
||
|
.params = &dsp_codec_params,
|
||
|
},
|
||
|
|
||
|
Above code snippet is motivated from sound/soc/samsung/speyside.c.
|
||
|
|
||
|
Note the "params" callback which lets the dapm know that this
|
||
|
dai_link is a codec to codec connection.
|
||
|
|
||
|
In dapm core a route is created between cpu_dai playback widget
|
||
|
and codec_dai capture widget for playback path and vice-versa is
|
||
|
true for capture path. In order for this aforementioned route to get
|
||
|
triggered, DAPM needs to find a valid endpoint which could be either
|
||
|
a sink or source widget corresponding to playback and capture path
|
||
|
respectively.
|
||
|
|
||
|
In order to trigger this dai_link widget, a thin codec driver for
|
||
|
the speaker amp can be created as demonstrated in wm8727.c file, it
|
||
|
sets appropriate constraints for the device even if it needs no control.
|
||
|
|
||
|
Make sure to name your corresponding cpu and codec playback and capture
|
||
|
dai names ending with "Playback" and "Capture" respectively as dapm core
|
||
|
will link and power those dais based on the name.
|
||
|
|
||
|
Note that in current device tree there is no way to mark a dai_link
|
||
|
as codec to codec. However, it may change in future.
|