mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.8 KiB
113 lines
3.8 KiB
============================================== |
|
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. |
|
|
|
A dai_link in a "simple-audio-card" will automatically be detected as |
|
codec to codec when all DAIs on the link belong to codec components. |
|
The dai_link will be initialized with the subset of stream parameters |
|
(channels, format, sample rate) supported by all DAIs on the link. Since |
|
there is no way to provide these parameters in the device tree, this is |
|
mostly useful for communication with simple fixed-function codecs, such |
|
as a Bluetooth controller or cellular modem.
|
|
|