为 ALSA dapm 创建编解码器到编解码器的 dai 链接¶
大多数情况下,音频流总是从 CPU 流向编解码器,因此您的系统看起来如下所示
--------- ---------
| | dai | |
CPU -------> codec
| | | |
--------- ---------
如果您的系统看起来如下所示
---------
| |
codec-2
| |
---------
|
dai-2
|
---------- ---------
| | dai-1 | |
CPU -------> codec-1
| | | |
---------- ---------
|
dai-3
|
---------
| |
codec-3
| |
---------
假设 codec-2 是蓝牙芯片,codec-3 连接到扬声器,并且您有以下情况:codec-2 将接收音频数据,并且用户希望通过 codec-3 播放该音频,而无需涉及 CPU。上述情况是应该使用编解码器到编解码器连接的理想情况。
您的 dai_link 在您的机器文件中应如下所示
/*
* 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_CBP_CFP,
.ignore_suspend = 1,
.c2c_params = &dsp_codec_params,
.num_c2c_params = 1,
},
{
.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_CBP_CFP,
.ignore_suspend = 1,
.c2c_params = &dsp_codec_params,
.num_c2c_params = 1,
},
以上代码片段来自 sound/soc/samsung/speyside.c。
请注意“c2c_params”回调,它让 dapm 知道此 dai_link 是编解码器到编解码器的连接。
在 dapm 核心中,在 cpu_dai 播放小部件和 codec_dai 捕获小部件之间为播放路径创建一条路由,反之亦然对于捕获路径。 为了触发上述路由,DAPM 需要找到一个有效的端点,该端点可以是分别对应于播放和捕获路径的 sink 或 source 小部件。
为了触发此 dai_link 小部件,可以创建一个用于扬声器放大器的精简编解码器驱动程序,如 wm8727.c 文件中所示,即使它不需要控制,它也会为设备设置适当的约束。
请确保命名您对应的 CPU 和编解码器播放和捕获 dai 名称,分别以“Playback”和“Capture”结尾,因为 dapm 核心将根据名称链接和供电这些 dai。
当链接上的所有 DAI 都属于编解码器组件时,“simple-audio-card”中的 dai_link 将自动被检测为编解码器到编解码器。 dai_link 将使用链接上所有 DAI 支持的流参数(通道、格式、采样率)的子集进行初始化。 由于无法在设备树中提供这些参数,因此这主要适用于与简单的固定功能编解码器(例如蓝牙控制器或蜂窝调制解调器)的通信。